Почему функция шифрования 'crypt ()' не принимает мой одноразовый номер, хотя одноразовый номер является допустимой двухсимвольной длинной строкой? - PullRequest
0 голосов
/ 18 мая 2018

Я хочу, чтобы моя программа извлекала первые два символа данного хэша 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);
}

1 Ответ

0 голосов
/ 19 мая 2018

Я думаю, это помогает заменить

string hash = "14dJperBYV6zU";
char nonceAsArray[2];

for (int i = 0; i < 2; i++)
{
    nonceAsArray[i] = hash[i];
}

string nonce = concatenateCharacters(nonceAsArray, 2);

на

#define NONCE_MAX (2);

string hash = "14dJperBYV6zU";
char nonceAsArray[NONCE_MAX + 1] = ""; /* zeros out all nonceAsArray */
strncpy(nonceAsArray, hash, NONCE_MAX);
string nonce = nonceAsArray;
...