2010-12-03 26 views
0

私のチームのメンバーの中には、今日のパスワードの保存と一般的なセキュリティの問題が議論されていました。とにかく、GPU加速型のブルートフォース攻撃と従来のCPUのみの実装との比較を簡単に説明しました。並べ替えの生成

これは私の興味を引いたので、いくつかのコードで遊ぶことにしました。私はこのようなことは一度も書かなかったので、シンプルな(CPUのみの)ブルートフォーザを書くことにしました。私の最初の実装では、固定長(4桁)のパスワードを扱っていました。テスト目的のために、私はそれを実装しました:

for(char a = '0'; a <= '9'; ++a) 
{ 
    for(char b = '0'; b <= '9'; ++b) 
    { 
    for(char c = '0'; c <= '9'; ++c) 
    { 
     for(char d = '0'; d <= '9'; ++d) 
     { 
     candidate[0] = a; candidate[1] = b; 
     candidate[2] = c; candidate[3] = d; 

     // Test 'candidate'... 
     } 
    } 
    } 
} 

これはうまくいくが、明らかに柔軟性がない。パスワードの長さを扱うために上記を一般化しようとしましたが、失敗しました。何らかの理由で、私は、これらのブルートフォーザーが "アルファベット"を与えられた1-n文字の可能性を実行するために使用するロジックの周りに頭を浮かべることはできません。

これを達成するためのいくつかの一般的なアルゴリズムはありますか?例を歓迎します。

+6

あなたが探している概念が呼び出された[再帰](http://en.wikipedia.org/wiki/Recursion):) –

+0

重複 - http://stackoverflow.com/q/3183469/21727 – mbeckish

+0

probあなたはn個の入れ子にされたループを持つべきですが、nは実行時にしか知りません... =/ – BlackBear

答えて

0

です。ここ小文字のみのための次の作品は....反復バージョンだが、簡単に修正することができます....

public static String nextLexographicWord(String txt) 
{ 
    char [] letters = txt.toCharArray(); 
    int l = letters .length - 1; 
    while(l >= 0) 
    { 
     if(letters[l] == 'z') 
      letters[l] = 'a'; 
     else 
     { 
      letters[l]++; 
      break; 
     } 
     l--; 
    } 
    if(l < 0) return 'a' + (new String(letters)); 
    return new String(letters); 
} 
+0

これはJava、btw ....です – st0le