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位应该是?
展开
 我来答
匿名用户
2014-10-13
展开全部

这是我当初写这个算法时的代码,你可以参考一下。注意有四张图,有重复的部分。

图1:

图2:

图3:

图4:

aophalei
2014-10-13 · 超过43用户采纳过TA的回答
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:69.7万
展开全部
上代码。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式