MD5输出第一轮后不同

MD5 output different after the first round

提问人:rocky 提问时间:11/16/2023 最后编辑:chux - Reinstate Monicarocky 更新时间:11/16/2023 访问量:40

问:

我正在测试MD5算法,代码如下:

int main(int argc, char **argv) {
    char *msg;
    size_t len;
    int i;
    uint8_t result[16];

    uint8_t buf[16];
    msg = "md5_5_times";
    len = strlen(msg);
    md5((uint8_t*)msg, len, result);

    // display result
    for (i = 0; i < 16; i++)
        printf("%2.2x", result[i]);
    puts("");

    for (i = 0; i < 4; i++) {
        memmove(buf, result, 16);
        md5((uint8_t*)buf, 16, result);
        memset(buf, 0, sizeof(buf));
        for (int j = 0; j < 16; j++)
            printf("%2.2x", result[j]);
        puts("");
    }
    return 0;
}

第一轮的输出与在线 MD5 计算器的结果相同。但是,for 循环中四轮的输出是不同的。我怀疑原因是for循环中的输入数据是十六进制字符串,而第一轮中的输入数据是ASCII字符串。

如何修改代码以解决此问题?

哈希结果:

7e9dbd24e91a4575a1d176ef0d370579
...
44fd5a924a76097b23511cae0774de56
2e7e0b54e065fe5e29a77ccb415ae2ee
797f5799a539a18a8369da5fd23ea71c
C 六角 MD5

评论

1赞 KompjoeFriek 11/16/2023
for 循环中的输入数据不是十六进制字符串(32 字节),而是 16 字节。您是否通过计算十六进制表示的 MD5 哈希来检查正确性?您可以在此处在线重复计算 MD5 哈希值:cryptii.com/pipes/md5-hash
1赞 nielsen 11/16/2023
OT:当缓冲区不相交时,可以使用代替。调用没有任何目的。memcpymemmovememset
0赞 chux - Reinstate Monica 11/17/2023
@rocky Detail: “while the input data in the first round is a ASCII string.” --> 不完全是字符串。With 不处理 中的空字符。预期结果与 相同。在这种情况下,不是字符串,因为它缺少 null 字符len = strlen(msg); md5((uint8_t*)msg, len, result);md5()msgchar msg[11] = "md5_5_times"; md5((uint8_t*)msg, 11, result);msg
0赞 chux - Reinstate Monica 11/17/2023
@rocky “但是,for 循环中四轮的输出是不同的。” --> 发布用于在线 MD5 计算器的确切输入。它像你的代码一样是 16 个字节吗?
0赞 chux - Reinstate Monica 11/17/2023
@rocky “for 循环中的输入数据是十六进制字符串” --> 在发布的代码中,使用的输入不是 32 个字符的十六进制字符串,而是 16 个字节的数组。

答: 暂无答案