今天我有提过md5.asp因为设计上的缺陷,在对双字节字符(比方说中文)进行加密的时候会和标准的md5算法(.Net /IndyHashMessageDigest5 / md5.pas,这三者计算结果相同,同为以字节为单位计算岀的结果)结果有出入。
其原因在于md5.asp使用mid函数,取出的是“字符”,而正确的做法应该是取出字节,可是论坛数据库(比方说dvbbs7)中的数据已经是md5.asp的加密结果,所以我们只能将错就错,为我们的程序重写一个和md5.asp一样的加密过程
>>>> 被广泛使用的MD5.asp中似乎存在缺陷
我今天总算是用Delphi写出来了
虽然不知道asc函数得到的结果是否正确代码——我的目标是和md5.asp结果一样,现在缺的不就是这个有缺陷的程序吗?
unit AMD5; interface //////////////////////////////////////////// //请转载者保留以上信息,谢谢// uses type type implementation |
const cAA = $67452301; MODULUS_BITS = 512; { sMD5 } class function sMD5.ConvToWord(const sMessage: WideString): arrlongword; { Function } a := Smallint(s[1]); Result := a; |
[page]
begin lNumberOfWords := (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) div BITS_TO_A_BYTE)) div (MODULUS_BITS div BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS div BITS_TO_A_WORD); SetLength(lWordArray, lNumberOfWords); lByteCount := 0; lWordCount := lByteCount div BYTES_TO_A_WORD; lWordArray[lWordCount] := lWordArray[lWordCount] or ($80 shl lBytePosition); lWordArray[lNumberOfWords - 2] := lMessageLength shl 3; Result := lWordArray; end; class function sMD5.ConvToWord(const sMessage: string): arrlongword; class function sMD5.MD5(const sMessage: string; |
[page]
var function md5_F(const x, y, z: longword): longword; function md5_G(const x, y, z: longword): longword; function md5_H(const x, y, z: longword): longword; function md5_I(const x, y, z: longword): longword; procedure md5_FF(var a: longword; const b, c, d, x, s, ac: longword); procedure md5_GG(var a: longword; const b, c, d, x, s, ac: longword); procedure md5_HH(var a: longword; const b, c, d, x, s, ac: longword); |
[page]
procedure md5_II(var a: longword; const b, c, d, x, s, ac: longword); begin { MD5 }
k := 0; md5_FF(a, b, c, d, x[k + 0], S11, $D76AA478); md5_GG(a, b, c, d, x[k + 1], S21, $F61E2562); |
[page]
md5_HH(a, b, c, d, x[k + 5], S31, $FFFA3942); md5_II(a, b, c, d, x[k + 0], S41, $F4292244); a := a + AA; k := k + 16; Result := StrLower(PAnsiChar(s)); class function sMD5.RotateLeft(const lValue, Bits: longword): longword; class function sMD5.WordToHex(const lValue: longword): string; end. |
也许有些不当之处,请多多指教
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交