0

こんにちは私はJavaSHA1ブルートフォースアプリケーションを作成する必要があり、推測する単語を作成するためのforループのヘルプが必要です。1〜6文字の長さのパスワードを推測する必要があります。したがって、A ... Zで始まり、次にAA....AZなどで始まるループが必要です。

私はChar配列を使用して、a〜zの文字と、0〜9の数字を格納しています。これがループしています。

これが現時点での私のループです。

for (int a = 0; a<36; a++){

        guess[5] = letters[a];

         for (int b = 0; b<36; b++){

          guess[4] = letters[b];

             for (int c = 0; c<36; c++){

                    guess[3] = letters[c];

             for (int d = 0; d<36; d++){

                     guess[2] = letters[d];

                    for (int e = 0; e<36; e++){

                        guess[1] = letters[e];

                        for (int f = 0; f<36; f++){

                           guess[0] = letters[f];

ありがとう

4

4 に答える 4

2

ブルート フォース アルゴリズムに任意にネストされたループを使用したくない場合があります。代わりに、 [az, AZ, 0-9, etc.] などのさまざまな記号で表される任意の基数でカウントするものとして見てください。桁。そうすれば、aaa で始まり、最終的には aaA になり、aa0 になり、3 桁を生成する場合は最終的に 999 になります。

あなたのやり方では、それをより多くの桁に拡張するには、コードを変更する必要があります。

于 2011-02-27T02:50:00.753 に答える
0

最終的に質問を理解した後(@cHaoに感謝)、ここに私の提案があります:

for (int len = 1; len <= 6; ++len) {
    // generate all words of length 'len'
    int [] index = new int[len + 1];
    while (index[len] == 0) {
        // generate the next guess
        for (int pos = 0; pos < len; ++pos) {
            guess[pos] = letters[index[pos]];
        }
        // increment the index
        for (int pos = 0; pos < len; ++pos) {
            if (index[pos] == letters.length - 1) {
                index[pos] = 0;
                // carry to the next position
            } else {
                ++index[pos];
                break;
            }
        }
        // use guess[0] through guess[len-1] as the next word at this point
    }
}
于 2011-02-27T04:43:49.463 に答える
0

あなたのインデックスletters[i]は間違っているようです。それは各ループ レベルのインデックスである必要がありますか? 最初はそうではないletters[a]でしょうか?

それはすべてのコンボをループするように見えますが、いくつかの間違ったインデックス値があり、うわー、長い時間がかかるに違いありません.LOL.

于 2011-02-27T02:58:07.200 に答える
-2

アルファベットが 26 文字の場合、単語は 1 から 26^6 - 1 までの数字に対応します。したがって、1 つのアプローチは次のとおりです。

int val = 1 + new java.util.Random().nextInt(308915774); // [0 to 26^6 - 1)
String word = Integer.toString(val, 26).toUpperCase(); // from [0-9,A-P]
word = word.replace('0', 'Q');
// etc for '1', through '9', where '9' -> Z

0 ~ 9 (36 文字のアルファベット) を含めたい場合は、36^6 - 1 > Integer.MAX_VALUE. Random.nextInt()次に、 を使用して単語に含まれる文字数を決定し、 を使用しRandom.nextInt()てアルファベット配列にランダムなインデックスを生成することで、正確にその数を生成することをお勧めします。

于 2011-02-27T03:04:02.453 に答える