функция crypt в C, ломающая строку пароля в цикле for - PullRequest
0 голосов
/ 23 марта 2019

Я новичок в C, и я прошел курс CS50, чтобы выучить некоторые основы. Я пытался решить проблему, которая требует от вас простого взломщика паролей, но я столкнулся с проблемой, которая мешает мне написать функциональную программу: каждый раз, когда я вызываю функцию crypt в цикле for, она каким-то образом ломает мой пароль строка, через которую я перебираю.

Я попытался сделать копию строки пароля и передать ее в качестве аргумента в crypt; Я также попытался переместить вызов crypt в отдельную функцию и вызвать его из цикла (а также их комбинации)

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

string buildLetterDictionary();

int main(int argc, string argv[])
{
    if (argc == 2)
   {
        printf("Two arguments, starting test...\n");

        char password[2];
        string letters = buildLetterDictionary();
        for(int i = 0; i < 5; i++)
        {
            password[0] = letters[i];
            password[1] = '\0';
            printf("Password: %s\n", password);
            string hashed = crypt(password, "50");
            printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);
        }
        return 0;
    }
    else
    {
        printf("Usage: ./crack hash");
        return 1;
    }
}

string buildLetterDictionary()
{
    char letters[27];
    for(int i = 65; i < 91; i++)
    {
        letters[i-65] = i;
    }
    letters[26] = '\0';
    string letter = letters;
    return letter;
}

если я закомментирую строки:

string hashed = crypt(password, "50");
printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);

Код работает как положено и выдает результат:

A
B
C
D
E

Но если я оставлю эти строки, пароль будет напечатан как 'A' с хешем "50pe4e2XTIS / g" в первый раз, но каждый последующий раз будет напечатан как "" с хэшем "50sXZPq5euCxs"

Пожалуйста, дайте мне знать, что является основной проблемой, чтобы я мог работать над ее решением! Спасибо за любую помощь заранее!

1 Ответ

1 голос
/ 23 марта 2019

Я предполагаю, что cs50.h содержит некоторые определения, такие как псевдоним типа от char * до string, которые профессор дает вам для простоты.

Если этоtrue, тогда buildLetterDictionary() не может работать, потому что вы делаете:

char letters[27];
...
char * letter = letters;
return letter;

Это означает, что вы возвращаете адрес локальной переменной, который будет уничтожен, как только вы выйдете из функции.

...