首页 文章

我的md5位是什么?

提问于
浏览
4

我正在尝试在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”应该在哪里?

谢谢 .

Update :送入变换的第一个32位字的正确位置实际应该是: 00000000000000000000000010000000 int(x,2)128 这个混乱是由于我的 A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B 变换格式使用 int() 将位串解释为整数数据, int() 需要小端格式二进制,因此100 ....是一个非常庞大的数字 .

1 回答

  • 4

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

    输入是有序的位序列 . 八个连续位是一个字节 . 一个字节的数值介于0到255之间;一个字节中的每个位按顺序具有值128,64,32,16,8,4,2或1(这就是"big-endian at bit level"的含义) .

    四个连续字节是32位字 . 该字的数值在0到4294967295之间 . 第一个字节在该字中最不重要("little-endian at byte level") . 因此,如果四个字节是a,b,c和d的顺序,则字数值是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节第一段中解释的内容 . 相同的编码用于消息位长度(在填充结束时),以及用于写出最终的散列结果 .

相关问题