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
相关产品推荐
相关产品推荐

