我的问题类似于 this one here 但我使用的是 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 相匹配。谁能帮我找出问题所在以及如何解决?谢谢!
注意:我很清楚 MD5 是一种非常脆弱且损坏的散列,不应该用于任何实际目的。我这样做只是为了了解基本编码。
最佳答案
查看这两个 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)
构造是 Process Substitution 的一个例子而不是 printf
, 你也可以使用 echo -n
.正如下面的评论所指出的,后者并未标准化。
关于c - 字符串的 MD5 在 C 中给出了错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340233/