我试图了解MD5哈希算法是如何工作的,并且已经阅读了Wikipedia article。
在一条消息附加消息后,消息的长度(以位为单位)与448 mod 512一致,一个应该是
append length mod (2 pow 64) to message
根据我的理解,这意味着附加64位代表消息长度的消息。我对如何做到这一点感到有点困惑。
我的第一个问题是:这是原始未播放消息的长度,或者是在将其附加1后跟零后得到的长度吗?
我的第二个问题是:长度是以字节为单位的长度吗?也就是说,如果我的消息是一个字节,我会将消息附加到63 0然后是1.或者如果消息是10个字节,那么我会将消息附加到60 0和1010。
答案 0 :(得分:3)
未填充邮件的长度。来自MD5 RFC,3.2:
b的64位表示(消息之前的消息长度) 填充位被添加)附加到前一个的结果 步。在不太可能的情况下,b大于2 ^ 64,那么只有 使用b的低位64位。 (这些位附加为两个 首先按照32位字和附加的低位字 以前的惯例。)
长度以位为单位。参见MD5 RFC,3.1:
消息被“填充”(扩展),以便其长度(以位为单位) 全等到448,模512.也就是说,消息是扩展的 它只是64位,是512位长的倍数。 即使消息的长度为,也始终执行填充 已经与448一致,模512。
MD5规范比维基百科的文章精确得多。如果您想要实现级别的详细信息,我总是建议您阅读Wiki页面上的规范。
如果我的消息是一个字节,我会将消息附加到63 0,然后是1.或者如果消息是10个字节,那么我会将消息附加到60 0和1010。
不完全。不要忘记在填充开始时始终附加的必需位值“1”。来自规范:
填充如下执行:将单个“1”位附加到 消息,然后附加“0”位,以便以位为单位的长度 填充的消息变为全等448,模512.总之,在 附加至少一位且最多512位。
这个reference C implementation(免责声明:我自己的)MD5可能会有所帮助,它的编写是为了让人很容易理解。