2010-12-03 3 views
0

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

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

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-значные возможности персонажа с учетом «алфавита».

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

+6

понятие вы ищете называется [рекурсия] (http://en.wikipedia.org/wiki/Recursion) :) –

+0

Дубликат - http://stackoverflow.com/q/3183469/21727 – mbeckish

+0

проблема lem заключается в том, что у вас должен быть n вложенный цикл, но n известен только во время выполнения ... =/ – BlackBear

ответ

0

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

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

Это java, btw .... – st0le

Смежные вопросы