c++ md5算法 实现时遇到的问题
(以下的输出的每一位都是16进制的数,dataafterfillbits每个数都是一个32bit的整型变量,输出成16进制数)80:0000000010000000806...
(以下的输出的每一位都是16进制的数, data after fill bits 每个数都是一个32bit的整型变量,输出成16进制数)
80: 0000 0000 1000 0000
8061: 1000 0000 0110 0001
当输入为空串时,
我的代码的输出:(最后把ABCD四个散列连接的一步还没有实现)
data after fill bits: 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A: d98c1dd4 B: 4b2008f C: 980980e9 D: 7e42f8ec
标准代码的输出:
data after fill bits: 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A: d98c1dd4 B: 4b2008f C: 980980e9 D: 7e42f8ec
MD5 Value: d41d8cd98f00b204e9800998ecf8427e
最终得到的A,B,C,D是正确的
但是当输入不是空串时问题就来了...
输入的数据为单独一个"a"的时候
我的代码的输出:
data after fill bits: 8061 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8000000
A: 7cc8b1f0 B: d4d320fc C: c0c2b3ca D: 9f775c94
标准代码的输出:
data after fill bits: 8061 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0
A: b975c10c B: a8b6f1c0 C: e299c331 D: 61267769
MD5 Value: 0cc175b9c0f1b6a831c399e269772661
发现问题出在最终我补位结束后的数据跟标准的不一样
不一样的地方在最后的64位,也就是代表补位之前数据中含有的bit的数目的64位.
输入为空串时最后64位都是0,和标准是一样的,因而进行运算后得到一样的ABCD
输入为a时,按我的想法(应该是错的,但是不知道错在哪里,导致最后64位不同)
1. a --> 0110 0001
2. 先补一个1--> 0110 0001 1
3. 补到448位 0110 0001 1000 0000 ... 0000
4. 补最后64位, a是一个char型变量,占8位 [0000 0000 0000 1000]
变成 0110 0001 1000 0000 ... 0000 [0000 0000 0000 1000] 即 61800000......00000008
5. 存储的时候是按照大端字节序的
所以每32位在正真运算时 应该是 61800000 --> 00008061
00000008 --> 08000000
因此输出data after fill bits为: 8061 0 0 0 ... [0 08000000]
但是应该是[8 0]
假如补位前数据中含有地bit数目是0x123456789ABCDEF0
应该怎么补?补完后的数据中这最后64位应该是? 展开
80: 0000 0000 1000 0000
8061: 1000 0000 0110 0001
当输入为空串时,
我的代码的输出:(最后把ABCD四个散列连接的一步还没有实现)
data after fill bits: 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A: d98c1dd4 B: 4b2008f C: 980980e9 D: 7e42f8ec
标准代码的输出:
data after fill bits: 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A: d98c1dd4 B: 4b2008f C: 980980e9 D: 7e42f8ec
MD5 Value: d41d8cd98f00b204e9800998ecf8427e
最终得到的A,B,C,D是正确的
但是当输入不是空串时问题就来了...
输入的数据为单独一个"a"的时候
我的代码的输出:
data after fill bits: 8061 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8000000
A: 7cc8b1f0 B: d4d320fc C: c0c2b3ca D: 9f775c94
标准代码的输出:
data after fill bits: 8061 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0
A: b975c10c B: a8b6f1c0 C: e299c331 D: 61267769
MD5 Value: 0cc175b9c0f1b6a831c399e269772661
发现问题出在最终我补位结束后的数据跟标准的不一样
不一样的地方在最后的64位,也就是代表补位之前数据中含有的bit的数目的64位.
输入为空串时最后64位都是0,和标准是一样的,因而进行运算后得到一样的ABCD
输入为a时,按我的想法(应该是错的,但是不知道错在哪里,导致最后64位不同)
1. a --> 0110 0001
2. 先补一个1--> 0110 0001 1
3. 补到448位 0110 0001 1000 0000 ... 0000
4. 补最后64位, a是一个char型变量,占8位 [0000 0000 0000 1000]
变成 0110 0001 1000 0000 ... 0000 [0000 0000 0000 1000] 即 61800000......00000008
5. 存储的时候是按照大端字节序的
所以每32位在正真运算时 应该是 61800000 --> 00008061
00000008 --> 08000000
因此输出data after fill bits为: 8061 0 0 0 ... [0 08000000]
但是应该是[8 0]
假如补位前数据中含有地bit数目是0x123456789ABCDEF0
应该怎么补?补完后的数据中这最后64位应该是? 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询