Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cryptography 我的md5位是什么?_Cryptography_Md5_Hash - Fatal编程技术网

Cryptography 我的md5位是什么?

Cryptography 我的md5位是什么?,cryptography,md5,hash,Cryptography,Md5,Hash,我试图用Python编写一个md5哈希函数,但它似乎不起作用。我已将问题隔离到要散列的消息位。是的,我实际上将每个字节转换为位,并形成位消息(我想在位级别上研究算法)。这就是事情正在分崩离析的地方;我的位字符串格式不正确 最简单的消息是“”,它的长度为0字节,填充将是一个“1”,后跟(或不后跟)511“0”(最后64位表示消息长度,如前所述,它仅为0) 100000000000000000000000 00000000000000000000000000000000 00000000000000

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

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

100000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000

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

多谢各位


更新:输入转换的第一个32位字的正确位置实际上应该是:
00000000000000000010000000
哪个
int(x,2)
128
这个混乱是由于我的
A=rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]),s11)+B
使用
int()转换格式造成的
要将位字符串解释为整数数据,
int()
采用小尾端格式二进制,因此为100。。。。是一个非常大的数字。

MD5在位级别使用大端惯例,然后在字节级别使用小端惯例

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

四个连续字节是一个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位字时,第一个字(M0)的数值为128,其他15个字(M1到M15)的数值为0


有关详细信息,请参阅。我上面描述的是RFC 1321第2节第一段中解释的内容。同样的编码用于消息位长度(在填充的末尾),并用于写出最终的散列结果。

输入到转换的第一个32位字的正确位置实际上应该是:
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]),s11)+B
使用的
int()
需要很少的尾数,因此
100….
是一个非常大的数字。否则,非常感谢您的充分解释。我的
int(x,2)
函数是造成一切混乱的原因。+1
将字节分组为32位字时,第一个字(M0)的数值将为128
是我误解的关键部分!您也可以在此处查看详细的排列步骤: