您好 我需要创建一个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];
感谢
答案 0 :(得分:2)
您可能不希望使用任意嵌套循环来实现强力算法。相反,将它视为以任意基数计数,由不同的符号表示,例如[az,AZ,0-9等],但你可以将它们表示为从0-64或其他任何单位计算数字。这样你就可以从aaa开始,然后最终以aaA结束,aa0最终结果为999,如果生成3位数。
按照您的方式,将其扩展到更多位数需要修改代码。
答案 1 :(得分:0)
您对letters[i]
的索引看起来不对。那应该是每个循环级别的索引吗?在第一个应该不是letters[a]
?
看起来这会循环遍历所有的组合,但是你有一些不正确的索引值和哇,我打赌这需要很长时间,大声笑。
答案 2 :(得分: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
}
}
答案 3 :(得分:-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()
生成字母数组中的随机索引,从而生成多少个字符。