Я хочу, чтобы моя программа извлекала первые два символа данного хэша hash
.Эти первые два символа представляют одноразовый номер / соль, с которым был зашифрован пароль (на основе DES, функция crypt()
).Первые два символа hash
хранятся в массиве nonceAsArray[]
, который передается в функцию concatenateCharacters()
, задачей которой является преобразовать эти символы в одноразовый номер типа string
и сохранить его в переменнойnonce
, чтобы впоследствии его можно было использовать для шифрования пароля.
Кажется, что функция отлично объединяет два символа.Однако, когда nonce
передается функции crypt()
в качестве аргумента, она возвращает null , но только, если я вычислю оба значения, generatedHash1
и generatedHash2
:
Вывод:
generateHash1: 14dJperBYV6zU
generateHash2: (null)
Однако, когда я исключаю вычисление первого хеша string generatedHash1 = crypt("myPassword", "14");
, моя программавыводит следующее:
generateHash2: dJperBYV6zU
Функция crypt()
теперь, кажется, приняла значение, которое хранится в nonce
.Еще одна странность состоит в том, что crypt()
возвращает хэш без одноразового номера, представленного в первых двух символах generatedHash2
.Однако зашифрованный пароль должен содержать не более 13 символов.
Запустил отладчик и проверил значения, которые хранятся в nonce
.Я наткнулся на это:
nonce: 0x7fffffffdd40 "14"
и
* nonce: 49 '1'
Iпредположим, что первая часть, которая начинается с 0x7f...
, является адресом памяти, а рядом с ним находится значение, хранящееся по этому адресу.
Может кто-нибудь помочь мне понять, почему функция crypt()
не отображаетсяпринять значение в nonce
?Я был бы очень признателен, если бы кто-нибудь дал мне подсказку, где искать или объяснение, почему это не удается.
(...)
#include <cs50.h>
#include <string.h>
(...)
// extract the first two characters of 'hash' (== nonce/salt)
string hash = "14dJperBYV6zU";
char nonceAsArray[2];
for (int i = 0; i < 2; i++)
{
nonceAsArray[i] = hash[i];
}
string nonce = concatenateCharacters(nonceAsArray, 2);
printf("first hash: %s\n", crypt("myPassword", "14"));
printf("second hash: %s\n", crypt("myPassword", nonce));
// connects characters to strings
string concatenateCharacters(char characters[], int arraySize)
{
char terminator[1] = {'\0'};
// create array that can store the password and to which the terminator can be appended (hence +1)
char bigEnoughArray[arraySize + 1];
for (int i = 0; i < arraySize; i++)
{
bigEnoughArray[i] = characters[i];
}
return strcat(bigEnoughArray, terminator);
}