MD5 散列时填充字符串

Padding of strings while MD5 Hashing

我正在尝试在 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

数据的长度不是以字节为单位,而是以位为单位。所以,长度不是 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 函数