md5.cls
Upload User: cl_dengshi
Upload Date: 2021-11-16
Package Size: 1918k
Code Size: 11k
Category:

Search Engine

Development Platform:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cmd5"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'Option Explicit 'MD5加密类模块
  15. ' Visual Basic MD5 Implementation
  16. ' Robert Hubley and David Midkiff (mdj2023@hotmail.com)
  17. ' modify by simonyan, Support chinese
  18. ' Standard MD5 implementation optimised for the Visual Basic environment.
  19. ' Conforms to all standards and can be used in digital signature or password
  20. ' protection related schemes.
  21. Private Const OFFSET_4 = 4294967296#
  22. Private Const MAXINT_4 = 2147483647
  23. Private State(4) As Long
  24. Private ByteCounter As Long
  25. Private ByteBuffer(63) As Byte
  26. Private Const S11 = 7
  27. Private Const S12 = 12
  28. Private Const S13 = 17
  29. Private Const S14 = 22
  30. Private Const S21 = 5
  31. Private Const S22 = 9
  32. Private Const S23 = 14
  33. Private Const S24 = 20
  34. Private Const S31 = 4
  35. Private Const S32 = 11
  36. Private Const S33 = 16
  37. Private Const S34 = 23
  38. Private Const S41 = 6
  39. Private Const S42 = 10
  40. Private Const S43 = 15
  41. Private Const S44 = 21
  42. Public Function Md5_File_Calc(InFile As String) As String
  43. On Error GoTo errorhandler1
  44. GoSub begin
  45. errorhandler1:
  46.     DigestFileToHexStr = ""
  47.     Exit Function
  48.     
  49. begin:
  50.     Dim FileO As Integer
  51.     FileO = FreeFile
  52.     Call FileLen(InFile)
  53.     Open InFile For Binary Access Read As #FileO
  54.     MD5Init
  55.     Do While Not EOF(FileO)
  56.         Get #FileO, , ByteBuffer
  57.         If Loc(FileO) < LOF(FileO) Then
  58.             ByteCounter = ByteCounter + 64
  59.             MD5Transform ByteBuffer
  60.         End If
  61.     Loop
  62.     ByteCounter = ByteCounter + (LOF(FileO) Mod 64)
  63.     Close #FileO
  64.     MD5Final
  65.     Md5_File_Calc = GetValues
  66. End Function
  67. Private Function StringToArray(InString As String) As Byte()
  68.     Dim I As Integer, bytBuffer() As Byte
  69.     ReDim bytBuffer(LenB(StrConv(InString, vbFromUnicode)))
  70.     bytBuffer = StrConv(InString, vbFromUnicode)
  71.     StringToArray = bytBuffer
  72. End Function
  73. Public Function GetValues() As String
  74.     GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
  75. End Function
  76. Private Function LongToString(Num As Long) As String
  77.         Dim A As Byte, B As Byte, C As Byte, D As Byte
  78.         A = Num And &HFF&
  79.         If A < 16 Then LongToString = "0" & Hex(A) Else LongToString = Hex(A)
  80.         B = (Num And &HFF00&)  256
  81.         If B < 16 Then LongToString = LongToString & "0" & Hex(B) Else LongToString = LongToString & Hex(B)
  82.         C = (Num And &HFF0000)  65536
  83.         If C < 16 Then LongToString = LongToString & "0" & Hex(C) Else LongToString = LongToString & Hex(C)
  84.         If Num < 0 Then D = ((Num And &H7F000000)  16777216) Or &H80& Else D = (Num And &HFF000000)  16777216
  85.         If D < 16 Then LongToString = LongToString & "0" & Hex(D) Else LongToString = LongToString & Hex(D)
  86. End Function
  87. Public Sub MD5Init()
  88.     ByteCounter = 0
  89.     State(1) = UnsignedToLong(1732584193#)
  90.     State(2) = UnsignedToLong(4023233417#)
  91.     State(3) = UnsignedToLong(2562383102#)
  92.     State(4) = UnsignedToLong(271733878#)
  93. End Sub
  94. Public Sub MD5Final()
  95.     Dim dblBits As Double, padding(72) As Byte, lngBytesBuffered As Long
  96.     padding(0) = &H80
  97.     dblBits = ByteCounter * 8
  98.     lngBytesBuffered = ByteCounter Mod 64
  99.     If lngBytesBuffered <= 56 Then MD5Update 56 - lngBytesBuffered, padding Else MD5Update 120 - ByteCounter, padding
  100.     padding(0) = UnsignedToLong(dblBits) And &HFF&
  101.     padding(1) = UnsignedToLong(dblBits)  256 And &HFF&
  102.     padding(2) = UnsignedToLong(dblBits)  65536 And &HFF&
  103.     padding(3) = UnsignedToLong(dblBits)  16777216 And &HFF&
  104.     padding(4) = 0
  105.     padding(5) = 0
  106.     padding(6) = 0
  107.     padding(7) = 0
  108.     MD5Update 8, padding
  109. End Sub
  110. Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
  111.     Dim II As Integer, I As Integer, J As Integer, K As Integer, lngBufferedBytes As Long, lngBufferRemaining As Long, lngRem As Long
  112.     lngBufferedBytes = ByteCounter Mod 64
  113.     lngBufferRemaining = 64 - lngBufferedBytes
  114.     ByteCounter = ByteCounter + InputLen
  115.     If InputLen >= lngBufferRemaining Then
  116.         For II = 0 To lngBufferRemaining - 1
  117.             ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
  118.         Next II
  119.         MD5Transform ByteBuffer
  120.         lngRem = (InputLen) Mod 64
  121.         For I = lngBufferRemaining To InputLen - II - lngRem Step 64
  122.             For J = 0 To 63
  123.                 ByteBuffer(J) = InputBuffer(I + J)
  124.             Next J
  125.             MD5Transform ByteBuffer
  126.         Next I
  127.         lngBufferedBytes = 0
  128.     Else
  129.       I = 0
  130.     End If
  131.     For K = 0 To InputLen - I - 1
  132.         ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K)
  133.     Next K
  134. End Sub
  135. Private Sub MD5Transform(Buffer() As Byte)
  136.     Dim X(16) As Long, A As Long, B As Long, C As Long, D As Long
  137.     
  138.     A = State(1)
  139.     B = State(2)
  140.     C = State(3)
  141.     D = State(4)
  142.     Decode 64, X, Buffer
  143.     FF A, B, C, D, X(0), S11, -680876936
  144.     FF D, A, B, C, X(1), S12, -389564586
  145.     FF C, D, A, B, X(2), S13, 606105819
  146.     FF B, C, D, A, X(3), S14, -1044525330
  147.     FF A, B, C, D, X(4), S11, -176418897
  148.     FF D, A, B, C, X(5), S12, 1200080426
  149.     FF C, D, A, B, X(6), S13, -1473231341
  150.     FF B, C, D, A, X(7), S14, -45705983
  151.     FF A, B, C, D, X(8), S11, 1770035416
  152.     FF D, A, B, C, X(9), S12, -1958414417
  153.     FF C, D, A, B, X(10), S13, -42063
  154.     FF B, C, D, A, X(11), S14, -1990404162
  155.     FF A, B, C, D, X(12), S11, 1804603682
  156.     FF D, A, B, C, X(13), S12, -40341101
  157.     FF C, D, A, B, X(14), S13, -1502002290
  158.     FF B, C, D, A, X(15), S14, 1236535329
  159.     GG A, B, C, D, X(1), S21, -165796510
  160.     GG D, A, B, C, X(6), S22, -1069501632
  161.     GG C, D, A, B, X(11), S23, 643717713
  162.     GG B, C, D, A, X(0), S24, -373897302
  163.     GG A, B, C, D, X(5), S21, -701558691
  164.     GG D, A, B, C, X(10), S22, 38016083
  165.     GG C, D, A, B, X(15), S23, -660478335
  166.     GG B, C, D, A, X(4), S24, -405537848
  167.     GG A, B, C, D, X(9), S21, 568446438
  168.     GG D, A, B, C, X(14), S22, -1019803690
  169.     GG C, D, A, B, X(3), S23, -187363961
  170.     GG B, C, D, A, X(8), S24, 1163531501
  171.     GG A, B, C, D, X(13), S21, -1444681467
  172.     GG D, A, B, C, X(2), S22, -51403784
  173.     GG C, D, A, B, X(7), S23, 1735328473
  174.     GG B, C, D, A, X(12), S24, -1926607734
  175.     HH A, B, C, D, X(5), S31, -378558
  176.     HH D, A, B, C, X(8), S32, -2022574463
  177.     HH C, D, A, B, X(11), S33, 1839030562
  178.     HH B, C, D, A, X(14), S34, -35309556
  179.     HH A, B, C, D, X(1), S31, -1530992060
  180.     HH D, A, B, C, X(4), S32, 1272893353
  181.     HH C, D, A, B, X(7), S33, -155497632
  182.     HH B, C, D, A, X(10), S34, -1094730640
  183.     HH A, B, C, D, X(13), S31, 681279174
  184.     HH D, A, B, C, X(0), S32, -358537222
  185.     HH C, D, A, B, X(3), S33, -722521979
  186.     HH B, C, D, A, X(6), S34, 76029189
  187.     HH A, B, C, D, X(9), S31, -640364487
  188.     HH D, A, B, C, X(12), S32, -421815835
  189.     HH C, D, A, B, X(15), S33, 530742520
  190.     HH B, C, D, A, X(2), S34, -995338651
  191.     II A, B, C, D, X(0), S41, -198630844
  192.     II D, A, B, C, X(7), S42, 1126891415
  193.     II C, D, A, B, X(14), S43, -1416354905
  194.     II B, C, D, A, X(5), S44, -57434055
  195.     II A, B, C, D, X(12), S41, 1700485571
  196.     II D, A, B, C, X(3), S42, -1894986606
  197.     II C, D, A, B, X(10), S43, -1051523
  198.     II B, C, D, A, X(1), S44, -2054922799
  199.     II A, B, C, D, X(8), S41, 1873313359
  200.     II D, A, B, C, X(15), S42, -30611744
  201.     II C, D, A, B, X(6), S43, -1560198380
  202.     II B, C, D, A, X(13), S44, 1309151649
  203.     II A, B, C, D, X(4), S41, -145523070
  204.     II D, A, B, C, X(11), S42, -1120210379
  205.     II C, D, A, B, X(2), S43, 718787259
  206.     II B, C, D, A, X(9), S44, -343485551
  207.     State(1) = LongOverflowAdd(State(1), A)
  208.     State(2) = LongOverflowAdd(State(2), B)
  209.     State(3) = LongOverflowAdd(State(3), C)
  210.     State(4) = LongOverflowAdd(State(4), D)
  211. End Sub
  212. Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
  213.     Dim intDblIndex As Integer, intByteIndex As Integer, dblSum As Double
  214.     For intByteIndex = 0 To Length - 1 Step 4
  215.         dblSum = InputBuffer(intByteIndex) + InputBuffer(intByteIndex + 1) * 256# + InputBuffer(intByteIndex + 2) * 65536# + InputBuffer(intByteIndex + 3) * 16777216#
  216.         OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
  217.         intDblIndex = intDblIndex + 1
  218.     Next intByteIndex
  219. End Sub
  220. Private Function FF(A As Long, B As Long, C As Long, D As Long, X As Long, S As Long, ac As Long) As Long
  221.     A = LongOverflowAdd4(A, (B And C) Or (Not (B) And D), X, ac)
  222.     A = LongLeftRotate(A, S)
  223.     A = LongOverflowAdd(A, B)
  224. End Function
  225. Private Function GG(A As Long, B As Long, C As Long, D As Long, X As Long, S As Long, ac As Long) As Long
  226.     A = LongOverflowAdd4(A, (B And D) Or (C And Not (D)), X, ac)
  227.     A = LongLeftRotate(A, S)
  228.     A = LongOverflowAdd(A, B)
  229. End Function
  230. Private Function HH(A As Long, B As Long, C As Long, D As Long, X As Long, S As Long, ac As Long) As Long
  231.     A = LongOverflowAdd4(A, B Xor C Xor D, X, ac)
  232.     A = LongLeftRotate(A, S)
  233.     A = LongOverflowAdd(A, B)
  234. End Function
  235. Private Function II(A As Long, B As Long, C As Long, D As Long, X As Long, S As Long, ac As Long) As Long
  236.     A = LongOverflowAdd4(A, C Xor (B Or Not (D)), X, ac)
  237.     A = LongLeftRotate(A, S)
  238.     A = LongOverflowAdd(A, B)
  239. End Function
  240. Function LongLeftRotate(value As Long, Bits As Long) As Long
  241.     Dim lngSign As Long, lngI As Long
  242.     Bits = Bits Mod 32
  243.     If Bits = 0 Then LongLeftRotate = value: Exit Function
  244.     For lngI = 1 To Bits
  245.         lngSign = value And &HC0000000
  246.         value = (value And &H3FFFFFFF) * 2
  247.         value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And &H40000000) And &H80000000)
  248.     Next
  249.     LongLeftRotate = value
  250. End Function
  251. Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
  252.     Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
  253.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&)
  254.     lngOverflow = lngLowWord  65536
  255.     lngHighWord = (((Val1 And &HFFFF0000)  65536) + ((Val2 And &HFFFF0000)  65536) + lngOverflow) And &HFFFF&
  256.     LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
  257. End Function
  258. Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
  259.     Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
  260.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&)
  261.     lngOverflow = lngLowWord  65536
  262.     lngHighWord = (((Val1 And &HFFFF0000)  65536) + ((Val2 And &HFFFF0000)  65536) + ((val3 And &HFFFF0000)  65536) + ((val4 And &HFFFF0000)  65536) + lngOverflow) And &HFFFF&
  263.     LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
  264. End Function
  265. Private Function UnsignedToLong(value As Double) As Long
  266.     If value < 0 Or value >= OFFSET_4 Then Error 6
  267.     If value <= MAXINT_4 Then UnsignedToLong = value Else UnsignedToLong = value - OFFSET_4
  268. End Function
  269. Private Function LongToUnsigned(value As Long) As Double
  270.     If value < 0 Then LongToUnsigned = value + OFFSET_4 Else LongToUnsigned = value
  271. End Function
  272. Public Function Md5_String_Calc(SourceString As String) As String
  273.     MD5Init
  274.     MD5Update LenB(StrConv(SourceString, vbFromUnicode)), StringToArray(SourceString)
  275.     MD5Final
  276.     Md5_String_Calc = GetValues
  277. End Function