簡體   English   中英

在C中返回錯誤的MD5哈希

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM