我正在尝试在Python中编写md5哈希函数,但它似乎不起作用。我已将问题隔离到要散列的消息位。是的,我实际上是将每个字节转换为位并形成位消息(我想在位级别上研究算法)。这就是一切崩溃的地方。我的位串格式不正确。
最简单的消息是“”,它是0字节长,填充是“ 1”,后跟(或不包括)511个“ 0”(后64位表示消息长度,正如已经说的那样,仅为0)。
10000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
我一次将32位数据块输入到转换函数中。我试图手动在第一个块以及最后一个块(小尾数)的所有位置中手动定位1。 “ 1”应该在哪里?
谢谢。
更新:输入到转换中的第一个32位字的正确位置实际上应该是:00000000000000000000000010000000
其中int(x,2)
是128
这种混乱是由于我的A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B
转换格式使用int()
来解释位字符串作为整数数据,int()
很少采用字节序格式的二进制,因此100 ....是一个非常大的数字。
最佳答案
MD5在位级别使用大端约定,然后在字节级别使用小端约定。
输入是位的有序序列。八个连续位是一个字节。字节的数值介于0到255之间;字节中的每个位按该顺序具有值128、64、32、16、8、4、2或1(这就是“位级的大端”的意思)。
四个连续字节是一个32位字。字的数值介于0到4294967295之间。第一个字节在该字中的最低位(“字节级小尾数”)。因此,如果四个字节依次是a,b,c和d,则单词数值为a + 256 * b + 65536 * c + 16777216 * d。
在软件应用程序中,输入几乎总是一个字节序列(其长度(以位为单位)是8的倍数)。假定已经将位聚合为字节。因此,额外的“ 1”填充位将是下一个字节的第一位,并且由于位级别约定为大端顺序,因此该下一个字节将具有数值128(0x80)。
对于空消息,第一位是填充位“ 1”,后跟一整串零。消息长度也是零,它编码其他零。因此,如图所示,填充的消息块将是单个“ 1”,后跟511“ 0”。将位组合为字节时,第一个字节的值将为128,随后为63个字节的值0。将字节分组为32位字时,第一个字(M0)将具有数值128,其他15个字(M1至M15)的数值为0。
有关详细信息,请参见MD5 specification。我上面描述的是在RFC 1321第2节的第一段中解释的内容。消息位长度(在填充末尾)使用相同的编码,并写出最终的哈希结果。