我正在尝试在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 ....是一个非常大的数字。< / p>
答案 0 :(得分:4)
MD5在位级使用big-endian约定,然后在字节级使用little-endian约定。
输入是有序的位序列。连续8位是字节。一个字节的数值介于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'填充位将是下一个字节的第一位,并且,由于位级约定是big-endian,下一个字节将具有数值128(0x80)。
对于空消息,第一位将是'1'填充位,后面是一大堆零。消息长度也为零,它编码其他零。因此,填充的消息块将是单个“1”,后跟511“0”,如您所示。当位组合成字节时,第一个字节的值为128,后跟63个字节的值0.当字节被分组为32位字时,第一个字( M 0 < / em>)将有数值128和其他15个单词( M 1 到 M 15 )将具有数值0。
有关详细信息,请参阅MD5 specification。我在上面描述的是RFC 1321第2节第一段中解释的内容。相同的编码用于消息位长度(在填充结束时),并用于写出最终的散列结果。