MD5 строки дает неправильный вывод в C - PullRequest
0 голосов
/ 15 сентября 2018

Мой вопрос похож на этот здесь , но я использую openssl / md5.h

Я пытаюсь получить пользовательский ввод и найти его хэш MD5. Вот мой код:

#include <stdio.h>
#include <openssl/md5.h>
#include <stdlib.h>
#include <string.h>

void MD5hash(unsigned char *data, unsigned int dataLen, unsigned char *digest) {
    MD5_CTX c;
    MD5_Init(&c);
    MD5_Update(&c, data, dataLen);
    MD5_Final(digest, &c);
}

int main(){
    unsigned char md5_hash[MD5_DIGEST_LENGTH];
    char *input = NULL;
    int i, read;
    size_t len; 

    printf("Enter the password: ");
    read = getline(&input, &len, stdin);

    unsigned int str_length = (unsigned int)strlen(input);
    if(-1 != read)
        puts(input);
    else
        printf("Received no input\n");

    printf("Size read: %d Len: %zu String Length: %u\n", read, len, str_length);

    MD5hash((unsigned char *)input, str_length, md5_hash);

    printf("MD5 hash is: ");
    for(i = 0; i < MD5_DIGEST_LENGTH; i++){
        printf("%02x", md5_hash[i]);
    } 
    printf("\n");
    free(input);

    return 0;
}

Этот код компилируется и успешно запускается на моем Mac. Когда я даю 12345 в качестве входных данных для двоичного файла, я получаю вывод d577273ff885c3f84dadb8578bb41399:

 $ ./md5code
 Enter the password: 12345
 12345

 Size read: 6 Len: 8
 String Length: 6
 MD5 hash is: d577273ff885c3f84dadb8578bb41399     

Однако, когда я запускаю md5 -s 12345, я получаю вывод 827ccb0eea8a706c4c34a16891f84e7b, который также получается, когда я проверяю MD5 с помощью онлайн-инструментов.

Сначала я думал, что это из-за терминатора NULL, поэтому я вычислил MD5 строки с ними:

$ md5 -s 12345
MD5 ("12345") = 827ccb0eea8a706c4c34a16891f84e7b
$md5 -s "12345\0"
MD5 ("12345\0") = b04fd4a8d62d25c4b69616ba7f5c5092
$md5 -s 12345\0
MD5 ("123450") = 149787a6b7986f31b3dcc0e4e857cd2a
$md5 -s "12345 "
MD5 ("12345 ") = 43d6757765116456c1c49310cbf8070d
$ md5 -s "12345\n"
MD5 ("12345\n") = 5d44fc965c76c70d2ebe72b4129bc0cd

Как видите, ни один из MD5 не соответствует тому, что я получаю из своего кода. Может кто-нибудь помочь мне разобраться в чем дело и как это исправить? Спасибо!

Примечание: Я хорошо знаю, что MD5 - очень слабый и сломанный хеш, и его не следует использовать ни для каких реальных целей. Я делаю это только для того, чтобы понять основы кодирования.

1 Ответ

0 голосов
/ 15 сентября 2018

Посмотрите на вывод этих двух команд OpenSSL (которые вы также можете заменить на команды openssl dgst -md5, чтобы получить тот же вывод):

$ md5 <(echo 12345)
MD5 (/dev/fd/63) = d577273ff885c3f84dadb8578bb41399
$ md5 <(printf 12345)
MD5 (/dev/fd/63) = 827ccb0eea8a706c4c34a16891f84e7b

Последний - тот, кого вы ищете. Разница между echo и printf заключается в том, что первый добавляет новую строку, а второй нет:

$ hexdump -C <(echo 12345)
00000000  31 32 33 34 35 0a                                 |12345.|
00000006
$ hexdump -C <(printf 12345)
00000000  31 32 33 34 35                                    |12345|
00000005

Так что именно 0a доставляет вам неприятности.

Два дополнительных замечания: конструкция <(echo 12345) является примером Замена процесса , и вместо printf вы также можете использовать echo -n. Последнее, однако, не стандартизировано, как указано в комментарии ниже.

...