Как сравнить вывод crypt () с вводом строки cmd для взлома паролей в C - PullRequest
0 голосов
/ 04 января 2019

Я беру вступление cs50x в курс compi sci, и одно из упражнений - расшифровать пароль, зашифрованный с помощью функции crypt (3).

Они упростили требования, установив гипотетическое, что пароль может быть только 5 символов, и каждый символ будет заглавной или строчной буквой.

Я столкнулся с проблемой шифрования и сравнения и не уверен, как двигаться дальше.

Резюме ниже.

Я прошел все возможные вариации A-Z и a-z для A, AA, AAA, AAAA и AAAAA.

И я могу сравнить это с пользовательским вводом из argv.

Теперь я пытаюсь сделать argv хэшем и сравнить его с хэшем (возможный пароль сверху)

Где я борюсь ->

Как мне представить, код должен работать

  1. получить argv [1] и определить соль.
  2. сгенерировать пароль
  3. хеш-пароль с crypt ()
  4. сравнить хэш пароля с argv [1]
  5. если не совпадает, сгенерируйте новый пароль и повторяйте до совпадения.

Что не работает ->

хранение хэша пароля для сравнения и обновление хэша пароля новым хэшем после манипуляции.

Что я думаю, я понимаю ->

  1. Хеш хранится в виде строкового литерала.
  2. Вы не можете обновить строковые литералы.
  3. Мне нужно присвоить переменную для хранения хеша, чтобы сравнить ее с argv.

Чего мне не хватает? Что я должен прочитать, чтобы двигаться вперед?

спасибо заранее!

1 Ответ

0 голосов
/ 04 января 2019

Вы можете присвоить результат crypt(3) для char* и ссылаться на хеш из указателя:

char *compare = crypt(p, salt);
compare = crypt(p, salt);

Поскольку crypt(3) имеет свое собственное статическое пространство данных, которое будет перезаписываться при каждом обращении к нему, вы можете скопировать хэш в пространство вашей программы, используя массив char и strcpy(3)

char hash[256]; // arbitrary length, enough to store the hash without overflowing
char *compare = crypt(p, salt);
strcpy(hash, compare);

или, более кратко,

char hash[256];
strcpy(hash, crypt(p, salt));

Таким образом, hash не будет перезаписан при повторном вызове crypt(3).

Не забудьте проверить нулевой результат crypt(3) перед его использованием, так как он может вернуть нулевой указатель при ошибке.

char *compare = crypt(p, salt);
compare = crypt(p, salt);
if (compare) { // null check
    if (strcmp(compare, input) == 0) }
        printf("%s is identical to %s!", compare, input);
    } else {
        printf("%s does not match %s."), compare, input);
    }
}

Поскольку вы работаете с c-строками, и мы знаем, что они имеют нулевое завершение, можно сравнить их с помощью strcmp(3), если бы вы использовали необработанные байты или массивы char, которые не гарантированно заканчивались нулем, было бы лучше использовать memcmp(3) для сравнения.

...