# malingxian 发表于2007-03-05 16:56:28 IP: 218.58.145.*
应ROSWELL兄指出本算法在计算超过55位的MD5值时会出错,现已改正:
改正1、InitByte方法的更改:
‘‘‘ -----------------------------------------------------------------------------
‘‘‘ <summary>
‘‘‘ 初始化数据
‘‘‘ </summary>
‘‘‘ <param name="Data"></param>
‘‘‘ <returns></returns>
‘‘‘ <remarks>补足数据位数为k*64+56字节
‘‘‘ </remarks>
‘‘‘ <history>
‘‘‘ [malingxian] 2007-3-3 Created
‘‘‘ </history>
‘‘‘ -----------------------------------------------------------------------------
Private Function InitByte(ByRef Data As Byte()) As Byte()
Dim kl As ArrayList = New ArrayList(Data)
Dim dbLength As Int64 = Data.GetLongLength(0)
Dim j As Integer = dbLength Mod 64
If j >= 56 Then
j = 120 - j
Else
j = 56 - j
If j = 0 Then j = 56
End If
kl.Add(CByte(&H80)) ‘补1
kl.AddRange(New Byte(j - 1 - 1) {}) ‘补0
kl.AddRange(Int64ToBytes(dbLength << 3)) ‘添加长度
Dim buffout As Byte() = kl.ToArray(GetType(Byte))
kl.Clear()
Return buffout
End Function
改正2、InitM的更改:
‘‘‘ -----------------------------------------------------------------------------
‘‘‘ <summary>
‘‘‘ 将分组数据按64字节为一组取出来,并转化32位整数数组<>< div=""><>
# malingxian 发表于2007-03-05 16:57:07 IP: 218.58.145.*
‘‘‘ -----------------------------------------------------------------------------
‘‘‘ <summary>
‘‘‘ 将分组数据按64字节为一组取出来,并转化32位整数数组
‘‘‘ </summary>
‘‘‘ <param name="Data"></param>
‘‘‘ <param name="StartIndex"></param>
‘‘‘ <returns></returns>
‘‘‘ <remarks>
‘‘‘ </remarks>
‘‘‘ <history>
‘‘‘ [malingxian] 2007-3-3 Created
‘‘‘ </history>
‘‘‘ -----------------------------------------------------------------------------
Private Function InitM(ByRef Data As Byte(), ByVal StartIndex As Long) As Int32()
Dim M As Int32() = New Int32(15) {}
For i As Integer = 0 To 15
M(i) = BytesToInt32(Data, StartIndex + (i << 2))
Next
Return M
End Function
# malingxian 发表于2007-03-05 16:57:49 IP: 218.58.145.*
改正3、主循环方法的更改:
Public Function MD5Conversion(ByVal Data As Byte()) As Byte()
Dim buff As Byte() = Me.InitByte(Data)
‘Dim T As Integer() = InitT()
Dim A As Integer = AA
Dim B As Integer = BB
Dim C As Integer = CC
Dim D As Integer = DD
Dim AAA As Integer = AA
Dim BBB As Integer = BB
Dim CCC As Integer = CC
Dim DDD As Integer = DD
‘Console.WriteLine(BitConverter.ToString(buff))
For i As Integer = 0 To buff.Length - 63 Step 64
Dim M As Integer() = InitM(buff, i)
A = AAA : B = BBB : C = CCC : D = DDD
A = FF(A, B, C, D, M(&H0), S11, &HD76AA478)
D = FF(D, A, B, C, M(&H1), S12, &HE8C7B756)
C = FF(C, D, A, B, M(&H2), S13, &H242070DB)
B = FF(B, C, D, A, M(&H3), S14, &HC1BDCEEE)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = FF(A, B, C, D, M(&H4), S11, &HF57C0FAF)
D = FF(D, A, B, C, M(&H5), S12, &H4787C62A)
C = FF(C, D, A, B, M(&H6), S13, &HA8304613)
B = FF(B, C, D, A, M(&H7), S14, &HFD469501)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = FF(A, B, C, D, M(&H8), S11, &H6980
# malingxian 发表于2007-03-05 16:58:38 IP: 218.58.145.*
98D8)
D = FF(D, A, B, C, M(&H9), S12, &H8B44F7AF)
C = FF(C, D, A, B, M(&HA), S13, &HFFFF5BB1)
B = FF(B, C, D, A, M(&HB), S14, &H895CD7BE)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = FF(A, B, C, D, M(&HC), S11, &H6B901122)
D = FF(D, A, B, C, M(&HD), S12, &HFD987193)
C = FF(C, D, A, B, M(&HE), S13, &HA679438E)
B = FF(B, C, D, A, M(&HF), S14, &H49B40821)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = GG(A, B, C, D, M(&H1), S21, &HF61E2562)
D = GG(D, A, B, C, M(&H6), S22, &HC040B340)
C = GG(C, D, A, B, M(&HB), S23, &H265E5A51)
B = GG(B, C, D, A, M(&H0), S24, &HE9B6C7AA)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = GG(A, B, C, D, M(&H5), S21, &HD62F105D)
D = GG(D, A, B, C, M(&HA), S22, &H2441453)
C = GG(C, D, A, B, M(&HF), S23, &HD8A1E681)
B = GG(B, C, D, A, M(&H4), S24, &HE7D3FBC8)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = GG(A, B, C, D, M(&H9), S21, &H21E1CDE6)
D = GG(D, A, B, C, M
# malingxian 发表于2007-03-05 16:59:06 IP: 218.58.145.*
(&HE), S22, &HC33707D6)
C = GG(C, D, A, B, M(&H3), S23, &HF4D50D87)
B = GG(B, C, D, A, M(&H8), S24, &H455A14ED)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = GG(A, B, C, D, M(&HD), S21, &HA9E3E905)
D = GG(D, A, B, C, M(&H2), S22, &HFCEFA3F8)
C = GG(C, D, A, B, M(&H7), S23, &H676F02D9)
B = GG(B, C, D, A, M(&HC), S24, &H8D2A4C8A)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
Console.WriteLine("aaa:{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = HH(A, B, C, D, M(&H5), S31, &HFFFA3942)
D = HH(D, A, B, C, M(&H8), S32, &H8771F681)
C = HH(C, D, A, B, M(&HB), S33, &H6D9D6122)
B = HH(B, C, D, A, M(&HE), S34, &HFDE5380C)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = HH(A, B, C, D, M(&H1), S31, &HA4BEEA44)
D = HH(D, A, B, C, M(&H4), S32, &H4BDECFA9)
C = HH(C, D, A, B, M(&H7), S33, &HF6BB4B60)
B = HH(B, C, D, A, M(&HA), S34, &HBEBFBC70)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = HH(A, B, C, D, M(&HD), S31, &
# malingxian 发表于2007-03-05 16:59:39 IP: 218.58.145.*
H289B7EC6)
D = HH(D, A, B, C, M(&H0), S32, &HEAA127FA)
C = HH(C, D, A, B, M(&H3), S33, &HD4EF3085)
B = HH(B, C, D, A, M(&H6), S34, &H4881D05)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = HH(A, B, C, D, M(&H9), S31, &HD9D4D039)
D = HH(D, A, B, C, M(&HC), S32, &HE6DB99E5)
C = HH(C, D, A, B, M(&HF), S33, &H1FA27CF8)
B = HH(B, C, D, A, M(&H2), S34, &HC4AC5665)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
Console.WriteLine("aaa:{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = II(A, B, C, D, M(&H0), S41, &HF4292244)
D = II(D, A, B, C, M(&H7), S42, &H432AFF97)
C = II(C, D, A, B, M(&HE), S43, &HAB9423A7)
B = II(B, C, D, A, M(&H5), S44, &HFC93A039)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = II(A, B, C, D, M(&HC), S41, &H655B59C3)
D = II(D, A, B, C, M(&H3), S42, &H8F0CCC92)
C = II(C, D, A, B, M(&HA), S43, &HFFEFF47D)
B = II(B, C, D, A, M(&H1), S44, &H85845DD1)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
# malingxian 发表于2007-03-05 17:00:05 IP: 218.58.145.*
A = II(A, B, C, D, M(&H8), S41, &H6FA87E4F)
D = II(D, A, B, C, M(&HF), S42, &HFE2CE6E0)
C = II(C, D, A, B, M(&H6), S43, &HA3014314)
B = II(B, C, D, A, M(&HD), S44, &H4E0811A1)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
A = II(A, B, C, D, M(&H4), S41, &HF7537E82)
D = II(D, A, B, C, M(&HB), S42, &HBD3AF235)
C = II(C, D, A, B, M(&H2), S43, &H2AD7D2BB)
B = II(B, C, D, A, M(&H9), S44, &HEB86D391)
‘Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D))
AAA = LongAdd(A, AAA)
BBB = LongAdd(B, BBB)
CCC = LongAdd(C, CCC)
DDD = LongAdd(D, DDD)
‘Console.WriteLine("AAA:{0},{1},{2},{3}", Hex(AAA), Hex(BBB), Hex(CCC), Hex(DDD))
Next
Dim caa As New ArrayList(16)
caa.AddRange(Int32ToBytes(AAA))
caa.AddRange(Int32ToBytes(BBB))
caa.AddRange(Int32ToBytes(CCC))
caa.AddRange(Int32ToBytes(DDD))
Dim buffout As Byte() = caa.ToArray(GetType(Byte))
caa.Clear()
Return buffout
End Function