我的md5位是什么?

时间:2010-11-08 13:38:45

标签: cryptography md5 hash

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

1 个答案:

答案 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节第一段中解释的内容。相同的编码用于消息位长度(在填充结束时),并用于写出最终的散列结果。