Besoin d’aide avec le code de la force brute pour crypt (3)

J’essaie de développer un programme en C qui “déchiffrera” le chiffrement crypt (3) utilisé par UNIX. La façon la plus naïve de le faire est de forcer, je suppose. J’ai pensé créer un tableau contenant tous les symboles qu’un mot de passe peut avoir, puis obtenir toutes les permutations possibles et les stocker dans un tableau à deux dimensions (où tous les mots de passe à 1 caractère sont enregistrés dans la première ligne, etc.) jusqu’à boucles. Y a-t-il une meilleure façon de faire cela? C’est assez brouillon avec les boucles.

    En supposant que seuls 62 caractères différents puissent être utilisés, le stockage de tous les mots de passe à 8 caractères possibles nécessite 62 ^ 8 = 198 téraoctets.

    Pour répondre à la question en boucle , voici un code pour boucler tous les mots de passe possibles d’un len donné, en utilisant les caractères d’un ensemble donné:

    int len = 3; char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int nbletters = sizeof(letters)-1; int main() { int i, entry[len]; for(i=0 ; i 

    La partie principale est la dernière pour la boucle. Dans la plupart des cas, il incrémente uniquement la première entrée et s’arrête là, car cette entrée n’a pas atteint nbletters. Si l'entrée atteint nbletter, cela signifie qu'elle doit revenir à zéro et que c'est au tour de l'entrée suivante d'être incrémentée. Il s'agit en effet d'une condition de boucle inhabituelle: la boucle continue jusqu'à ce qu'il n'y ait pas de dépassement de capacité. La mise en boucle ne se produit que dans le pire des cas: lorsque plusieurs entrées figurent sur le dernier élément.

    Imaginez le cas où le mot actuel est "zzzc". A son tour, chaque entrée est incrémentée, son débordement est détecté, il est remis à 0 et l'entrée suivante est considérée, jusqu'à la dernière entrée qui ne déborde pas, donner "000d".

    Comme les commentateurs de la question l’ont fait remarquer, vous ne disposez pas de la mémoire RAM requirejse et vous n’avez pas besoin de tout stocker.

    Couvrir les permutations dans une séquence de sorting n’est pas l’approche la plus efficace pour la détection des mots de passe, bien qu’elle soit finalement efficace.

    Une approche pour obtenir une couverture complète consiste à parcourir 0 à travers le nombre de permutations et à coder la valeur avec la taille de votre jeu de caractères en tant que base. Cela peut être adapté à la taille de votre jeu de caractères assez facilement.

    (pseudocode, mais vous avez l’idée)

    passChars = '[all characters used in this attempt]' permutationCount = 8^len(passChars) #crypt(3) only uses 8 chars output = '' for looper = 0 to permutationCount - 1 localTemp = looper while localTemp > 0 output += passchars[localTemp%len(passchars)] # % being modulus localTemp = floor(localTemp/len(passChars))
    passChars = '[all characters used in this attempt]' permutationCount = 8^len(passChars) #crypt(3) only uses 8 chars output = '' for looper = 0 to permutationCount - 1 localTemp = looper while localTemp > 0 output += passchars[localTemp%len(passchars)] # % being modulus localTemp = floor(localTemp/len(passChars))