2013-08-04 27 views
0

上次我對使用強力攻擊破解密碼需要多長時間感到好奇。我想檢查一下。在給定範圍內查找所有可能的組合鍵的算法

那麼,我應該如何實現算法,以找到給定範圍內的所有可能的組合鍵(例如15個字母)?我發現了用於排列的算法,但它們都是用給定單詞交換字母,這不是我要找的。

回答

1

假設密碼可以包含89個可能的字符(az,Az,0-9,空格和Windows鍵盤上的所有不同符號鍵)的組合,那麼這裏有82個第15個不同的組合15個字符(82 * 82 * 82 ...)。換句話說,很多。

如果您只想使用字母,並區分大寫和小寫,則會有52 ** 15個可能的15個字母的組合。如果你想在較短的字符串的可能性,以及你可以寫類似的信息(僞):

long combos = 0 

    for i = 6 TO 20   -- legal password lengths 
    combos = combos + POW(52, i) 

    print "there are " + combos.ToString() 
     + " possible passwords between 6 and 20 characters" 

要真正枚舉,並打印在C#中的排列組合,你可以這樣做:

void AddNextCharAndPrintIfDone(string pwd, int maxLen) 
    { 
    for (char c = 'a'; c < 'Z'; c++) 
    { 
     pwd = pwd + c; 
     if (pwd.Length >= maxLen) 
      System.Console.WriteLine(pwd); 
     else AddNextCharAndPrintIfDone(pwd, maxLen) 
    } 
    } 

    Main() 
    { 
    for (int i=6; i < 20; i++) 
      AddNextCharAndPrintIfDone("", i); 
    } 

不真正爲效率寫作,但如果你有足夠的內存和時間,你會得到每一個可能的排列。

+0

我想要algorihtm返回這些組合,而不是數它們;) –

+0

@MichałTabor您沒有時間或計算機內存來進行計算。我做了一個快速項目來計算排列,並提出:7,664,255,028,754,501,632。如果您每秒計算一百萬個密碼,則需要243,032 *年*來運行所有可能性。只是爲了練習,我會將算法添加到我的答案中。 – Curt

0

您可以下載php pear project math combinatoric來生成這些密碼。