您的位置:首页 > 其它

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

2013-03-29 13:45 323 查看
现在的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

?
应该改为

Visual Basic code

?
(即ByteCounter改为lngBytesBuffered)

【错误二】

文件计算的读取条件判断出错

DigestFileToHexStr(或者叫Md5_File_Calc)中

Visual Basic code

?
应该改为:

Visual Basic code

?
【经过多次测试,并与权威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}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: