经典加密算法---在VB中的实现MD5     Option ExplicitDim w1 As String, w2 As String, w3 As String, w4 As StringFunction MD5F(ByVal tempstr As String, ByVal w As String, ByVal X As S
tring, ByVal y As String, ByVal z As String, ByVal Xin As String, ByVa
l qdata As String, ByVal rots As Integer)
    MD5F = BigMod32Add(RotLeft(BigMod32Add(BigMod32Add(w, tempstr), Bi
gMod32Add(Xin, qdata)), rots), X)
End FunctionSub MD5F1(w As String, ByVal X As String, ByVal y As String, ByVal z A
s String, ByVal Xin As String, ByVal qdata As String, ByVal rots As In
teger)
Dim tempstr As String    tempstr = BigXOR(z, BigAND(X, BigXOR(y, z)))
    w = MD5F(tempstr, w, X, y, z, Xin, qdata, rots)
End SubSub MD5F2(w As String, ByVal X As String, ByVal y As String, ByVal z A
s String, ByVal Xin As String, ByVal qdata As String, ByVal rots As In
teger)
Dim tempstr As String    tempstr = BigXOR(y, BigAND(z, BigXOR(X, y)))
    w = MD5F(tempstr, w, X, y, z, Xin, qdata, rots)
End SubSub MD5F3(w As String, ByVal X As String, ByVal y As String, ByVal z A
s String, ByVal Xin As String, ByVal qdata As String, ByVal rots As In
teger)
Dim tempstr As String    tempstr = BigXOR(X, BigXOR(y, z))
    w = MD5F(tempstr, w, X, y, z, Xin, qdata, rots)
End SubSub MD5F4(w As String, ByVal X As String, ByVal y As String, ByVal z A
s String, ByVal Xin As String, ByVal qdata As String, ByVal rots As In
teger)
Dim tempstr As String    tempstr = BigXOR(y, BigOR(X, BigNOT(z)))
    w = MD5F(tempstr, w, X, y, z, Xin, qdata, rots)
End SubFunction MD5_Calc(ByVal hashthis As String) As String
ReDim buf(0 To 3) As String
ReDim Xin(0 To 15) As String
Dim tempnum As Integer, tempnum2 As Integer, loopit As Integer, loopou
ter As Integer, loopinner As Integer
Dim a As String, b As String, c As String, d As String    ' Add padding    tempnum = 8 * Len(hashthis)
    hashthis = hashthis + Chr$(128) 'Add binary 10000000
    tempnum2 = 56 - Len(hashthis) Mod 64    If tempnum2 < 0 Then
        tempnum2 = 64 + tempnum2
    End If    hashthis = hashthis + String$(tempnum2, Chr$(0))    For loopit = 1 To 8
        hashthis = hashthis + Chr$(tempnum Mod 256)
        tempnum = tempnum - tempnum Mod 256
        tempnum = tempnum / 256
    Next loopit        ' Set magic numbers
    buf(0) = "67452301"
    buf(1) = "efcdab89"
    buf(2) = "98badcfe"
    buf(3) = "10325476"        ' For each 512 bit section
    For loopouter = 0 To Len(hashthis) / 64 - 1
        a = buf(0)
        b = buf(1)
        c = buf(2)
        d = buf(3)        ' Get the 512 bits
        For loopit = 0 To 15
            Xin(loopit) = ""
            For loopinner = 1 To 4
                Xin(loopit) = Hex$(Asc(Mid$(hashthis, 64 * loopouter +
4 * loopit + loopinner, 1))) + Xin(loopit)
                If Len(Xin(loopit)) Mod 2 Then Xin(loopit) = "0" + Xin
