【发布时间】:2017-01-04 14:10:59
【问题描述】:
我正在尝试在 C++ 中实现 MD5 哈希函数,并为我通过一些在线网站找到的一些输入值获得正确的结果,这些值是一些十六进制值。到目前为止,我已经能够让它正常工作。然而,当我尝试用 ASCII 字符串做同样的事情时,我很不走运,无法真正理解我还应该做什么。
我所做的第一件事是将 ASCII 字符串转换为十六进制值,并在末尾附加单个 0x80 ,然后是一堆 0x00 ,最后八个字节是十六进制未附加消息的长度。
例如,“test123”用十六进制表示为“0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33”,其字节长度为7。那么用作哈希函数输入的字节数组为据我了解如下,
const uint8_t test123Array[64] = {
0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07
};
当我应用哈希函数时,我得到的结果是,
e7 54 fa ea 1e d7 69 ba 85 59 62 bf 16 e9 98 48
而我通过在线哈希生成器网站获得的结果类似于
cc 03 e7 47 a6 af bb cb f8 be 76 68 ac fe be e5
【问题讨论】:
-
0x07最后在那里做什么?这不是填充规范的一部分。 -
当有大量现有的公共领域 MD5 实现有效时,为什么要重新发明轮子? (example)
-
我在链接 ietf.org/rfc/rfc1321.txt 上找到了规范,关于填充我无法看到我做错了什么
标签: c++ hash cryptography md5