Генерация перестановок - PullRequest
       35

Генерация перестановок

0 голосов
/ 03 декабря 2010

Некоторые члены моей команды обсуждали сегодня вопросы хранения паролей и общие вопросы безопасности.Как бы то ни было, обсуждение вкратце коснулось того, насколько быстрые атаки методом перебора на GPU сравниваются с традиционными реализациями только для CPU.

Это заинтересовало меня, поэтому я решил поиграться с некоторым кодом.Поскольку я никогда раньше не писал ничего подобного, я решил написать простой (только для процессора) брутфорсер.Моя первоначальная реализация имела дело с паролем фиксированной длины (4 цифры).Для целей тестирования я реализовал это а-ля:

for(char a = '0'; a <= '9'; ++a)
{
  for(char b = '0'; b <= '9'; ++b)
  {
    for(char c = '0'; c <= '9'; ++c)
    {
      for(char d = '0'; d <= '9'; ++d)
      {
        candidate[0] = a; candidate[1] = b;
        candidate[2] = c; candidate[3] = d;

        // Test 'candidate'...
      }
    }
  }
}

Это хорошо работает, но, очевидно, негибко.Я попытался обобщить вышеизложенное для обработки любой длины пароля, но не смог этого сделать.По какой-то причине я не могу разобраться с логикой, которую используют эти переборщики, чтобы пробежать через 1-символьные возможности, заданные «алфавитом».

Есть ли какой-то общий алгоритм, который позволяет вам выполнитьэтот?Любые примеры приветствуются.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Вот итерационная версия .... Следующее работает только для строчных букв, но может быть легко изменено ....

public static String nextLexographicWord(String txt)
{
    char [] letters = txt.toCharArray();
    int l = letters .length - 1;
    while(l >= 0)
    {
        if(letters[l] == 'z')
            letters[l] = 'a';
        else
        {
            letters[l]++;
            break;
        }
        l--;
    }
    if(l < 0) return 'a' + (new String(letters));
    return new String(letters); 
}
0 голосов
/ 03 декабря 2010

Поисковые системы - ваши друзья :) Пример грубой силы C ++

(прокрутите немного вниз ...)

...