[转载]asp MD5加密(16位、32位)代码 - 李俊良的日志 - 网易博客

[转载]asp MD5加密(16位、32位)代码 – 李俊良的日志 – 网易博客.

<%
Private Const Bit2Byt = 8
Private Const Byt2Wor = 4
Private Const Bit2Wor = 32

Private MBit(30)
Private MPow(30)

Private Function LShift(lValue, iShiftBits)
      If iShiftBits = 0 Then
          LShift = lValue
          Exit Function
      ElseIf iShiftBits = 31 Then
          If lValue And 1 Then
              LShift = &H80000000
          Else
              LShift = 0
          End If
          Exit Function
      ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
          Err.Raise 6
      End If

      If (lValue And MPow(31 - iShiftBits)) Then
          LShift = ((lValue And MBit(31 - (iShiftBits + 1))) * MPow(iShiftBits)) Or &H80000000
      Else
          LShift = ((lValue And MBit(31 - iShiftBits)) * MPow(iShiftBits))
      End If
End Function

Private Function RShift(lValue, iShiftBits)
      If iShiftBits = 0 Then
          RShift = lValue
          Exit Function
      ElseIf iShiftBits = 31 Then
          If lValue And &H80000000 Then
              RShift = 1
          Else
              RShift = 0
          End If
          Exit Function
      ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
          Err.Raise 6
      End If
   
      RShift = (lValue And &H7FFFFFFE) \ MPow(iShiftBits)

      If (lValue And &H80000000) Then
          RShift = (RShift Or (&H40000000 \ MPow(iShiftBits - 1)))
      End If
End Function

Private Function RotateLeft(lValue, iShiftBits)
      RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
End Function

Private Function AddUnsigned(lX, lY)
      Dim lX4
      Dim lY4
      Dim lX8
      Dim lY8
      Dim lResult

      lX8 = lX And &H80000000
      lY8 = lY And &H80000000
      lX4 = lX And &H40000000
      lY4 = lY And &H40000000

      lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)

      If lX4 And lY4 Then
          lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
      ElseIf lX4 Or lY4 Then
          If lResult And &H40000000 Then
              lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
          Else
              lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
          End If
      Else
          lResult = lResult Xor lX8 Xor lY8
      End If

      AddUnsigned = lResult
End Function

Private Function md5_F(x, y, z)
      md5_F = (x And y) Or ((Not x) And z)
End Function

Private Function md5_G(x, y, z)
      md5_G = (x And z) Or (y And (Not z))
End Function

Private Function md5_H(x, y, z)
      md5_H = (x Xor y Xor z)
End Function

Private Function md5_I(x, y, z)
      md5_I = (y Xor (x Or (Not z)))
End Function

Private Sub md5_FF(a, b, c, d, x, s, ac)
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
      a = RotateLeft(a, s)
      a = AddUnsigned(a, b)
End Sub

Private Sub md5_GG(a, b, c, d, x, s, ac)
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
      a = RotateLeft(a, s)
      a = AddUnsigned(a, b)
End Sub

Private Sub md5_HH(a, b, c, d, x, s, ac)
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
      a = RotateLeft(a, s)
      a = AddUnsigned(a, b)
End Sub

Private Sub md5_II(a, b, c, d, x, s, ac)
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
      a = RotateLeft(a, s)
      a = AddUnsigned(a, b)
End Sub

Private Function ConvertToWordArray(AsaiWord)
      Dim lMessageLength
      Dim lNumberOfWords
      Dim lWordArray()
      Dim lBytePosition
      Dim lByteCount
      Dim lWordCount
   
      Const MODULUS_BITS = 512
      Const CONGRUENT_BITS = 448
   
      lMessageLength = Len(AsaiWord)
   
      lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ Bit2Byt)) \ (MODULUS_BITS \ Bit2Byt)) + 1) * (MODULUS_BITS \ Bit2Wor)
      ReDim lWordArray(lNumberOfWords - 1)
   
      lBytePosition = 0
      lByteCount = 0
      Do Until lByteCount >= lMessageLength
          lWordCount = lByteCount \ Byt2Wor
          lBytePosition = (lByteCount Mod Byt2Wor) * Bit2Byt
          lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(AsaiWord, lByteCount + 1, 1)), lBytePosition)
          lByteCount = lByteCount + 1
      Loop

      lWordCount = lByteCount \ Byt2Wor
      lBytePosition = (lByteCount Mod Byt2Wor) * Bit2Byt

      lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)

      lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
      lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
   
      ConvertToWordArray = lWordArray
End Function

Private Function WordToHex(lValue)
      Dim lByte
      Dim lCount
   
      For lCount = 0 To 3
          lByte = RShift(lValue, lCount * Bit2Byt) And MBit(Bit2Byt - 1)
          WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
      Next
End Function

