2010-12-03 7 views
0

Certains membres de mon équipe discutaient des problèmes de stockage de mot de passe et de sécurité générale aujourd'hui. Quoi qu'il en soit, la discussion a brièvement porté sur la façon dont les attaques par force brute accélérées par le GPU sont comparées aux implémentations traditionnelles de CPU seulement.Permutation Génération

Cela m'a intéressé, alors j'ai décidé de jouer avec du code. Comme je n'avais jamais rien écrit de tel auparavant, j'ai décidé d'écrire une simple brute-forcer. Ma mise en œuvre initiale traitait un mot de passe de longueur fixe (4 chiffres). À des fins de test, je l'ai mis en œuvre un 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'... 
     } 
    } 
    } 
} 

Cela fonctionne bien, mais est évidemment inflexible. J'ai essayé de généraliser ce qui précède pour gérer n'importe quelle longueur de mot de passe, mais je n'ai pas réussi à le faire. Pour une raison que j'ignore, je n'arrive pas à comprendre la logique que ces forceurs utilisent pour faire défiler des possibilités de caractères 1-n avec un «alphabet».

Y at-il un algorithme commun qui vous permet d'accomplir cela? Tous les exemples sont les bienvenus.

+6

Le concept que vous recherchez est appelé [récursion] (http://en.wikipedia.org/wiki/Recursion) :) –

+0

en double - http://stackoverflow.com/q/3183469/21727 – mbeckish

+0

le prob lem est que vous devriez avoir n boucle imbriquée, mais n est connu seulement à l'exécution ... =/ – BlackBear

Répondre

0

est ici une version itératives .... Les travaux suivants uniquement pour les minuscules, mais peut facilement être modifié ....

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

C'est java, btw .... – st0le