首页 > 考试 > 等级考试 > 二级 > Visual Basic >

经典加密算法在VB中的实现:MD5

2010-03-30

 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 S  tring, ByVal y As String, ByVal z As String, ByVal Xin As Strin

 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 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 Function
  Sub 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 Sub
  Sub 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 Sub
  Sub 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 Sub
  Sub 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 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, 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
  Function BigMod32Add(ByVal value1 As String, ByVal value2 As String) A
  s 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 Fu

相关文章
最新文章
热点推荐