首页 » Visual Basic » vb中的sha1散列算法、md5算法代码
vb中的sha1散列算法、md5算法代码
代码详见内页,用这个能制作效验文件md5的工具,你懂的
Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private LongBits(0 To 31) As Long Private Count As Long 'Private Buffer(0 To 511) As Byte Private X(0 To 63) As Byte Private State(0 To 4) As Long 'ROTATE_LEFT rotates x left n bits. Private Function ROTATE_LEFT(ByVal X As Long, ByVal n As Long) As Long Dim After_n As Long, Before_n As Long After_n = X And (LongBits(&H1F Xor n) - 1) Before_n = (X And &H7FFFFFFF) \ LongBits(32 - n) ROTATE_LEFT = After_n * LongBits(n) Or Before_n If X And LongBits(&H1F Xor n) Then ROTATE_LEFT = ROTATE_LEFT Or &H80000000 If X And &H80000000 Then ROTATE_LEFT = ROTATE_LEFT Or LongBits(n - 1) End Function Private Sub HashBegin() Count = 0 State(0) = &H67452301 State(1) = &HEFCDAB89 State(2) = &H98BADCFE State(3) = &H10325476 State(4) = &HC3D2E1F0 End Sub Private Sub HashEnd() Dim Padding() As Byte Dim Index As Long, PadLen As Long Dim TempCount As Currency TempCount = Count * 0.0008@ Index = Count And &H3F PadLen = IIf(Index < 56, 56 - Index, 120 - Index) ReDim Padding(0 To PadLen - 1) Padding(0) = &H80 Call InputData(Padding) ReDim Padding(0 To 7) Call CopyMemory(Padding(0), TempCount, 8) Dim i As Long For i = 0 To 3 Padding(i) = Padding(i) Xor Padding(7 - i) Padding(7 - i) = Padding(7 - i) Xor Padding(i) Padding(i) = Padding(i) Xor Padding(7 - i) Next Call InputData(Padding) End Sub Private Sub InputData(ByRef Data() As Byte) Dim Length As Long Length = UBound(Data) - LBound(Data) + 1 Dim i As Long, Index As Long, PartLen As Long 'Compute number of bytes mod 64 Index = Count And &H3F 'update number of bits Count = Count + Length PartLen = 64 - Index 'transform as many times as possible. If Length >= PartLen Then Call CopyMemory(X(Index), Data(0), PartLen) Call Transform '(Buffer) Index = 0 For i = PartLen To Length - 64 Step 64 Call CopyMemory(X(0), Data(i), 64) Call Transform '(Buffer) Next End If 'Buffer remaining input If Length - i > 0 Then Call CopyMemory(X(Index), Data(i), Length - i) End Sub Private Sub Transform() Dim A As Long, B As Long, C As Long, D As Long, E As Long A = State(0) B = State(1) C = State(2) D = State(3) E = State(4) Dim i As Long Dim Temp As Long Dim M(0 To 15 + 64) As Long For i = 0 To 63 Step 4 X(i + 0) = X(i + 0) Xor X(i + 3) X(i + 3) = X(i + 3) Xor X(i + 0) X(i + 0) = X(i + 0) Xor X(i + 3) X(i + 1) = X(i + 1) Xor X(i + 2) X(i + 2) = X(i + 2) Xor X(i + 1) X(i + 1) = X(i + 1) Xor X(i + 2) Next Call CopyMemory(M(0), X(0), 64) For i = 16 To 79 M(i) = ROTATE_LEFT(M(i - 3) Xor M(i - 8) Xor M(i - 14) Xor M(i - 16), 1) Next For i = 0 To 19 Temp = &H5A827999 Temp = LongOverflowAdd(Temp, ROTATE_LEFT(A, 5)) Temp = LongOverflowAdd(Temp, B And C Or Not B And D) Temp = LongOverflowAdd(Temp, E) Temp = LongOverflowAdd(Temp, M(i)) E = D D = C C = ROTATE_LEFT(B, 30) B = A A = Temp Next For i = 20 To 39 Temp = &H6ED9EBA1 Temp = LongOverflowAdd(Temp, ROTATE_LEFT(A, 5)) Temp = LongOverflowAdd(Temp, B Xor C Xor D) Temp = LongOverflowAdd(Temp, E) Temp = LongOverflowAdd(Temp, M(i)) E = D D = C C = ROTATE_LEFT(B, 30) B = A A = Temp Next For i = 40 To 59 Temp = &H8F1BBCDC Temp = LongOverflowAdd(Temp, ROTATE_LEFT(A, 5)) Temp = LongOverflowAdd(Temp, B And C Or B And D Or C And D) Temp = LongOverflowAdd(Temp, E) Temp = LongOverflowAdd(Temp, M(i)) E = D D = C C = ROTATE_LEFT(B, 30) B = A A = Temp Next For i = 60 To 79 Temp = &HCA62C1D6 Temp = LongOverflowAdd(Temp, ROTATE_LEFT(A, 5)) Temp = LongOverflowAdd(Temp, B Xor C Xor D) Temp = LongOverflowAdd(Temp, E) Temp = LongOverflowAdd(Temp, M(i)) E = D D = C C = ROTATE_LEFT(B, 30) B = A A = Temp Next State(0) = LongOverflowAdd(State(0), A) State(1) = LongOverflowAdd(State(1), B) State(2) = LongOverflowAdd(State(2), C) State(3) = LongOverflowAdd(State(3), D) State(4) = LongOverflowAdd(State(4), E) End Sub Private Function LongOverflowAdd(ByVal A As Long, ByVal B As Long) As Long If (A Xor B) And &H80000000 Then LongOverflowAdd = A + B Else LongOverflowAdd = (A Xor &H80000000) + B Xor &H80000000 End If End Function Private Function LongToString(ByVal Value As Long) As String LongToString = Hex$(Value) If Len(LongToString) < 8 Then LongToString = String$(8 - Len(LongToString), "0") & LongToString End Function Public Function DigestByteToHexStr(SourceByte() As Byte) As String Call HashBegin Call InputData(SourceByte) Call HashEnd DigestByteToHexStr = LongToString(State(0)) & LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4)) End Function Public Function DigestStrToHexStr(ByRef SourceString As String) As String DigestStrToHexStr = DigestByteToHexStr(StrConv(SourceString, vbFromUnicode)) End Function Public Function DigestFileToHexStr(ByRef FilePath As String) As String If Len(Dir$(FilePath)) Then Dim F1 As Long, FileBuffer() As Byte, i As Long, j As Long F1 = FreeFile Open FilePath For Binary Access Read As #F1 Call HashBegin ReDim FileBuffer(0 To 65535) For i = 1 To LOF(F1) \ 65536 DoEvents Get #F1, , FileBuffer Call InputData(FileBuffer) Next i = LOF(F1) And &HFFFF& If i Then ReDim FileBuffer(0 To i - 1) Get #F1, , FileBuffer Call InputData(FileBuffer) End If Count = LOF(F1) Close #F1 Call HashEnd DigestFileToHexStr = LongToString(State(0)) & LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4)) End If End Function Private Sub Class_Initialize() Dim i As Long LongBits(0) = 1 For i = 1 To 30 LongBits(i) = LongBits(i - 1) * 2 Next LongBits(31) = &H80000000 End Sub
以下是md5的
Private Const OFFSET_4 = 4294967296# Private Const MAXINT_4 = 2147483647 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 Private State(4) As Long Private ByteCounter As Long Private ByteBuffer(63) As Byte 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 DigestFileToHexStr(FileName As String) As String Open FileName For Binary Access Read As #1 MD5Init Do While Not EOF(1) Get #1, , ByteBuffer If Loc(1) < LOF(1) Then ByteCounter = ByteCounter + 64 MD5Transform ByteBuffer End If Loop ByteCounter = ByteCounter + (LOF(1) Mod 64) Close #1 MD5Final DigestFileToHexStr = GetValues End Function Public Function DigestStrToHexStr(SourceString As String) As String MD5Init MD5Update Len(SourceString), StringToArray(SourceString) MD5Final DigestStrToHexStr = GetValues End Function Private Function StringToArray(InString As String) As Byte() Dim I As Integer Dim bytBuffer() As Byte ReDim bytBuffer(Len(InString)) For I = 0 To Len(InString) - 1 bytBuffer(I) = Asc(Mid(InString, I + 1, 1)) Next I 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 Dim b As Byte Dim c As Byte Dim d As Byte a = Num And &HFF& If a < 16 Then LongToString = "0" & Hex(a) Else LongToString = Hex(a) End If b = (Num And &HFF00&) \ 256 If b < 16 Then LongToString = LongToString & "0" & Hex(b) Else LongToString = LongToString & Hex(b) End If c = (Num And &HFF0000) \ 65536 If c < 16 Then LongToString = LongToString & "0" & Hex(c) Else LongToString = LongToString & Hex(c) End If If Num < 0 Then d = ((Num And &H7F000000) \ 16777216) Or &H80& Else d = (Num And &HFF000000) \ 16777216 End If If d < 16 Then LongToString = LongToString & "0" & Hex(d) Else LongToString = LongToString & Hex(d) End If End Function ' ' Initialize the class ' This must be called before a digest calculation is started ' Public Sub MD5Init() ByteCounter = 0 State(1) = UnsignedToLong(1732584193#) State(2) = UnsignedToLong(4023233417#) State(3) = UnsignedToLong(2562383102#) State(4) = UnsignedToLong(271733878#) End Sub ' ' MD5 Final ' Public Sub MD5Final() Dim dblBits As Double Dim padding(72) As Byte Dim lngBytesBuffered As Long padding(0) = &H80 dblBits = ByteCounter * 8 ' Pad out lngBytesBuffered = ByteCounter Mod 64 If lngBytesBuffered <= 56 Then MD5Update 56 - lngBytesBuffered, padding Else MD5Update 120 - ByteCounter, padding End If 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 ' ' Break up input stream into 64 byte chunks ' Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte) Dim II As Integer Dim I As Integer Dim J As Integer Dim K As Integer Dim lngBufferedBytes As Long Dim lngBufferRemaining As Long Dim lngRem As Long lngBufferedBytes = ByteCounter Mod 64 lngBufferRemaining = 64 - lngBufferedBytes ByteCounter = ByteCounter + InputLen ' Use up old buffer results first If InputLen >= lngBufferRemaining Then For II = 0 To lngBufferRemaining - 1 ByteBuffer(lngBufferedBytes + II) = InputBuffer(II) Next II MD5Transform ByteBuffer lngRem = (InputLen) Mod 64 ' The transfer is a multiple of 64 lets do some transformations 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 ' Buffer any remaining input For K = 0 To InputLen - I - 1 ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K) Next K End Sub ' ' MD5 Transform ' Private Sub MD5Transform(Buffer() As Byte) Dim x(16) As Long Dim a As Long Dim b As Long Dim c As Long Dim d As Long a = State(1) b = State(2) c = State(3) d = State(4) Decode 64, x, Buffer ' Round 1 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 FF b, c, d, a, x(7), S14, -45705983 FF a, b, c, d, x(8), S11, 1770035416 FF d, a, b, c, x(9), S12, -1958414417 FF c, d, a, b, x(10), S13, -42063 FF b, c, d, a, x(11), S14, -1990404162 FF a, b, c, d, x(12), S11, 1804603682 FF d, a, b, c, x(13), S12, -40341101 FF c, d, a, b, x(14), S13, -1502002290 FF b, c, d, a, x(15), S14, 1236535329 ' Round 2 GG a, b, c, d, x(1), S21, -165796510 GG d, a, b, c, x(6), S22, -1069501632 GG c, d, a, b, x(11), S23, 643717713 GG b, c, d, a, x(0), S24, -373897302 GG a, b, c, d, x(5), S21, -701558691 GG d, a, b, c, x(10), S22, 38016083 GG c, d, a, b, x(15), S23, -660478335 GG b, c, d, a, x(4), S24, -405537848 GG a, b, c, d, x(9), S21, 568446438 GG d, a, b, c, x(14), S22, -1019803690 GG c, d, a, b, x(3), S23, -187363961 GG b, c, d, a, x(8), S24, 1163531501 GG a, b, c, d, x(13), S21, -1444681467 GG d, a, b, c, x(2), S22, -51403784 GG c, d, a, b, x(7), S23, 1735328473 GG b, c, d, a, x(12), S24, -1926607734 ' Round 3 HH a, b, c, d, x(5), S31, -378558 HH d, a, b, c, x(8), S32, -2022574463 HH c, d, a, b, x(11), S33, 1839030562 HH b, c, d, a, x(14), S34, -35309556 HH a, b, c, d, x(1), S31, -1530992060 HH d, a, b, c, x(4), S32, 1272893353 HH c, d, a, b, x(7), S33, -155497632 HH b, c, d, a, x(10), S34, -1094730640 HH a, b, c, d, x(13), S31, 681279174 HH d, a, b, c, x(0), S32, -358537222 HH c, d, a, b, x(3), S33, -722521979 HH b, c, d, a, x(6), S34, 76029189 HH a, b, c, d, x(9), S31, -640364487 HH d, a, b, c, x(12), S32, -421815835 HH c, d, a, b, x(15), S33, 530742520 HH b, c, d, a, x(2), S34, -995338651 ' Round 4 II a, b, c, d, x(0), S41, -198630844 II d, a, b, c, x(7), S42, 1126891415 II c, d, a, b, x(14), S43, -1416354905 II b, c, d, a, x(5), S44, -57434055 II a, b, c, d, x(12), S41, 1700485571 II d, a, b, c, x(3), S42, -1894986606 II c, d, a, b, x(10), S43, -1051523 II b, c, d, a, x(1), S44, -2054922799 II a, b, c, d, x(8), S41, 1873313359 II d, a, b, c, x(15), S42, -30611744 II c, d, a, b, x(6), S43, -1560198380 II b, c, d, a, x(13), S44, 1309151649 II a, b, c, d, x(4), S41, -145523070 II d, a, b, c, x(11), S42, -1120210379 II c, d, a, b, x(2), S43, 718787259 II b, c, d, a, x(9), S44, -343485551 State(1) = LongOverflowAdd(State(1), a) State(2) = LongOverflowAdd(State(2), b) State(3) = LongOverflowAdd(State(3), c) State(4) = LongOverflowAdd(State(4), d) ' /* Zeroize sensitive information. '*/ ' MD5_memset ((POINTER)x, 0, sizeof (x)); End Sub Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte) Dim intDblIndex As Integer Dim intByteIndex As Integer Dim dblSum As Double intDblIndex = 0 For intByteIndex = 0 To Length - 1 Step 4 dblSum = InputBuffer(intByteIndex) + _ InputBuffer(intByteIndex + 1) * 256# + _ InputBuffer(intByteIndex + 2) * 65536# + _ InputBuffer(intByteIndex + 3) * 16777216# OutputBuffer(intDblIndex) = UnsignedToLong(dblSum) intDblIndex = intDblIndex + 1 Next intByteIndex End Sub ' ' FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. ' Rotation is separate from addition to prevent recomputation. ' 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 a = LongOverflowAdd4(a, (b And c) Or (Not (b) And d), x, ac) a = LongLeftRotate(a, s) a = LongOverflowAdd(a, b) End Function 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 a = LongOverflowAdd4(a, (b And d) Or (c And Not (d)), x, ac) a = LongLeftRotate(a, s) a = LongOverflowAdd(a, b) End Function 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 a = LongOverflowAdd4(a, b Xor c Xor d, x, ac) a = LongLeftRotate(a, s) a = LongOverflowAdd(a, b) End Function 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 a = LongOverflowAdd4(a, c Xor (b Or Not (d)), x, ac) a = LongLeftRotate(a, s) a = LongOverflowAdd(a, b) End Function Function LongLeftRotate(value As Long, bits As Long) As Long Dim lngSign As Long Dim lngI As Long bits = bits Mod 32 If bits = 0 Then LongLeftRotate = value: Exit Function For lngI = 1 To bits lngSign = value And &HC0000000 value = (value And &H3FFFFFFF) * 2 value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And _ &H40000000) And &H80000000) Next LongLeftRotate = value End Function Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long Dim lngHighWord As Long Dim lngLowWord As Long Dim lngOverflow As Long lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) lngOverflow = lngLowWord \ 65536 lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF& LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&)) End Function Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long Dim lngHighWord As Long Dim lngLowWord As Long Dim lngOverflow As Long lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&) lngOverflow = lngLowWord \ 65536 lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + _ ((Val2 And &HFFFF0000) \ 65536) + _ ((val3 And &HFFFF0000) \ 65536) + _ ((val4 And &HFFFF0000) \ 65536) + _ lngOverflow) And &HFFFF& LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&)) End Function Private Function UnsignedToLong(value As Double) As Long If value < 0 Or value >= OFFSET_4 Then Error 6 If value <= MAXINT_4 Then UnsignedToLong = value Else UnsignedToLong = value - OFFSET_4 End If End Function Private Function LongToUnsigned(value As Long) As Double If value < 0 Then LongToUnsigned = value + OFFSET_4 Else LongToUnsigned = value End If End Function
'使用方法,添加一个类模块,将上面的代码粘贴进去,然后重命名此类模块为 vbsha1 名字随便取,调用就是 'Set sha1 = New vbsha1 'MsgBox sha1.DigestFileToHexStr("C:\b1.png") 'MsgBox sha1.DigestStrToHexStr("suntw")
上一篇: asp检查文件编码是不是utf8
下一篇: 一次网购的经验
目前这篇文章有5条评论(Rss)