网上流传的“MD5模块”计算错误的分析

现在的MD5计算模块似乎有几种版本,
但是,大部分(甚至包括ASP的版本)存在【文件MD5计算不正确】的现象。
经过我的仔细检查,其中网上流传甚广的两个能计算文件的版本是错误的。
问题发生在计算一些具有特定文件/字符串大小的时候,问题出现几率很高。

举几个例子(百度上随机抽选的)
问题版本1:MD5函数为【Md5_[File/String]_Calc】
http://hi.baidu.com/xlsdg/item/b72dbbbe6adb7f40ba0e12dd
问题版本2:MD5函数为【Digest[File/String]ToHexStr】
http://www.programfan.com/article/772.html

其实,他们的源头都是这一个Robert Hubley的版本
http://www.hackhome.com/InfoView/Article_106283.html

【错误一】
MD5Final函数的一个If语句:
Visual Basic code
?
1
2
3
4
5
6
If  lngBytesBuffered <= 56  Then
     MD5Update 56 - lngBytesBuffered, padding
Else
     MD5Update 120 - ByteCounter, padding
End  If

应该改为
Visual Basic code
?
1
2
3
4
5
6
If  lngBytesBuffered <= 56  Then
     MD5Update 56 - lngBytesBuffered, padding
Else
     MD5Update 120 - lngBytesBuffered, padding
End  If

(即ByteCounter改为lngBytesBuffered)

【错误二】
文件计算的读取条件判断出错
DigestFileToHexStr(或者叫Md5_File_Calc)中
Visual Basic code
?
1
If  Loc(1) < LOF(1)  Then

应该改为:
Visual Basic code
?
1
If  Loc(1) <= LOF(1)  Then


【经过多次测试,并与权威MD5数据对比,修改后程序给出的MD5数据全部正确】

当然,只有特定的长度才会触发BUG(但是这个范围相当广).
以下是字符串函数的触发长度,包括了56,120-127,184-192....这些范围

集合法表示:字符串BUG长度集合={56}∪{x∈Z|x∈[64n-8,64n-1],2<n}

你自己也可以试试用(56字节)"12345678901234567890123456789012345678901234567890123456"计算,标准数据是49F193ADCE178490E34D1B3A4EC0064C,错误程序结果是29DC63DA78D43A804E8A4D4DCA707CC2

当使用文件函数时,因为问题二,导致长度等于64倍数的文件都会缺少一个字节进行MD5Transform,
即长度等于64倍数的文件也会触发BUG
因为与字符串计算用的是同一个出问题的MD5Final,所以,
集合法表示:文件BUG长度集合=字符串BUG长度集合∪{n∈Z|64n,1≤n}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值