[英]Returning wrong MD5 hash in C
我正在嘗試使用原始/未觸摸的md5.h和來自http://www.arp.harvard.edu的 md5c.c為字符串“Hello World”生成MD5哈希。 但是我的結果與我測試的所有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";
通過
const char s[64] = "Hello World";
編輯 :
在MD5實現中存在與可移植性相關的第二個問題。 在md5.h
有這種類型的別名:
typedef unsigned long int UINT4;
在Linux x86_64系統(您正在使用)上,必須將其更改為:
typedef unsigned int UINT4;
您有填充問題。 MD5哈希算法適用於512位塊。 當最后一個塊小於512位時,需要填充。 在您的示例中,第一個塊也是最后一個塊,因為它小於512位。
填充格式稱為Merkle-Damgård構造 。
你可以在這里找到一些包含填充的偽代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.