hbqjxhw 发表于 2006-8-16 14:02:55

MD5之VB的另一种算法源程序

MD5之VB的另一种算法:

Option Explicit

Dim w1 As String, w2 As String, w3 As String, w4 As String

Function MD5F(ByVal tempstr As String, ByVal w As String, ByVal X As String, ByVal Y As String, ByVal z As String, ByVal Xin As String, ByVal qdata As String, ByVal rots As Integer)
MD5F = BigMod32Add(RotLeft(BigMod32Add(BigMod32Add(w, tempstr), BigMod32Add(Xin, qdata)), rots), X)
End Function

Sub MD5F1(w As String, ByVal X As String, ByVal Y As String, ByVal z As String, ByVal Xin As String, ByVal qdata As String, ByVal rots As Integer)
Dim tempstr As String

    tempstr = BigXOR(z, BigAND(X, BigXOR(Y, z)))
    w = MD5F(tempstr, w, X, Y, z, Xin, qdata, rots)
End Sub

Sub MD5F2(w As String, ByVal X As String, ByVal Y As String, ByVal z As String, ByVal Xin As String, ByVal qdata As String, ByVal rots As Integer)
Dim tempstr As String

    tempstr = BigXOR(Y, BigAND(z, BigXOR(X, Y)))
    w = MD5F(tempstr, w, X, Y, z, Xin, qdata, rots)
End Sub

Sub MD5F3(w As String, ByVal X As String, ByVal Y As String, ByVal z As String, ByVal Xin As String, ByVal qdata As String, ByVal rots As Integer)
Dim tempstr As String

    tempstr = BigXOR(X, BigXOR(Y, z))
    w = MD5F(tempstr, w, X, Y, z, Xin, qdata, rots)
End Sub

Sub MD5F4(w As String, ByVal X As String, ByVal Y As String, ByVal z As String, ByVal Xin As String, ByVal qdata As String, ByVal rots As Integer)
Dim tempstr As String

    tempstr = BigXOR(Y, BigOR(X, BigNOT(z)))
    w = MD5F(tempstr, w, X, Y, z, Xin, qdata, rots)
End Sub

Function 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, loopouter As Integer, loopinner As Integer
Dim A As String, b As String, c As String, d As String

    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

   
    buf(0) = "67452301"
    buf(1) = "efcdab89"
    buf(2) = "98badcfe"
    buf(3) = "10325476"

   
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), "2441453", 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), "eaa127fa", 11
      MD5F3 c, d, A, b, Xin(3), "d4ef3085", 16
      MD5F3 b, c, d, A, Xin(6), "4881d05", 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

    For loopit = 0 To 3
      For loopinner = 3 To 0 Step -1
            Text2.Text = Text2.Text & (Mid$(buf(loopit), 1 + 2 * loopinner, 2))
            Next loopinner
    Next loopit

End Function

Function BigMod32Add(ByVal value1 As String, ByVal value2 As String) As String
    BigMod32Add = Right$(BigAdd(value1, value2), 8)
End Function

Public 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 Function

Public 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 = ""

    ' 转换成二进制形式
    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)

    ' 转换为十六进制
    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 Function

Function BigAND(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
      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 Function

Function 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, loopit, 1)))
    Next loopit

    BigNOT = valueans
End Function

Function BigOR(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
      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 Function

Function BigXOR(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
      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


Private Sub Command1_Click()
MD5_Calc (Text1.Text)
End Sub

Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
End Sub

caterpilla 发表于 2006-8-18 19:32:44

支持一下。。。。。。

a1s2d3 发表于 2009-5-19 15:02:09

说一下具体怎么用

rwxqaz 发表于 2011-11-17 22:09:30

谢谢收藏了
页: [1]
查看完整版本: MD5之VB的另一种算法源程序