实施 MD5:字节顺序不一致?
Implementing MD5: Inconsistent endianness?
所以我尝试在 C# 中根据 RFC1321 实现 MD5 算法并且它有效,但是关于执行填充的方式有一件事我不明白,这是一个例子:
如果我想对字符串“1”(不带引号)进行散列处理,则会产生以下位表示形式:10001100
下一步是附加一个“1”位,由 00000001(大端)表示,后面是“0”位,然后是 64 - 原始消息长度的位表示(低位字在前)。
由于原始消息的长度为 8(位),因此我希望附加 00000000000000000000000000001000 00000000000000000000000000000000(首先是低位字)。然而,这不会产生正确的散列值,但附加 00010000000000000000000000000000 00000000000000000000000000000000 会。
这看起来好像突然使用了小端格式,但这似乎根本没有任何意义,所以我想一定是我遗漏了什么?
是,对于 md5,您必须在小端添加消息长度。
因此,“1”的消息表示 -> 49 -> 00110001,后跟单个位和零。并以相反的字节顺序添加消息长度(最低有效字节在前)。
您还可以在此站点上逐步检查排列:https://cse.unl.edu/~ssamal/crypto/genhash.php。
或者那里:https://github.com/MrBlackk/md5_sha256-512_debugger
所以我尝试在 C# 中根据 RFC1321 实现 MD5 算法并且它有效,但是关于执行填充的方式有一件事我不明白,这是一个例子:
如果我想对字符串“1”(不带引号)进行散列处理,则会产生以下位表示形式:10001100
下一步是附加一个“1”位,由 00000001(大端)表示,后面是“0”位,然后是 64 - 原始消息长度的位表示(低位字在前)。
由于原始消息的长度为 8(位),因此我希望附加 00000000000000000000000000001000 00000000000000000000000000000000(首先是低位字)。然而,这不会产生正确的散列值,但附加 00010000000000000000000000000000 00000000000000000000000000000000 会。
这看起来好像突然使用了小端格式,但这似乎根本没有任何意义,所以我想一定是我遗漏了什么?
是,对于 md5,您必须在小端添加消息长度。
因此,“1”的消息表示 -> 49 -> 00110001,后跟单个位和零。并以相反的字节顺序添加消息长度(最低有效字节在前)。
您还可以在此站点上逐步检查排列:https://cse.unl.edu/~ssamal/crypto/genhash.php。
或者那里:https://github.com/MrBlackk/md5_sha256-512_debugger