Java でブルート フォース クラッカーを作成しました。ハッシュ化された (SHA1) パスワードを指定すると、正しいパスワードが見つかるまで、特定の文字セットを反復処理します。
私の最初の文字セットは次のもので構成されています。
"0123456789abcdefghijklmnopqrstuvwxyz"
そして、次の 2 番目の文字セット:
"9876543210zyxwvutsrqponmlkjihgfedcba"
最初の文字セットは夢のように機能しますが、文字セットの順序の一部を変更するとすぐに、インデックスが範囲外であると不平を言ってプログラムがクラッシュします。私はそれがインクリメントメソッドに関係していると確信していますが、複数の文字セットを反復できるようにする必要があるという私のニーズに合わせてそれを適応させる方法がわかりません。
アイデアを提供するためのサンプルコードを次に示します。
char[] charsetA = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
char[] charsetB = "9876543210zyxwvutsrqponmlkjihgfedcba".toCharArray();
charset = charsetA; // charsetA works but not charsetB
BruteForce bf = new BruteForce(hashPassword, charset, 1);
String attempt = bf.toString();
attempt = pd.calcSha1(attempt);
while (true) {
if (attempt.equals(hashPassword)) {
System.out.println("Password Found!");
System.out.println("Password as plaintext : " + currentGuess);
break;
}
attempt = bf.toString();
currentGuess = attempt;
attempt = pd.calcSha1(attempt);
bf.increment();
}
}
private char[] cs; // Character Set
private char[] cg; // Current Guess
String hashPassword; // Password searching for
public BruteForce(String password, char[] characterSet, int guessLength) {
hashPassword = password;
cs = characterSet;
cg = new char[guessLength];
Arrays.fill(cg, cs[0]);
}
public void increment() {
int index = cg.length - 1;
//System.out.println("index = " + index);
while (index >= 0) {
if (cg[index] == cs[cs.length - 1]) {
if (index == 0) {
cg = new char[cg.length + 1];
Arrays.fill(cg, cs[0]);
break;
} else {
cg[index] = cs[0];
index--;
}
} else {
cg[index] = cs[Arrays.binarySearch(cs, cg[index]) + 1];
break;
}
}
}
編集:
可能性のある文字の最後に到達するまで、文字セット内の各文字を繰り返し処理しようとしています。そうなると、別の文字を追加して、それらの 2 つの文字の組み合わせのすべての可能性を循環させ、すべての可能性を使い果たすまで繰り返します。長さは最大 6 文字です (7 文字以上では非常に長くなります)。
上記のインクリメント関数はチュートリアルから取得しましたが、任意の文字セット入力を受け入れるようにコードを理解しようとしています。
ヒントや疑似コードは、私が求めているものです。