(loopit)
            Next loopinner
        Next loopit        ' Round 1
        MD5F1 a, b, c, d, Xin(0), "d76aa478", 7
        MD5F1 d, a, b, c, Xin(1), "e8c7b756", 12
        MD5F1 c, d, a, b, Xin(2), "242070db", 17
        MD5F1 b, c, d, a, Xin(3), "c1bdceee", 22
        MD5F1 a, b, c, d, Xin(4), "f57c0faf", 7
        MD5F1 d, a, b, c, Xin(5), "4787c62a", 12
        MD5F1 c, d, a, b, Xin(6), "a8304613", 17
        MD5F1 b, c, d, a, Xin(7), "fd469501", 22
        MD5F1 a, b, c, d, Xin(8), "698098d8", 7
        MD5F1 d, a, b, c, Xin(9), "8b44f7af", 12
        MD5F1 c, d, a, b, Xin(10), "ffff5bb1", 17
        MD5F1 b, c, d, a, Xin(11), "895cd7be", 22
        MD5F1 a, b, c, d, Xin(12), "6b901122", 7
        MD5F1 d, a, b, c, Xin(13), "fd987193", 12
        MD5F1 c, d, a, b, Xin(14), "a679438e", 17
        MD5F1 b, c, d, a, Xin(15), "49b40821", 22        ' Round 2
        MD5F2 a, b, c, d, Xin(1), "f61e2562", 5
        MD5F2 d, a, b, c, Xin(6), "c040b340", 9
        MD5F2 c, d, a, b, Xin(11), "265e5a51", 14
        MD5F2 b, c, d, a, Xin(0), "e9b6c7aa", 20
        MD5F2 a, b, c, d, Xin(5), "d62f105d", 5
        MD5F2 d, a, b, c, Xin(10), "02441453", 9
        MD5F2 c, d, a, b, Xin(15), "d8a1e681", 14
        MD5F2 b, c, d, a, Xin(4), "e7d3fbc8", 20
        MD5F2 a, b, c, d, Xin(9), "21e1cde6", 5
        MD5F2 d, a, b, c, Xin(14), "c33707d6", 9
        MD5F2 c, d, a, b, Xin(3), "f4d50d87", 14
        MD5F2 b, c, d, a, Xin(8), "455a14ed", 20
        MD5F2 a, b, c, d, Xin(13), "a9e3e905", 5
        MD5F2 d, a, b, c, Xin(2), "fcefa3f8", 9
        MD5F2 c, d, a, b, Xin(7), "676f02d9", 14
        MD5F2 b, c, d, a, Xin(12), "8d2a4c8a", 20        ' Round 3
        MD5F3 a, b, c, d, Xin(5), "fffa3942", 4
        MD5F3 d, a, b, c, Xin(8), "8771f681", 11
        MD5F3 c, d, a, b, Xin(11), "6d9d6122", 16
        MD5F3 b, c, d, a, Xin(14), "fde5380c", 23
        MD5F3 a, b, c, d, Xin(1), "a4beea44", 4
        MD5F3 d, a, b, c, Xin(4), "4bdecfa9", 11
        MD5F3 c, d, a, b, Xin(7), "f6bb4b60", 16
        MD5F3 b, c, d, a, Xin(10), "bebfbc70", 23
        MD5F3 a, b, c, d, Xin(13), "289b7ec6", 4
        MD5F3 d, a, b, c, Xin(0), "e27fa", 11
        MD5F3 c, d, a, b, Xin(3), "d4ef3085", 16
        MD5F3 b, c, d, a, Xin(6), "04881d05", 23
        MD5F3 a, b, c, d, Xin(9), "d9d4d039", 4
        MD5F3 d, a, b, c, Xin(12), "e6db99e5", 11
        MD5F3 c, d, a, b, Xin(15), "1fa27cf8", 16
        MD5F3 b, c, d, a, Xin(2), "c4ac5665", 23        ' Round 4
        MD5F4 a, b, c, d, Xin(0), "f4292244", 6
        MD5F4 d, a, b, c, Xin(7), "432aff97", 10
        MD5F4 c, d, a, b, Xin(14), "ab9423a7", 15
        MD5F4 b, c, d, a, Xin(5), "fc93a039", 21
        MD5F4 a, b, c, d, Xin(12), "655b59c3", 6
        MD5F4 d, a, b, c, Xin(3), "8f0ccc92", 10
        MD5F4 c, d, a, b, Xin(10), "ffeff47d", 15
        MD5F4 b, c, d, a, Xin(1), "85845dd1", 21
        MD5F4 a, b, c, d, Xin(8), "6fa87e4f", 6
        MD5F4 d, a, b, c, Xin(15), "fe2ce6e0", 10
        MD5F4 c, d, a, b, Xin(6), "a3014314", 15
        MD5F4 b, c, d, a, Xin(13), "4e0811a1", 21
        MD5F4 a, b, c, d, Xin(4), "f7537e82", 6
        MD5F4 d, a, b, c, Xin(11), "bd3af235", 10
        MD5F4 c, d, a, b, Xin(2), "2ad7d2bb", 15
        MD5F4 b, c, d, a, Xin(9), "eb86d391", 21        buf(0) = BigAdd(buf(0), a)
        buf(1) = BigAdd(buf(1), b)
        buf(2) = BigAdd(buf(2), c)
        buf(3) = BigAdd(buf(3), d)
    Next loopouter    ' Extract MD5Hash
    hashthis = ""
    For loopit = 0 To 3
        For loopinner = 3 To 0 Step -1
            hashthis = hashthis + Chr(Val("&H" + Mid$(buf(loopit), 1 +
2 * loopinner, 2)))
        Next loopinner
    Next loopit    ' And return it
    MD5_Calc = hashthis
End Function

