【问题标题】:C sscanf MD5 to integer not workingC sscanf MD5 到整数不起作用
【发布时间】:2012-10-08 08:30:55
【问题描述】:

我有一个将字符串转换为 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

【问题讨论】:

    标签: c md5 scanf


    【解决方案1】:

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

    换句话说,与连续的字节串相比,4byte int 中的字节排列是向后的。

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

    【讨论】:

    • 是的,你是对的,我通过一些位移手动解决了这个字节序。
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多