【问题标题】:What are my md5 bits?我的 md5 位是多少?
【发布时间】:2011-05-06 16:13:50
【问题描述】:

我正在尝试在 Python 中编写一个 md5 散列函数,但它似乎不起作用。我已将问题隔离到要散列的消息位。是的,我实际上是在将每个字节转换为位并形成一个位消息(我想在位级别上研究算法)。这就是事情分崩离析的地方;我的位串格式不正确。

最简单的消息是“”,它的长度为 0 字节,填充将是一个“1”,后跟(或不)511 个“0”(最后 64 位表示消息长度,正如已经说过的,它只是0).

10000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000

我一次将 32 位数据块输入转换函数。我尝试将 1 手动定位在第一个块以及最后一个块(小端)中的所有位置。 “1”应该在哪里?

谢谢。

更新:输入转换的第一个 32 位字的正确位置实际上应该是:00000000000000000000000010000000 其中int(x,2)128 这个混乱是由于我的@987654325 @ 转换格式使用int() 将位字符串解释为整数数据,int() 采用小端格式二进制,因此 100.... 是一个非常大的数字。

【问题讨论】:

标签: cryptography md5 hash


【解决方案1】:

MD5 在位级别使用 big-endian 约定,然后在字节级别使用 little-endian 约定。

输入是有序的位序列。八个连续的位是一个字节。一个字节的数值介于 0 到 255 之间;字节中的每个位都有值 128、64、32、16、8、4、2 或 1,按此顺序(这就是“位级别的大端”的含义)。

四个连续字节是一个 32 位字。字的数值介于 0 和 4294967295 之间。第一个字节在该字中是最不重要的(“字节级别的小端序”)。因此,如果四个字节依次是 abcd,那么单词 numeric值为a+256*b+65536*c+16777216*d

在软件应用程序中,输入几乎总是一个字节序列(它的长度,以位为单位,是 8 的倍数)。假定已将比特聚合为字节。因此,额外的“1”填充位将是下一个字节的第一位,并且由于位级约定是大端,下一个字节将具有数值 128 (0x80)。

对于空消息,第一个位将是“1”填充位,然后是一大堆零。消息长度也为零,它对其他零进行编码。因此,填充的消息块将是单个“1”,后跟 511“0”,如您所示。当位被组合成字节时,第一个字节的值是 128,然后是 63 个字节的值 0。当字节被组合成 32 位字时,第一个字 (M0) 将具有数值 128,其他 15 个单词 (M1M15)将具有数值 0。

详情请参阅MD5 specification。我上面描述的是 RFC 1321 第 2 节的第一段中解释的内容。相同的编码用于消息位长度(在填充的末尾),并用于写出最终的哈希结果。

【讨论】:

  • 输入转换的第一个 32 位字的正确位置实际上应该是:00000000000000000000000010000000 其中int(x,2)128,这个混乱是由于我的A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B 使用@ 987654326@ 采用小端序,因此 100.... 是一个非常大的数字。
  • 否则,非常感谢您的充分解释。我的int(x,2) 函数是搞砸一切的原因。
  • +1 When bytes are grouped into 32-bit words, the first word (M0) will have numerical value 128 是我误解的关键部分!
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2012-10-22
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2010-10-29
  • 2021-08-30
相关资源
最近更新 更多