【问题标题】:Padding of strings while MD5 HashingMD5 散列时的字符串填充
【发布时间】: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


【解决方案1】:

数据的长度不是以字节为单位,而是以位为单位。所以,长度不是 7,而是 56(0x38)。然后将此长度以Little-Endian 字节顺序编码为 64 位。

准备好的输入应该如下所示:

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, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

您链接到的specification of MD5 包含您需要了解的所有信息。仔细查看“3.2 步骤 2. 附加长度”部分和“A.3 md5c.c”部分中的Encode 函数。

【讨论】:

  • 非常感谢,我为此苦苦挣扎了很长时间,但它确实发挥了应有的作用。
  • @Artjom B. 这不是小端序吗? 0x38 是最低有效字节,在您的示例中(较低的数组索引)比更有效的字节更早。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2018-09-27
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多