现在的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语句:
应该改为
(即ByteCounter改为lngBytesBuffered)
【错误二】
文件计算的读取条件判断出错
DigestFileToHexStr(或者叫Md5_File_Calc)中
应该改为:
【经过多次测试,并与权威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}
但是,大部分(甚至包括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语句:
1
2
3
4
5
6
|
If
lngBytesBuffered <= 56
Then
MD5Update 56 - lngBytesBuffered, padding
Else
MD5Update 120 - ByteCounter, padding
End
If
|
应该改为
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)中
1
|
If
Loc(1) < LOF(1)
Then
|
应该改为:
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}