Hash 实现MD5:不一致的endianness?

Hash 实现MD5:不一致的endianness?,hash,byte,md5,bit,Hash,Byte,Md5,Bit,因此,我尝试根据C#实现MD5算法,它是有效的,但关于填充的执行方式,有一点我不理解,下面是一个示例: 如果我想散列字符串“1”(不带引号),这将导致以下位表示:10001100 下一步是附加一个“1”位,表示为00000001(big-endian),后面是“0”位,后面是原始消息长度的64位表示(先是低阶字) 由于原始消息的长度是8(位),我希望追加000000000000000000000000000000000000000000000000000000001000000000000000

因此,我尝试根据C#实现MD5算法,它是有效的,但关于填充的执行方式,有一点我不理解,下面是一个示例:

如果我想散列字符串“1”(不带引号),这将导致以下位表示:10001100

下一步是附加一个“1”位,表示为00000001(big-endian),后面是“0”位,后面是原始消息长度的64位表示(先是低阶字)

由于原始消息的长度是8(位),我希望追加00000000000000000000000000000000000000000000000000000000100000000000000000000000000000(低阶单词优先)。但是,这不会产生正确的散列值,但追加000100000000000000000000000000000000000000会产生正确的散列值


这看起来好像突然使用了little-endian格式,但这似乎没有任何意义,所以我想我肯定还遗漏了什么?

是的,对于md5,您必须在little-endian中添加消息长度

因此,“1”->49->00110001的消息表示形式,后跟单位和零。然后按字节的相反顺序添加消息长度(首先是最低有效字节)

您还可以在此网站上逐步检查排列:

或者在那里: