0

嗨,我需要创建一个 Java SHA1 蛮力应用程序,并且需要 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.] ,但您可以将它们表示为从 0-64 或任何一个单一的数数字。这样,您可以从 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]吗?

看起来这会遍历所有的组合,但是你有一些不正确的索引值,哇,我敢打赌这需要很长时间,哈哈。

于 2011-02-27T02:58:07.200 回答
-2

如果您的字母表是 26 个字符,那么您的单词对应于从 1 到 26^6 - 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 回答