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

你的问题是字节序。十六进制的 970722017 是 39dc0ae1 而不是 e10adc39。不同的是4个字节的顺序。一个 4 字节的整数既可以是最低有效字节,也可以是其他最高有效字节,这取决于您运行的系统。

换句话说,与顺序字节串相比,您在 4byte int 中的字节排列是向后的。

根据您在做什么,您的 md5 实际上是: 39dc0ae1ab59ba4957e056de3e880ff2

于 2012-10-18T00:28:34.993 回答