Public Function MD5(AsaiWord,DTy)
      MBit(0) = CLng(1)
      MBit(1) = CLng(3)
      MBit(2) = CLng(7)
      MBit(3) = CLng(15)
      MBit(4) = CLng(31)
      MBit(5) = CLng(63)
      MBit(6) = CLng(127)
      MBit(7) = CLng(255)
      MBit(8) = CLng(511)
      MBit(9) = CLng(1023)
      MBit(10) = CLng(2047)
      MBit(11) = CLng(4095)
      MBit(12) = CLng(8191)
      MBit(13) = CLng(16383)
      MBit(14) = CLng(32767)
      MBit(15) = CLng(65535)
      MBit(16) = CLng(131071)
      MBit(17) = CLng(262143)
      MBit(18) = CLng(524287)
      MBit(19) = CLng(1048575)
      MBit(20) = CLng(2097151)
      MBit(21) = CLng(4194303)
      MBit(22) = CLng(8388607)
      MBit(23) = CLng(16777215)
      MBit(24) = CLng(33554431)
      MBit(25) = CLng(67108863)
      MBit(26) = CLng(134217727)
      MBit(27) = CLng(268435455)
      MBit(28) = CLng(536870911)
      MBit(29) = CLng(1073741823)
      MBit(30) = CLng(2147483647)
   
      MPow(0) = CLng(1)
      MPow(1) = CLng(2)
      MPow(2) = CLng(4)
      MPow(3) = CLng(8)
      MPow(4) = CLng(16)
      MPow(5) = CLng(32)
      MPow(6) = CLng(64)
      MPow(7) = CLng(128)
      MPow(8) = CLng(256)
      MPow(9) = CLng(512)
      MPow(10) = CLng(1024)
      MPow(11) = CLng(2048)
      MPow(12) = CLng(4096)
      MPow(13) = CLng(8192)
      MPow(14) = CLng(16384)
      MPow(15) = CLng(32768)
      MPow(16) = CLng(65536)
      MPow(17) = CLng(131072)
      MPow(18) = CLng(262144)
      MPow(19) = CLng(524288)
      MPow(20) = CLng(1048576)
      MPow(21) = CLng(2097152)
      MPow(22) = CLng(4194304)
      MPow(23) = CLng(8388608)
      MPow(24) = CLng(16777216)
      MPow(25) = CLng(33554432)
      MPow(26) = CLng(67108864)
      MPow(27) = CLng(134217728)
      MPow(28) = CLng(268435456)
      MPow(29) = CLng(536870912)
      MPow(30) = CLng(1073741824)

      Dim x
      Dim k
      Dim AA
      Dim BB
      Dim CC
      Dim DD
      Dim a
      Dim b
      Dim c
      Dim d
   
      Const S11 = 7
      Const S12 = 12
      Const S13 = 17
      Const S14 = 22
      Const S21 = 5
      Const S22 = 9
      Const S23 = 14
      Const S24 = 20
      Const S31 = 4
      Const S32 = 11
      Const S33 = 16
      Const S34 = 23
      Const S41 = 6
      Const S42 = 10
      Const S43 = 15
      Const S44 = 21

      x = ConvertToWordArray(AsaiWord)
   
      a = &H67452301
      b = &HEFCDAB89
      c = &H98BADCFE
      d = &H10325476

      For k = 0 To UBound(x) Step 16
          AA = a
          BB = b
          CC = c
          DD = d
   
          md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
          md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
          md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
          md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
          md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
          md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
          md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
          md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
          md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
          md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
          md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
          md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
          md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
          md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
          md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
          md5_FF b, c, d, a, x(k + 15), S14, &H49B40821
   
          md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
          md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
          md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
          md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
          md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
          md5_GG d, a, b, c, x(k + 10), S22, &H2441453
          md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
          md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
          md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
          md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
          md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
          md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
          md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
          md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
          md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
          md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
           
          md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
          md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
          md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
          md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
          md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
          md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
          md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
          md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
          md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
          md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
          md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
          md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
          md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
          md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
          md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
          md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
   
          md5_II a, b, c, d, x(k + 0), S41, &HF4292244
          md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
          md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
          md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
          md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
          md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
          md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
          md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
          md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
          md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
          md5_II c, d, a, b, x(k + 6), S43, &HA3014314
          md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
          md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
          md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
          md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
          md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
   
          a = AddUnsigned(a, AA)
          b = AddUnsigned(b, BB)
          c = AddUnsigned(c, CC)
          d = AddUnsigned(d, DD)
      Next
   
   if DTy=32 then
    MD5=LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
   else
    MD5=LCase(WordToHex(b) & WordToHex(c))
   end if
End Function

Response.Write "“123456”16位加密结果为["&MD5("123456",16)&"]<br />“123456”32位加密结果为["&MD5("123456",32)&"]"
%>
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