Мой вопрос похож на этот здесь , но я использую 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 - очень слабый и сломанный хеш, и его не следует использовать ни для каких реальных целей. Я делаю это только для того, чтобы понять основы кодирования.