Справка по Java для Loop - PullRequest
       12

Справка по Java для Loop

0 голосов
/ 27 февраля 2011

Привет! Мне нужно создать приложение грубой силы Java SHA1, и мне нужна помощь с циклами for, чтобы создать слова для угадывания.Мне нужно угадать пароли длиной от 1 до 6 символов.Поэтому мне нужен цикл, который начинается с A ... Z, а затем AA .... AZ и т. Д. Так что добавление букв по мере продвижения.

Я использую массив Char для хранения букв от - до 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 ]

2 голосов
/ 27 февраля 2011

Возможно, вы не хотите использовать произвольно вложенные циклы для алгоритма перебора.Вместо этого смотрите на это как на подсчет в произвольном радиусе, представленном различными символами, такими как [az, AZ, 0-9 и т. Д.], Но вы могли бы представлять их как счет от, скажем, 0-64 или чего-то еще в одномцифра.Таким образом, вы можете начать с aaa, затем в конечном итоге получить aaA, а затем aa0 и, в конечном итоге, 999, если сгенерируете 3 цифры.

При таком способе расширения его до нескольких цифр потребуется изменить код.

0 голосов
/ 27 февраля 2011

После окончательного понимания вопроса (спасибо @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
    }
}
0 голосов
/ 27 февраля 2011

Если ваш алфавит состоит из 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(), чтобы сгенерировать случайные индексы в вашем алфавитном массиве.

0 голосов
/ 27 февраля 2011

Ваш индекс в letters[i] выглядит неправильно.Должно ли это быть индексом для каждого уровня цикла?Во-первых, это не должно быть letters[a]?

Похоже, что все циклы будут циклически повторяться, но у вас есть несколько неправильных значений индекса и ничего себе, держу пари, это займет много времени, LOL.

...