| ' ════════════════ ' | | ' | MD5加密类模块 | ' ———————————————— ' | Www.SailSoft.Net | ' ════════════════ Option Explicit Private Const OFFSET_4 = 4294967296# Private Const MAXINT_4 = 2147483647 Private State(4) As Long Private ByteCounter As Long Private ByteBuffer(63) As Byte Private Const S11 = 7 Private Const S12 = 12 Private Const S13 = 17 Private Const S14 = 22 Private Const S21 = 5 Private Const S22 = 9 Private Const S23 = 14 Private Const S24 = 20 Private Const S31 = 4 Private Const S32 = 11 Private Const S33 = 16 Private Const S34 = 23 Private Const S41 = 6 Private Const S42 = 10 Private Const S43 = 15 Private Const S44 = 21 Property Get RegisterA() As String RegisterA = State(1) End Property Property Get RegisterB() As String RegisterB = State(2) End Property Property Get RegisterC() As String RegisterC = State(3) End Property Property Get RegisterD() As String RegisterD = State(4) End Property Public Function Md5_String_Calc(SourceString As String) As String MD5Init MD5Update LenB(StrConv(SourceString, vbFromUnicode)), StringToArray(SourceString) MD5Final Md5_String_Calc = GetValues End Function Public Function Md5_File_Calc(InFile As String) As String On Error GoTo errorhandler GoSub begin errorhandler: Md5_File_Calc = "" Exit Function begin: Dim FileO As Integer FileO = FreeFile Call FileLen(InFile) Open InFile For Binary Access Read As #FileO MD5Init Do While Not EOF(FileO) Get #FileO, , ByteBuffer If Loc(FileO) < LOF(FileO) Then ByteCounter = ByteCounter + 64 MD5Transform ByteBuffer End If Loop ByteCounter = ByteCounter + (LOF(FileO) Mod 64) Close #FileO MD5Final Md5_File_Calc = GetValues End Function Private Function StringToArray(InString As String) As Byte() Dim I As Integer, bytBuffer() As Byte ReDim bytBuffer(LenB(StrConv(InString, vbFromUnicode))) bytBuffer = StrConv(InString, vbFromUnicode) StringToArray = bytBuffer End Function Public Function GetValues() As String GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4)) End Function Private Function LongToString(Num As Long) As String Dim A As Byte, B As Byte, C As Byte, d As Byte A = Num And &HFF& If A < 16 Then LongToString = "0" & Hex(A) Else LongToString = Hex(A) B = (Num And &HFF00&) \ 256 If B < 16 Then LongToString = LongToString & "0" & Hex(B) Else LongToString = LongToString & Hex(B) C = (Num And &HFF0000) \ 65536 If C < 16 Then LongToString = LongToString & "0" & Hex(C) Else LongToString = LongToString & Hex(C) If Num < 0 Then d = ((Num And &H7F000000) \ 16777216) Or &H80& Else d = (Num And &HFF000000) \ 16777216 If d < 16 Then LongToString = LongToString & "0" & Hex(d) Else LongToString = LongToString & Hex(d) End Function Public Sub MD5Init() ByteCounter = 0 State(1) = UnsignedToLong(1732584193#) State(2) = UnsignedToLong(4023233417#) State(3) = UnsignedToLong(2562383102#) State(4) = UnsignedToLong(271733878#) End Sub Public Sub MD5Final() Dim dblBits As Double, padding(72) As Byte, lngBytesBuffered As Long padding(0) = &H80 dblBits = ByteCounter * 8 lngBytesBuffered = ByteCounter Mod 64 If lngBytesBuffered <= 56 Then MD5Update 56 - lngBytesBuffered, padding Else MD5Update 120 - ByteCounter, padding padding(0) = UnsignedToLong(dblBits) And &HFF& padding(1) = UnsignedToLong(dblBits) \ 256 And &HFF& padding(2) = UnsignedToLong(dblBits) \ 65536 And &HFF& padding(3) = UnsignedToLong(dblBits) \ 16777216 And &HFF& padding(4) = 0 padding(5) = 0 padding(6) = 0 padding(7) = 0 MD5Update 8, padding End Sub Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte) Dim II As Integer, I As Integer, J As Integer, K As Integer, lngBufferedBytes As Long, lngBufferRemaining As Long, lngRem As Long lngBufferedBytes = ByteCounter Mod 64 lngBufferRemaining = 64 - lngBufferedBytes ByteCounter = ByteCounter + InputLen If InputLen >= lngBufferRemaining Then For II = 0 To lngBufferRemaining - 1 ByteBuffer(lngBufferedBytes + II) = InputBuffer(II) Next II MD5Transform ByteBuffer lngRem = (InputLen) Mod 64 For I = lngBufferRemaining To InputLen - II - lngRem Step 64 For J = 0 To 63 ByteBuffer(J) = InputBuffer(I + J) Next J MD5Transform ByteBuffer Next I lngBufferedBytes = 0 Else I = 0 End If For K = 0 To InputLen - I - 1 ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K) Next K End Sub Private Sub MD5Transform(Buffer() As Byte) Dim X(16) As Long, A As Long, B As Long, C As Long, d As Long A = State(1) B = State(2) C = State(3) d = State(4) Decode 64, X, Buffer FF A, B, C, d, X(0), S11, -680876936 FF d, A, B, C, X(1), S12, -389564586 FF C, d, A, B, X(2), S13, 606105819 FF B, C, d, A, X(3), S14, -1044525330 FF A, B, C, d, X(4), S11, -176418897 FF d, A, B, C, X(5), S12, 1200080426 FF C, d, A, B, X(6), S13, -1473231341 |