所以我尝试按照RFC1321实现MD5算法在 C# 中它可以工作,但是关于填充的执行方式有一件事我不明白,这里有一个例子:
如果我想对字符串“1”(不带引号)进行哈希处理,则会产生以下位表示形式:10001100
下一步是附加一个“1”位,由00000001(大端)表示,后面是“0”位,最后是 64 位表示原始消息的长度(低位字在前)。
由于原始消息的长度是8(位),我预计会附加00000000000000000000000000001000 00000000000000000000000000000000(低位字在前)。然而,这不会产生正确的哈希值,但附加 00010000000000000000000000000000 00000000000000000000000000000000 会产生正确的哈希值。
这看起来好像突然使用了小端格式,但这似乎根本没有任何意义,所以我想我一定还缺少其他东西?
最佳答案
是的,对于 md5,您必须以小尾数法添加消息长度。
因此,消息表示为“1” -> 49 -> 00110001,后跟一位和零。然后以相反的字节顺序添加消息长度(首先是最低有效字节)。
您还可以在此网站上逐步检查排列:https://cse.unl.edu/~ssamal/crypto/genhash.php .
关于hash - 实现 MD5 : Inconsistent endianness?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48818204/