VB's MD5 class

xiaoxiao2021-03-06  15

Option expedition

'Visual Basic MD5 IMPLEMENTATION

'Robert Hubley and David Midkiff

Mdj2023@hotmail.com)

'Modify by Simonyan, Support Chinese

'Standard MD5 Implementation Optimised for the Visual Basic Environment.

'Conforms to All Standards and Can Be Used in Digital Signature Or Password

'Protection Related Schemes.

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, Vbfromunicate), 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

DigestFileTohexStr = ""

EXIT FUNCTION

Begin:

DIM Fileo As INTEGER

Fileo = freefile

Call Filelen (Infile)

Open infile for binary access read as # fileomd5init

Do While Not Eof (Fileo)

Get #fileo, Bytebuffer

IF LOC (Fileo)

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 (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 & HFF &

IF a <16 killing = "0" & ​​hex (a) else longtostring = HEX (a)

B = (Num and & HFF00 &) / 256

IF B <161 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 = BYTECUNTER * 8

LNGBYTESBUFFERED = Bytecounter MOD 64

IF lngbytesbuffered <= 56 Then Md5Update 56 - lngbytesbuffered, padding else md5update 120 - Bytecounter, Padding

Padding (0) = unsignedtolong (dblbits) and & HFF & HFF &

Padding (1) = unsignedtolong (dblbits) / 256 and & HFF & HFF &

Padding (2) = unsignedtolong (dblbits) / 65536 and & HFF & HFF & HFF & HFF &

Padding (3) = unsignedtolong (dblbits) / 16777216 and & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF & HFF &

Padding (4) = 0

Padding (5) = 0

Padding (6) = 0

Padding (7) = 0

MD5UPDATE 8, PADDING

End Sub

Public Sub MD5Update (InputBuffer () AS BYTE)

DIM II AS INTEGER, I AS Integer, J AS Integer, K AS Integer, LNGBufferremaining As Long, LNGREM As Long

lngbufferedBytes = bytecounter mod 64

LNGBufferRemaining = 64 - lngbufferedbytes

Bytecounter = bytecounter Inputlen

IF infutlen> = 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

Fork = 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

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

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

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, 681279174HH 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

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)

End Sub

Private sub decode (Length as integer () as long, inputbuffer () as Byte

DIM INTDBLINDEX AS INTEGER, INTBYTEINDEX AS INTEGER, DBLSUM AS DOUBLE

For intbyteindex = 0 to Length - 1 Step 4

DBLSUM = INPUTBUFFER (INTBYTEINDEX) INPUTBUFFER (INTBYTEINDEX 1) * 256 # InputBuffer (intbyteindex 2) * 65536 # InputBuffer (intbyteindex 3) * 16777216 #

OutputBuffer (INTDDBLINDEX) = unsignedtolong (dblsum)

INTDBLINDEX = INTDBLINDEX 1

Next INTBYTEINDEX

End Sub

PRIVATE FUNCTION FF (A AS Long, B 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, 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, 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, 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, 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 & H3ffffffff) * 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, LNGLOWORD AS Long, LNGOVERFLOW AS Long

LNGLOWORD = (VAL1 and & HFFFF &) (Val2 and & HFFF &)

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, Val4 As Long AS LONG

Dim Lnghighword As Long, LNGLOWORD AS Long, LNGOVERFLOW AS Long

LNGLOWWORD = (VAL1 and & HFFFF &) (VAL3 and & HFFFF &) (VAL4 and & HFFFF &)

LNGOVERFLOW = LNGLOWWORD / 65536

LNGHIGHWORD = ((VAL1 and & HFFFF0000) / 65536) (Val2 and & Hfff0000) / 65536) (VAL3 and & HFFF0000) / 65536) ((VAL4 AND & HFFF0000) / 65536) LNGOVERFLOW) and & HFFFF & HFFF &

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 FUNCTION

Private Function Longtounsigned (Value As Long) AS DOUBLE

IF value <0 Then Longtounsigned = value offset_4 else longtounsigned = value

END FUNCTION

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

New Post(0)