解决方案 »

  1.   


    Function BigMod32Add(ByVal value1 As String, ByVal value2 As String) A
    s String
        BigMod32Add = Right$(BigAdd(value1, value2), 8)
    End FunctionPublic Function BigAdd(ByVal value1 As String, ByVal value2 As String)
    As String
    Dim valueans As String
    Dim loopit As Integer, tempnum As Integer    tempnum = Len(value1) - Len(value2)
        If tempnum < 0 Then
            value1 = Space$(Abs(tempnum)) + value1
        ElseIf tempnum > 0 Then
            value2 = Space$(Abs(tempnum)) + value2
        End If    tempnum = 0
        For loopit = Len(value1) To 1 Step -1
            tempnum = tempnum + Val("&H" + Mid$(value1, loopit, 1)) + Val(
    "&H" + Mid$(value2, loopit, 1))
            valueans = Hex$(tempnum Mod 16) + valueans
            tempnum = Int(tempnum / 16)
        Next loopit    If tempnum <> 0 Then
            valueans = Hex$(tempnum) + valueans
        End If    BigAdd = Right(valueans, 8)
    End FunctionPublic Function RotLeft(ByVal value1 As String, ByVal rots As Integer)
    As String
    Dim tempstr As String
    Dim loopit As Integer, loopinner As Integer
    Dim tempnum As Integer    rots = rots Mod 32
        
        If rots = 0 Then
            RotLeft = value1
            Exit Function
        End If    value1 = Right$(value1, 8)
        tempstr = String$(8 - Len(value1), "0") + value1
        value1 = ""    ' Convert to binary
        For loopit = 1 To 8
            tempnum = Val("&H" + Mid$(tempstr, loopit, 1))
            For loopinner = 3 To 0 Step -1
                If tempnum And 2 ^ loopinner Then
                    value1 = value1 + "1"
                Else
                    value1 = value1 + "0"
                End If
            Next loopinner
        Next loopit
        tempstr = Mid$(value1, rots + 1) + Left$(value1, rots)    ' And convert back to hex
        value1 = ""
        For loopit = 0 To 7
            tempnum = 0
            For loopinner = 0 To 3
                If Val(Mid$(tempstr, 4 * loopit + loopinner + 1, 1)) Then                tempnum = tempnum + 2 ^ (3 - loopinner)
                End If
            Next loopinner
            value1 = value1 + Hex$(tempnum)
        Next loopit    RotLeft = Right(value1, 8)
    End FunctionFunction BigAND(ByVal value1 As String, ByVal value2 As String) As Str
    ing
    Dim valueans As String
    Dim loopit As Integer, tempnum As Integer    tempnum = Len(value1) - Len(value2)
        If tempnum < 0 Then
            value2 = Mid$(value2, Abs(tempnum) + 1)
        ElseIf tempnum > 0 Then
            value1 = Mid$(value1, tempnum + 1)
        End If    For loopit = 1 To Len(value1)
            valueans = valueans + Hex$(Val("&H" + Mid$(value1, loopit, 1))
    And Val("&H" + Mid$(value2, loopit, 1)))
        Next loopit    BigAND = valueans
    End FunctionFunction BigNOT(ByVal value1 As String) As String
    Dim valueans As String
    Dim loopit As Integer    value1 = Right$(value1, 8)
        value1 = String$(8 - Len(value1), "0") + value1
        For loopit = 1 To 8
            valueans = valueans + Hex$(15 Xor Val("&H" + Mid$(value1, loop
    it, 1)))
        Next loopit    BigNOT = valueans
    End FunctionFunction BigOR(ByVal value1 As String, ByVal value2 As String) As Stri
    ng
    Dim valueans As String
    Dim loopit As Integer, tempnum As Integer    tempnum = Len(value1) - Len(value2)
        If tempnum < 0 Then
            valueans = Left$(value2, Abs(tempnum))
            value2 = Mid$(value2, Abs(tempnum) + 1)
        ElseIf tempnum > 0 Then
            valueans = Left$(value1, Abs(tempnum))
            value1 = Mid$(value1, tempnum + 1)
        End If    For loopit = 1 To Len(value1)
            valueans = valueans + Hex$(Val("&H" + Mid$(value1, loopit, 1))
    Or Val("&H" + Mid$(value2, loopit, 1)))
        Next loopit    BigOR = valueans
    End FunctionFunction BigXOR(ByVal value1 As String, ByVal value2 As String) As Str
    ing
    Dim valueans As String
    Dim loopit As Integer, tempnum As Integer    tempnum = Len(value1) - Len(value2)
        If tempnum < 0 Then
            valueans = Left$(value2, Abs(tempnum))
            value2 = Mid$(value2, Abs(tempnum) + 1)
        ElseIf tempnum > 0 Then
            valueans = Left$(value1, Abs(tempnum))
            value1 = Mid$(value1, tempnum + 1)
        End If    For loopit = 1 To Len(value1)
            valueans = valueans + Hex$(Val("&H" + Mid$(value1, loopit, 1))
    Xor Val("&H" + Mid$(value2, loopit, 1)))
        Next loopit    BigXOR = Right(valueans, 8)
    End Function