Бесконечный цикл при переборе возможных паролей

Я написал, по общему мнению, некрасивую программу для взлома паролем до 5 буквенных символов, который хэшируется функцией crypt () на основе DES, но при запуске программы возникает бесконечный цикл. Я не могу определить причину. Кто-нибудь видит, где я иду не так? Я просто спрашиваю о бесконечном цикле, хотя я, безусловно, был бы признателен за советы по альтернативам подходу с вложенным циклом.

#define _XOPEN_SOURCE
#include <unistd.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

// function to check for equality between hashed try and user-inputted hash
int check_password(string key_try, string hash);

int main(int argc, string argv[])
{
    // check for 1 command-line argument
    if (argc != 2)
    {
        printf("Usage: ./crack hash");
        return 1;
    }

    string hash = argv[1];

    // create array of all alphabetical characters, upper and lower case
    char alpha_characters[52];
    for (int i = 0; i < 26; i++)
    {
        alpha_characters[i] = i + 65;
    }
    for (int i = 0; i < 26; i++)
    {
        alpha_characters[i + 26] = i + 97;
    }

    // hash all possible passwords until hash of try matches user-inputted hash
    int password_found = 0;
    char possible_password[6];
    while (password_found == 0)
    {
        for (int j = 0; j < 52; j++)
        {
            possible_password[0] = alpha_characters[j];
            possible_password[1] = '\0';
            password_found = check_password(possible_password, hash);
            // iterate through second character
            for (int k = 0; k < 52; k++)
            {
                possible_password[1] = alpha_characters[k];
                possible_password[2] = '\0';
                password_found = check_password(possible_password, hash);
                // iterate through third character
                for (int l = 0; l < 52; l++)
                {
                    possible_password[2] = alpha_characters[l];
                    possible_password[3] = '\0';
                    password_found = check_password(possible_password, hash);
                    // iterate through fourth character
                    for (int m = 0; m < 52; m++)
                    {
                        possible_password[3] = alpha_characters[m];
                        possible_password[4] = '\0';
                        password_found = check_password(possible_password, hash);
                        // iterate through fifth character
                        for (int n = 0; n < 52; n++)
                        {
                            possible_password[4] = alpha_characters[n];
                            possible_password[5] = '\0';
                            password_found = check_password(possible_password, hash);
                        }
                    }
                }
            }

        }

    }
    return 0;
}

// check hash of possible passwords against parameter hash
int check_password(string key_try, string hash)
{
    if (strcmp(crypt(key_try, "50"), hash) == 0)
    {
        printf("%s\n", key_try);
        return 1;

    }
    else
    {
       return 0;
    }

}

2 ответа

Решение

Единственный способ, которым код завершается, - это если последний вызов password_found = check_password(possible_password, hash); в for (int n = 0; n < 52; n++) возвращает 1.


Добавить в 5 мест

password_found = check_password(possible_password, hash);
// Add some means to exit the nested loops
if (password_found) return 0;

или же...

В 5 местах

 //       v--- j,k,l,m,n
 for (int x = 0; password_found == 0 && x < 52; x++)

И удалить

// while (password_found == 0)

while(password_founds == 0) подразумевает, что если ваша программа не найдет пароль, она останется в бесконечном цикле. Чем у вас есть 5 для циклов в то время, и все они изменяют варpassword_founds поэтому вы должны отслеживать изменения, если вы хотите проверить пароли. Я рекомендую вам вставить 5 проверок в отдельную уникальную функцию.

Другие вопросы по тегам