md5_module.bas
上传用户:luoweizhao
上传日期:2022-08-01
资源大小:1290k
文件大小:13k
源码类别:

外挂编程

开发平台:

Visual Basic

  1. Attribute VB_Name = "md5_module"
  2. Option Explicit
  3. Private Const OFFSET_4 = 4294967296#
  4. Private Const MAXINT_4 = 2147483647
  5. Private Const S11 = 7
  6. Private Const S12 = 12
  7. Private Const S13 = 17
  8. Private Const S14 = 22
  9. Private Const S21 = 5
  10. Private Const S22 = 9
  11. Private Const S23 = 14
  12. Private Const S24 = 20
  13. Private Const S31 = 4
  14. Private Const S32 = 11
  15. Private Const S33 = 16
  16. Private Const S34 = 23
  17. Private Const S41 = 6
  18. Private Const S42 = 10
  19. Private Const S43 = 15
  20. Private Const S44 = 21
  21. Private State(4) As Long
  22. Private ByteCounter As Long
  23. Private ByteBuffer(63) As Byte
  24. Property Get RegisterA() As String
  25.     RegisterA = State(1)
  26. End Property
  27. Property Get RegisterB() As String
  28.     RegisterB = State(2)
  29. End Property
  30. Property Get RegisterC() As String
  31.     RegisterC = State(3)
  32. End Property
  33. Property Get RegisterD() As String
  34.     RegisterD = State(4)
  35. End Property
  36. Public Function DigestFileToHexStr(filename As String) As String
  37.     Open filename For Binary Access Read As #1
  38.     MD5Init
  39.     Do While Not EOF(1)
  40.         Get #1, , ByteBuffer
  41.         If Loc(1) < LOF(1) Then
  42.             ByteCounter = ByteCounter + 64
  43.             MD5Transform ByteBuffer
  44.         End If
  45.     Loop
  46.     ByteCounter = ByteCounter + (LOF(1) Mod 64)
  47.     Close #1
  48.     MD5Final
  49.     DigestFileToHexStr = GetValues
  50. End Function
  51. Public Function md5(SourceString As String) As String
  52.     MD5Init
  53.     MD5Update Len(SourceString), StringToArray(SourceString)
  54.     MD5Final
  55.     md5 = GetValues
  56. End Function
  57. Private Function StringToArray(InString As String) As Byte()
  58.     Dim i As Integer
  59.     Dim bytBuffer() As Byte
  60.     ReDim bytBuffer(Len(InString))
  61.     For i = 0 To Len(InString) - 1
  62.         bytBuffer(i) = Asc(Mid(InString, i + 1, 1))
  63.     Next i
  64.     StringToArray = bytBuffer
  65. End Function
  66. Public Function GetValues() As String
  67.     GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
  68. End Function
  69. Private Function LongToString(Num As Long) As String
  70.         Dim a As Byte
  71.         Dim b As Byte
  72.         Dim c As Byte
  73.         Dim d As Byte
  74.         
  75.         a = Num And &HFF&
  76.         If a < 16 Then
  77.             LongToString = "0" & Hex(a)
  78.         Else
  79.             LongToString = Hex(a)
  80.         End If
  81.                
  82.         b = (Num And &HFF00&)  256
  83.         If b < 16 Then
  84.             LongToString = LongToString & "0" & Hex(b)
  85.         Else
  86.             LongToString = LongToString & Hex(b)
  87.         End If
  88.         
  89.         c = (Num And &HFF0000)  65536
  90.         If c < 16 Then
  91.             LongToString = LongToString & "0" & Hex(c)
  92.         Else
  93.             LongToString = LongToString & Hex(c)
  94.         End If
  95.        
  96.         If Num < 0 Then
  97.             d = ((Num And &H7F000000)  16777216) Or &H80&
  98.         Else
  99.             d = (Num And &HFF000000)  16777216
  100.         End If
  101.         
  102.         If d < 16 Then
  103.             LongToString = LongToString & "0" & Hex(d)
  104.         Else
  105.             LongToString = LongToString & Hex(d)
  106.         End If
  107.     
  108. End Function
  109. '
  110. ' Initialize the class
  111. '   This must be called before a digest calculation is started
  112. '
  113. Public Sub MD5Init()
  114.     ByteCounter = 0
  115.     State(1) = UnsignedToLong(1732584193#)
  116.     State(2) = UnsignedToLong(4023233417#)
  117.     State(3) = UnsignedToLong(2562383102#)
  118.     State(4) = UnsignedToLong(271733878#)
  119. End Sub
  120. '
  121. ' MD5 Final
  122. '
  123. Public Sub MD5Final()
  124.     Dim dblBits As Double
  125.     
  126.     Dim padding(72) As Byte
  127.     Dim lngBytesBuffered As Long
  128.     
  129.     padding(0) = &H80
  130.     
  131.     dblBits = ByteCounter * 8
  132.     
  133.     ' Pad out
  134.     lngBytesBuffered = ByteCounter Mod 64
  135.     If lngBytesBuffered <= 56 Then
  136.         MD5Update 56 - lngBytesBuffered, padding
  137.     Else
  138.         MD5Update 120 - ByteCounter, padding
  139.     End If
  140.     
  141.     
  142.     padding(0) = UnsignedToLong(dblBits) And &HFF&
  143.     padding(1) = UnsignedToLong(dblBits)  256 And &HFF&
  144.     padding(2) = UnsignedToLong(dblBits)  65536 And &HFF&
  145.     padding(3) = UnsignedToLong(dblBits)  16777216 And &HFF&
  146.     padding(4) = 0
  147.     padding(5) = 0
  148.     padding(6) = 0
  149.     padding(7) = 0
  150.     
  151.     MD5Update 8, padding
  152. End Sub
  153. '
  154. ' Break up input stream into 64 byte chunks
  155. '
  156. Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
  157.     Dim II As Integer
  158.     Dim i As Integer
  159.     Dim J As Integer
  160.     Dim K As Integer
  161.     Dim lngBufferedBytes As Long
  162.     Dim lngBufferRemaining As Long
  163.     Dim lngRem As Long
  164.     
  165.     lngBufferedBytes = ByteCounter Mod 64
  166.     lngBufferRemaining = 64 - lngBufferedBytes
  167.     ByteCounter = ByteCounter + InputLen
  168.     ' Use up old buffer results first
  169.     If InputLen >= lngBufferRemaining Then
  170.         For II = 0 To lngBufferRemaining - 1
  171.             ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
  172.         Next II
  173.         MD5Transform ByteBuffer
  174.         
  175.         lngRem = (InputLen) Mod 64
  176.         ' The transfer is a multiple of 64 lets do some transformations
  177.         For i = lngBufferRemaining To InputLen - II - lngRem Step 64
  178.             For J = 0 To 63
  179.                 ByteBuffer(J) = InputBuffer(i + J)
  180.             Next J
  181.             MD5Transform ByteBuffer
  182.         Next i
  183.         lngBufferedBytes = 0
  184.     Else
  185.       i = 0
  186.     End If
  187.     
  188.     ' Buffer any remaining input
  189.     For K = 0 To InputLen - i - 1
  190.         ByteBuffer(lngBufferedBytes + K) = InputBuffer(i + K)
  191.     Next K
  192.     
  193. End Sub
  194. '
  195. ' MD5 Transform
  196. '
  197. Private Sub MD5Transform(Buffer() As Byte)
  198.     Dim X(16) As Long
  199.     Dim a As Long
  200.     Dim b As Long
  201.     Dim c As Long
  202.     Dim d As Long
  203.     
  204.     a = State(1)
  205.     b = State(2)
  206.     c = State(3)
  207.     d = State(4)
  208.     
  209.     Decode 64, X, Buffer
  210.     ' Round 1
  211.     FF a, b, c, d, X(0), S11, -680876936
  212.     FF d, a, b, c, X(1), S12, -389564586
  213.     FF c, d, a, b, X(2), S13, 606105819
  214.     FF b, c, d, a, X(3), S14, -1044525330
  215.     FF a, b, c, d, X(4), S11, -176418897
  216.     FF d, a, b, c, X(5), S12, 1200080426
  217.     FF c, d, a, b, X(6), S13, -1473231341
  218.     FF b, c, d, a, X(7), S14, -45705983
  219.     FF a, b, c, d, X(8), S11, 1770035416
  220.     FF d, a, b, c, X(9), S12, -1958414417
  221.     FF c, d, a, b, X(10), S13, -42063
  222.     FF b, c, d, a, X(11), S14, -1990404162
  223.     FF a, b, c, d, X(12), S11, 1804603682
  224.     FF d, a, b, c, X(13), S12, -40341101
  225.     FF c, d, a, b, X(14), S13, -1502002290
  226.     FF b, c, d, a, X(15), S14, 1236535329
  227.     
  228.     ' Round 2
  229.     GG a, b, c, d, X(1), S21, -165796510
  230.     GG d, a, b, c, X(6), S22, -1069501632
  231.     GG c, d, a, b, X(11), S23, 643717713
  232.     GG b, c, d, a, X(0), S24, -373897302
  233.     GG a, b, c, d, X(5), S21, -701558691
  234.     GG d, a, b, c, X(10), S22, 38016083
  235.     GG c, d, a, b, X(15), S23, -660478335
  236.     GG b, c, d, a, X(4), S24, -405537848
  237.     GG a, b, c, d, X(9), S21, 568446438
  238.     GG d, a, b, c, X(14), S22, -1019803690
  239.     GG c, d, a, b, X(3), S23, -187363961
  240.     GG b, c, d, a, X(8), S24, 1163531501
  241.     GG a, b, c, d, X(13), S21, -1444681467
  242.     GG d, a, b, c, X(2), S22, -51403784
  243.     GG c, d, a, b, X(7), S23, 1735328473
  244.     GG b, c, d, a, X(12), S24, -1926607734
  245.     
  246.     ' Round 3
  247.     HH a, b, c, d, X(5), S31, -378558
  248.     HH d, a, b, c, X(8), S32, -2022574463
  249.     HH c, d, a, b, X(11), S33, 1839030562
  250.     HH b, c, d, a, X(14), S34, -35309556
  251.     HH a, b, c, d, X(1), S31, -1530992060
  252.     HH d, a, b, c, X(4), S32, 1272893353
  253.     HH c, d, a, b, X(7), S33, -155497632
  254.     HH b, c, d, a, X(10), S34, -1094730640
  255.     HH a, b, c, d, X(13), S31, 681279174
  256.     HH d, a, b, c, X(0), S32, -358537222
  257.     HH c, d, a, b, X(3), S33, -722521979
  258.     HH b, c, d, a, X(6), S34, 76029189
  259.     HH a, b, c, d, X(9), S31, -640364487
  260.     HH d, a, b, c, X(12), S32, -421815835
  261.     HH c, d, a, b, X(15), S33, 530742520
  262.     HH b, c, d, a, X(2), S34, -995338651
  263.     
  264.     ' Round 4
  265.     II a, b, c, d, X(0), S41, -198630844
  266.     II d, a, b, c, X(7), S42, 1126891415
  267.     II c, d, a, b, X(14), S43, -1416354905
  268.     II b, c, d, a, X(5), S44, -57434055
  269.     II a, b, c, d, X(12), S41, 1700485571
  270.     II d, a, b, c, X(3), S42, -1894986606
  271.     II c, d, a, b, X(10), S43, -1051523
  272.     II b, c, d, a, X(1), S44, -2054922799
  273.     II a, b, c, d, X(8), S41, 1873313359
  274.     II d, a, b, c, X(15), S42, -30611744
  275.     II c, d, a, b, X(6), S43, -1560198380
  276.     II b, c, d, a, X(13), S44, 1309151649
  277.     II a, b, c, d, X(4), S41, -145523070
  278.     II d, a, b, c, X(11), S42, -1120210379
  279.     II c, d, a, b, X(2), S43, 718787259
  280.     II b, c, d, a, X(9), S44, -343485551
  281.     
  282.     
  283.     State(1) = LongOverflowAdd(State(1), a)
  284.     State(2) = LongOverflowAdd(State(2), b)
  285.     State(3) = LongOverflowAdd(State(3), c)
  286.     State(4) = LongOverflowAdd(State(4), d)
  287. '  /* Zeroize sensitive information.
  288. '*/
  289. '  MD5_memset ((POINTER)x, 0, sizeof (x));
  290.     
  291. End Sub
  292. Private Sub Decode(length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
  293.     Dim intDblIndex As Integer
  294.     Dim intByteIndex As Integer
  295.     Dim dblSum As Double
  296.     
  297.     intDblIndex = 0
  298.     For intByteIndex = 0 To length - 1 Step 4
  299.         dblSum = InputBuffer(intByteIndex) + _
  300.                                     InputBuffer(intByteIndex + 1) * 256# + _
  301.                                     InputBuffer(intByteIndex + 2) * 65536# + _
  302.                                     InputBuffer(intByteIndex + 3) * 16777216#
  303.         OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
  304.         intDblIndex = intDblIndex + 1
  305.     Next intByteIndex
  306. End Sub
  307. '
  308. ' FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  309. ' Rotation is separate from addition to prevent recomputation.
  310. '
  311. Private Function FF(a As Long, _
  312.                     b As Long, _
  313.                     c As Long, _
  314.                     d As Long, _
  315.                     X As Long, _
  316.                     s As Long, _
  317.                     ac As Long) As Long
  318.     a = LongOverflowAdd4(a, (b And c) Or (Not (b) And d), X, ac)
  319.     a = LongLeftRotate(a, s)
  320.     a = LongOverflowAdd(a, b)
  321. End Function
  322. Private Function GG(a As Long, _
  323.                     b As Long, _
  324.                     c As Long, _
  325.                     d As Long, _
  326.                     X As Long, _
  327.                     s As Long, _
  328.                     ac As Long) As Long
  329.     a = LongOverflowAdd4(a, (b And d) Or (c And Not (d)), X, ac)
  330.     a = LongLeftRotate(a, s)
  331.     a = LongOverflowAdd(a, b)
  332. End Function
  333. Private Function HH(a As Long, _
  334.                     b As Long, _
  335.                     c As Long, _
  336.                     d As Long, _
  337.                     X As Long, _
  338.                     s As Long, _
  339.                     ac As Long) As Long
  340.     a = LongOverflowAdd4(a, b Xor c Xor d, X, ac)
  341.     a = LongLeftRotate(a, s)
  342.     a = LongOverflowAdd(a, b)
  343. End Function
  344. Private Function II(a As Long, _
  345.                     b As Long, _
  346.                     c As Long, _
  347.                     d As Long, _
  348.                     X As Long, _
  349.                     s As Long, _
  350.                     ac As Long) As Long
  351.     a = LongOverflowAdd4(a, c Xor (b Or Not (d)), X, ac)
  352.     a = LongLeftRotate(a, s)
  353.     a = LongOverflowAdd(a, b)
  354. End Function
  355. Function LongLeftRotate(value As Long, bits As Long) As Long
  356.     Dim lngSign As Long
  357.     Dim lngI As Long
  358.     bits = bits Mod 32
  359.     If bits = 0 Then LongLeftRotate = value: Exit Function
  360.     For lngI = 1 To bits
  361.         lngSign = value And &HC0000000
  362.         value = (value And &H3FFFFFFF) * 2
  363.         value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And _
  364.                 &H40000000) And &H80000000)
  365.     Next
  366.     LongLeftRotate = value
  367. End Function
  368. Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
  369.     Dim lngHighWord As Long
  370.     Dim lngLowWord As Long
  371.     Dim lngOverflow As Long
  372.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&)
  373.     lngOverflow = lngLowWord  65536
  374.     lngHighWord = (((Val1 And &HFFFF0000)  65536) + ((Val2 And &HFFFF0000)  65536) + lngOverflow) And &HFFFF&
  375.     LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
  376. End Function
  377. Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
  378.     Dim lngHighWord As Long
  379.     Dim lngLowWord As Long
  380.     Dim lngOverflow As Long
  381.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&)
  382.     lngOverflow = lngLowWord  65536
  383.     lngHighWord = (((Val1 And &HFFFF0000)  65536) + _
  384.                    ((Val2 And &HFFFF0000)  65536) + _
  385.                    ((val3 And &HFFFF0000)  65536) + _
  386.                    ((val4 And &HFFFF0000)  65536) + _
  387.                    lngOverflow) And &HFFFF&
  388.     LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
  389. End Function
  390. Private Function UnsignedToLong(value As Double) As Long
  391.         If value < 0 Or value >= OFFSET_4 Then Error 6
  392.         If value <= MAXINT_4 Then
  393.           UnsignedToLong = value
  394.         Else
  395.           UnsignedToLong = value - OFFSET_4
  396.         End If
  397.       End Function
  398. Private Function LongToUnsigned(value As Long) As Double
  399.         If value < 0 Then
  400.           LongToUnsigned = value + OFFSET_4
  401.         Else
  402.           LongToUnsigned = value
  403.         End If
  404. End Function