You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MD5首轮哈希结果正常后续轮次异常,如何修改代码修复?

问题分析与修复方案

你的推测完全正确:首轮哈希的输入是ASCII字符串"md5_5_times",而在线工具后续哈希的输入是前一次结果的十六进制字符串文本,但你的代码当前是直接对前一次哈希的16字节二进制数据做哈希,两者输入完全不同,所以结果不符。

修复思路

需要将每一轮的二进制哈希结果(16字节)转换为对应的32字符十六进制字符串,再以这个字符串作为下一轮MD5的输入,这样就能和在线工具的逻辑对齐。

修改后的代码

#include <stdio.h>
#include <string.h>
#include <stdint.h>

// 假设你的md5函数声明如下
void md5(uint8_t* input, size_t len, uint8_t* output);

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

    msg = "md5_5_times";
    len = strlen(msg);
    md5((uint8_t*)msg, len, result);

    // 显示首轮结果
    for (i = 0; i < 16; i++)
        printf("%02x", result[i]);
    puts("");

    for (i = 0; i < 4; i++) {
        // 关键修改:将二进制哈希结果转换为十六进制字符串
        char hex_str[33] = {0};
        for (int j = 0; j < 16; j++) {
            sprintf(&hex_str[j*2], "%02x", result[j]);
        }

        // 对十六进制字符串做MD5哈希
        md5((uint8_t*)hex_str, strlen(hex_str), result);

        // 显示当前轮结果
        for (int j = 0; j < 16; j++)
            printf("%02x", result[j]);
        puts("");
    }
    return 0;
}

关键修改点

  • 新增hex_str缓冲区存储转换后的十六进制字符串(长度33是因为16字节对应32个十六进制字符,加1个终止符)
  • 使用sprintf将每个二进制字节转换为两位十六进制字符
  • 下一轮MD5的输入改为这个十六进制字符串,长度为字符串的实际长度(32)

这样修改后,每一轮的输入就和在线工具处理的文本输入一致,后续四轮的哈希结果就能和预期匹配。

内容的提问来源于stack exchange,提问作者rocky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:16