代码之家  ›  专栏  ›  技术社区  ›  soulseekah

我的MD5位是什么?

  •  4
  • soulseekah  · 技术社区  · 14 年前

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

    最简单的消息是“”,它的长度为0字节,填充将是一个“1”,后跟(或不是)511“0”(最后64位表示消息长度,如前所述,它仅为0)。

    100000000000000000000000000 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿 亿

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

    谢谢您。

    更新 :输入转换的前32位字的正确位置实际上应该是: 00000000000000000000000010000000 哪一个 int(x,2) 128 这一团糟是因为我 A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B 转换格式使用 int() 要将位字符串解释为整数数据, in() 采用小endian格式的二进制文件,因此100…是一个非常巨大的数字。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Thomas Pornin    14 年前

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

    输入是一个有序的位序列。8个连续位是 字节 . 一个字节的数值介于0和255之间;一个字节中的每个位的值为128、64、32、16、8、4、2或1, 按这个顺序 (这就是“big endian at bit level”的意思)。

    四个连续字节是一个32位字。字的数值介于0和4294967295之间。第一个字节是 最低显著性 在那个词中(“字节级的小尾数”)。因此,如果四个字节是 , , C D 按这个顺序,那么数字值这个词是 A+256*B+65536*C+16777216*D .

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

    对于空消息,第一个位将是“1”填充位,后面跟着一整串零。消息长度也是零,它对其他零进行编码。因此,如您所示,填充的消息块将是一个“1”,后跟511“0”。当位组合成字节时,第一个字节的值为128,后面是值0的63个字节。当字节分组成32位字时,第一个字( )将有数值128和其他15个字( 十五 )将具有数值0。

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