我正在尝试为字符串生成 MD5 哈希值“你好世界”使用原始/未修改的 md5.h 和md5c.c http://www.arp.harvard.edu/eng/das/manuals/QNX6libs/md5c_8c_source.html from http://www.arp.harvard.edu http://www.arp.harvard.edu。但我的结果与我测试过的所有 md5 在线工具不同。这段代码有什么问题吗?谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"
void MD5hash(unsigned char *data, unsigned int dataLen, unsigned char *digest) {
MD5_CTX c;
MD5Init(&c);
MD5Update(&c, data, dataLen);
MD5Final(digest, &c);
}
int main(int argc, const char * argv[]) {
unsigned char digest[16];
const char *s = "Hello World";
unsigned int l = (unsigned int)strlen(s);
MD5hash((unsigned char *)s, l, digest);
for(int i = 0; i < 16; ++i)
printf("%02x", digest[i]);
return 0;
}
// My result: f2877a72c40494318c4b050bb436c582
// But online tools output: b10a8db164e0754105b7a99be72e3fe5
正如@vipw 提到的,填充存在问题。此 MD5 实现无法正确管理不是 MD5 块大小(512 位/64 字节)倍数的消息大小的填充。
要将其修复在您这边,请替换:
const char *s = "Hello World";
by
const char s[64] = "Hello World";
EDIT:
MD5 实现中存在与可移植性相关的第二个问题。在md5.h
有这样的类型别名:
typedef unsigned long int UINT4;
在 Linux x86_64 系统(您正在使用的)上,必须将其更改为:
typedef unsigned int UINT4;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)