0

文字列を MD5 に変換する関数があります。

if(snprintf(target, 7, "123456") == -1){
    errx(1, "snprintf");            
}

uint a[4];
char w[64] = {0};

strncpy(w, target, 56);

md5_prep(w);
md5_cpu((uint*)&w[0], &a[0], &a[1], &a[2], &a[3]);

printf("%llu %llu %llu %llu\n", a[0], a[1], a[2], a[3]);

このprintfは私に与えます:

970722017 2874784329 1474320062 1049104370

HEXに変換すれば問題ないので、それが正しいことはわかっています。代わりに、パスワードにMD5ハッシュがあり、これを実行しようとすると:

if(snprintf(g, 33, "e10adc3949ba59abbe56e057f20f883e") == -1){
    errx(1, "snprintf");            
}

uint a[4];

sscanf(&g[0], "%x", &a0]);
sscanf(&g[8], "%x", &a[1]); 
sscanf(&g[16], "%x", &a[2]);
sscanf(&g[24], "%x", &a[3]);

printf("%llu %llu %llu %llu\n", a[0], a[1], a[2], a[3]);

結果は次のとおりです。

4294967295 4294967295 4061104190 4061104190

両方の printfs を等しくすべきではありませんか?

私はこのスレッドから sscanf を介してこの MD5 から int への変換を行います: Converting MD5 result into an integer in C

4

1 に答える 1

1

あなたの問題はエンディアン順です。16 進数の 970722017 は、e10adc39 ではなく 39dc0ae1 です。異なるのは、4 バイトの順序です。4 バイトの整数は、最下位バイトを最初にするか、他の最上位バイトを最初にすることができます。これは、実行しているシステムによって異なります。

つまり、4 バイトの int 内のバイトの配置は、バイトの連続した文字列と比較すると逆になっています。

何をしているかにもよりますが、md5 は実際には次のようになります: 39dc0ae1ab59ba4957e056de3e880ff2

于 2012-10-18T00:28:34.993 に答える