MD5 encryption in VB

zhaozj2021-02-08  235

Instructions:

MSGBOX DigestSTRTOHEXSTR ("111")

Source code:

----------- Shear line ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------

Option expedition

'/ ********************************************************** ******************************* * CopyRight (c) 2000 by robert hubley. * '* All rights reserved. *' * * '* This software is provided `` AS IS' 'and any express or implied *' * warranties, including, but not limited to, the implied warranties of * '* merchantability and fitness for a particular purpose, are disclaimed. * '* In no event shall the authors be liable for any direct, indirect, *' * incidental, special, exemplary, or consequential damages (including, but * '* not limited to, procurement of substitute goods or services; loss of use, * '* Data, or profits; or business interface) However caused and on any *' * theory of liability, WHETHER in contract, strict liability, or tort * '* (include NEGLIGENCE OtherWise) Arising in any way out of the use of * '* this software, even if advised of the possibility of self damage. *' * * '******************** *********************************************************** ******** '' cLASS: MD5 '' DESCRIPTION: 'This is a class which encapsulates a set of MD5 Message Digest functions.' MD5 algorithm produces a 128 bit digital fingerprint (signature) from an 'dataset of arbitrary Summarized bells. '

This implementation is derived from the RSA Data Security, Inc. MD5 Message-Digest 'algorithm reference implementation (originally written in C)' 'AUTHOR:' Robert M. Hubley 12/1999 '' 'NOTES:' Network Working Group R. Rivest . 'Request for Comments: 1321 MIT Laboratory for Computer Science' and RSA Data Security, Inc. 'April 1992' '' The MD5 Message-Digest algorithm '' Summary '' This document describes the MD5 message-digest algorithm The 'algorithm takes as input a message of arbitrary length and produces' as output a 128-bit "fingerprint" or "message digest" of the input. 'It is conjectured that it is computationally infeasible to produce' two messages having the same message digest, or to Produce Any 'Message Having a Given Prespecified Target Mess age digest. The MD5 'algorithm is intended for digital signature applications, where a' large file must be "compressed" in a secure manner before being 'encrypted with a private (secret) key under a public-key cryptosystem' such as RSA. '' The MD5 algorithm is designed to be quite fast on 32-bit machines In. 'addition, the MD5 algorithm does not require any large substitution' tables;. the algorithm can be coded quite compactly '' The MD5 algorithm is an extension of THE MD4 Message-Digest Algorithm '

. 1,2] MD5 is slightly slower than MD4, but is more "conservative" in '. Design MD5 was designed because it was felt that MD4 was perhaps' being adopted for use more quickly than justified by the existing' critical review; because MD4 was designed to be exceptionally fast, 'it is "at the edge" in terms of risking successful cryptanalytic' attack. MD5 backs off a bit, giving up a little in speed for a much 'greater likelihood of ultimate security. It incorporates some . 'suggestions made by various reviewers, and contains additional' optimizations The MD5 algorithm is being placed in the public domain 'for review and possible adoption as a standard.' 'RFC Author:' Ronald L.Rivest 'Massachusetts Institute of Technology' Laboratory FOR Computer Science 'NE43-324545 Technology Square' Cambridge, MA 02139-1986 'Phone: (617) 253-5880' Email: Rivest @ THE ory.lcs.mit.edu '' '' CHANGE HISTORY: '' 0.1.0 RMH 1999/12/29 Original version '' '=' = Class Constants' = Private Const OFFSET_4 = 4294967296 # Private Const MAXINT_4 = 2147483647

Private Const S11 = 7Private Const S12 = 12Private Const S13 = 17Private Const S14 = 22Private Const S21 = 5Private Const S22 = 9Private Const S23 = 14Private Const S24 = 20Private Const S31 = 4Private Const S32 = 11Private Const S33 = 16Private Const S34 = 23Private Const S41 = 6Private const S42 = 10Private const S43 = 15Private const S44 = 21 '=' = Class Variables' = private state (4) as longprivate bytecounter as longprivate bytebuffer (63) AS BYTE

'=' = Class Properties' = 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

'=' = Class functions' =

'' Function to quickly digest a file into a hex string'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

'' Function to digest a text string and output the result as a string 'of hexadecimal characters.'Public Function DigestStrToHexStr (SourceString As String) As String MD5Init MD5Update Len (SourceString), StringToArray (SourceString) MD5Final DigestStrToHexStr = GetValuesEnd Function' 'A utility function which converts a string into an array of 'bytes.'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 = BYTBUFFEREND FUNCTION

'' Concatenate the four state vaules into one string'Public Function GetValues ​​() As String GetValues ​​= LongToString (State (1)) & LongToString (State (2)) & LongToString (State (3)) & LongToString (State (4) ) End function

'' Convert a long to a hex string'prince function longtostring (number 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 Endiffstring = longtostring & "0" & ​​hex (d) else longtotring = 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, PaddInd 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 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, -358537222HH 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, -99538651 '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, 187333359 II D, A, B, C, X (15), S42, -30611744 II C, D, A, B, X (6), S43, -1560198380 II B , C, D, A, X (4), S44, 1309151649 II A, B, C, D, X (4), S41, -14523070 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 intByteIndexEnd Sub '' FF, GG, HH, AND II TRANSFORMATIONS for Rounds 1, 2, 3, And 4. 'Rotation IS Separate from Addition to Prevent Recomput.'Private Function FF (A As Long, _ B As Long, _ C AS Long, _ d as long, _ x as long, _ s long, _ ac as long) As long a = LongoverflowAdd4 (A, (B And C) OR (NOT (B) and D), X, AC) a = longlefway (a, s) a = longoverflowadd (a, b) end function

Private function gg (A as long, _ b as long, _ c as long, _ d as long, _ x ask, _ s long, _ ac as long) As long a = longoverflowadd4 (A, (B And D) ) OR (C and NOT), 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 ask, _ s 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 functionprivate function II (A as long, _ b as long, _ c as long, _ d as long, _ x askON , _ 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

'' Rotate a long to the right'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 = valueEnd Function

'' Function to add two unsigned numbers together as in C. 'Overflows are ignored!' 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 '' Function to add two unsigned numbers together as in C. 'Overflows are ignored!' Private Function LongOverflowAdd4 (Val1 As Long, Val2 As Long, val3 As Long, val4 AS Long 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

'' Convert an unsigned double into a long'Private Function UnsignedToLong (value As Double) As Long If value <0 Or value> = OFFSET_4 Then Error 6 'Overflow If value <= MAXINT_4 Then UnsignedToLong = value Else UnsignedToLong = value - OFFSET_4 End IF end function

转载请注明原文地址:https://www.9cbs.com/read-2529.html

New Post(0)