6

http://www.arp.harvard.eduの元の/そのままの md5.h と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
4

2 に答える 2

5

@vipw が述べたように、パディングに問題があります。この MD5 実装は、MD5 ブロック サイズ (512 ビット / 64 バイト) の倍数ではないメッセージ サイズのパディングを正しく管理しません。

あなたの側でそれを修正するには、以下を置き換えます:

const char *s = "Hello World";

const char s[64] = "Hello World";

編集

この MD5 実装には、移植性に関連する 2 つ目の問題がありました。このmd5.h型エイリアスがあります:

typedef unsigned long int UINT4;

Linux x86_64 システム (使用している) では、これを次のように変更する必要があります。

typedef unsigned int UINT4;
于 2013-04-08T09:43:37.000 に答える
1

パディングに問題があります。MD5 ハッシュ アルゴリズムは 512 ビット ブロックで機能します。最終ブロックが 512 ビット未満の場合は、パディングする必要があります。あなたの例では、最初のブロックは 512 ビット未満であるため、最後のブロックでもあります。

パディングは、 Merkle–Damgård 構造と呼ばれる形式です。

パディングを含む疑似コードをここで見つけることができます。

于 2013-04-08T09:36:19.727 に答える