$OPTION WEAKTYPE ON
$OPTION VBDLL ON
Private CONST BITS_TO_A_BYTE AS LONG = 8
Private CONST BYTES_TO_A_WORD AS LONG = 4
Private CONST BITS_TO_A_WORD AS LONG = BYTES_TO_A_WORD * BITS_TO_A_BYTE
DIM m_lOnBits(0 TO 30) AS LONG
DIM m_l2Power(0 TO 30) AS LONG
DIM TEMP AS LONG
m_lOnBits(0) = 1
m_lOnBits(1) = 3
m_lOnBits(2) = 7
m_lOnBits(3) = 15
m_lOnBits(4) = 31
m_lOnBits(5) = 63
m_lOnBits(6) = 127
m_lOnBits(7) = 255
m_lOnBits(8) = 511
m_lOnBits(9) = 1023
m_lOnBits(10) = 2047
m_lOnBits(11) = 4095
m_lOnBits(12) = 8191
m_lOnBits(13) = 16383
m_lOnBits(14) = 32767
m_lOnBits(15) = 65535
m_lOnBits(16) = 131071
m_lOnBits(17) = 262143
m_lOnBits(18) = 524287
m_lOnBits(19) = 1048575
m_lOnBits(20) = 2097151
m_lOnBits(21) = 4194303
m_lOnBits(22) = 8388607
m_lOnBits(23) = 16777215
m_lOnBits(24) = 33554431
m_lOnBits(25) = 67108863
m_lOnBits(26) = 134217727
m_lOnBits(27) = 268435455
m_lOnBits(28) = 536870911
m_lOnBits(29) = 1073741823
m_lOnBits(30) = 2147483647
m_l2Power(0) = 1
m_l2Power(1) = 2
m_l2Power(2) = 4
m_l2Power(3) = 8
m_l2Power(4) = 16
m_l2Power(5) = 32
m_l2Power(6) = 64
m_l2Power(7) = 128
m_l2Power(8) = 256
m_l2Power(9) = 512
m_l2Power(10) = 1024
m_l2Power(11) = 2048
m_l2Power(12) = 4096
m_l2Power(13) = 8192
m_l2Power(14) = 16384
m_l2Power(15) = 32768
m_l2Power(16) = 65536
m_l2Power(17) = 131072
m_l2Power(18) = 262144
m_l2Power(19) = 524288
m_l2Power(20) = 1048576
m_l2Power(21) = 2097152
m_l2Power(22) = 4194304
m_l2Power(23) = 8388608
m_l2Power(24) = 16777216
m_l2Power(25) = 33554432
m_l2Power(26) = 67108864
m_l2Power(27) = 134217728
m_l2Power(28) = 268435456
m_l2Power(29) = 536870912
m_l2Power(30) = 1073741824
Private FUNCTION LShift(BYVAL lValue AS LONG, _
BYVAL iShiftBits AS INTEGER) AS LONG
IF iShiftBits = 0 THEN
TEMP = lValue
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits = 31 THEN
IF lValue AND 1 THEN
TEMP = &H80000000
ELSE
TEMP = 0
END IF
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits < 0 OR iShiftBits > 31 THEN
END IF
IF (lValue AND m_l2Power(31 - iShiftBits)) THEN
TEMP = ((lValue AND m_lOnBits(31 - (iShiftBits + 1))) * _
m_l2Power(iShiftBits)) OR &H80000000
ELSE
TEMP = ((lValue AND m_lOnBits(31 - iShiftBits)) * _
m_l2Power(iShiftBits))
END IF
result = TEMP
END FUNCTION
Private FUNCTION RShift(BYVAL lValue AS LONG, _
BYVAL iShiftBits AS INTEGER) AS LONG
IF iShiftBits = 0 THEN
TEMP = lValue
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits = 31 THEN
IF lValue AND &H80000000 THEN
TEMP = 1
ELSE
TEMP = 0
END IF
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits < 0 OR iShiftBits > 31 THEN
END IF
TEMP = (lValue AND &H7FFFFFFE) \ m_l2Power(iShiftBits)
IF (lValue AND &H80000000) THEN
TEMP = (TEMP OR (&H40000000 \ m_l2Power(iShiftBits - 1)))
END IF
result = TEMP
END FUNCTION
Private FUNCTION RShiftSigned(BYVAL lValue AS LONG, _
BYVAL iShiftBits AS INTEGER) AS LONG
IF iShiftBits = 0 THEN
TEMP = lValue
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits = 31 THEN
IF (lValue AND &H80000000) THEN
TEMP = -1
ELSE
TEMP = 0
END IF
result = TEMP
EXIT FUNCTION
ELSEIF iShiftBits < 0 OR iShiftBits > 31 THEN
END IF
TEMP = INT(lValue / m_l2Power(iShiftBits))
result = TEMP
END FUNCTION
Private FUNCTION RotateLeft(BYVAL lValue AS LONG, _
BYVAL iShiftBits AS INTEGER) AS LONG
result = LShift(lValue, iShiftBits) OR RShift(lValue, (32 - iShiftBits))
END FUNCTION
Private FUNCTION AddUnsigned(BYVAL lX AS LONG, _
BYVAL lY AS LONG) AS LONG
DIM lX4 AS LONG
DIM lY4 AS LONG
DIM lX8 AS LONG
DIM lY8 AS LONG
DIM lResult AS LONG
lX8 = lX AND &H80000000
lY8 = lY AND &H80000000
lX4 = lX AND &H40000000
lY4 = lY AND &H40000000
lResult = (lX AND &H3FFFFFFF) + (lY AND &H3FFFFFFF)
IF lX4 > 0 AND lY4 > 0 THEN
lResult = lResult XOR &H80000000 XOR lX8 XOR lY8
ELSEIF lX4 OR lY4 THEN
IF (lResult AND &H40000000) > 0 THEN
lResult = lResult XOR &HC0000000 XOR lX8 XOR lY8
ELSE
lResult = lResult XOR &H40000000 XOR lX8 XOR lY8
END IF
ELSE
lResult = lResult XOR lX8 XOR lY8
END IF
result = lResult
END FUNCTION
Private FUNCTION F(BYVAL x AS LONG, _
BYVAL y AS LONG, _
BYVAL z AS LONG) AS LONG
F = (x AND y) OR ((NOT x) AND z)
END FUNCTION
Private FUNCTION G(BYVAL x AS LONG, _
BYVAL y AS LONG, _
BYVAL z AS LONG) AS LONG
G = (x AND z) OR (y AND (NOT z))
END FUNCTION
Private FUNCTION H(BYVAL x AS LONG, _
BYVAL y AS LONG, _
BYVAL z AS LONG) AS LONG
H = (x XOR y XOR z)
END FUNCTION
Private FUNCTION I(BYVAL x AS LONG, _
BYVAL y AS LONG, _
BYVAL z AS LONG) AS LONG
I = (y XOR (x OR (NOT z)))
END FUNCTION
Private SUB FF(a AS LONG, _
BYVAL b AS LONG, _
BYVAL c AS LONG, _
BYVAL d AS LONG, _
BYVAL x AS LONG, _
BYVAL s AS LONG, _
BYVAL ac AS LONG)
TEMPb = AddUnsigned(F(b, c, d), x)
TEMPa = AddUnsigned(TempB, ac)
a = AddUnsigned(a, TEMPa)
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
END SUB
Private SUB GG(a AS LONG, _
BYVAL b AS LONG, _
BYVAL c AS LONG, _
BYVAL d AS LONG, _
BYVAL x AS LONG, _
BYVAL s AS LONG, _
BYVAL ac AS LONG)
TempA = AddUnsigned(AddUnsigned(G(b, c, d), x), ac)
a = AddUnsigned(a, TempA)
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
END SUB
Private SUB HH(a AS LONG, _
BYVAL b AS LONG, _
BYVAL c AS LONG, _
BYVAL d AS LONG, _
BYVAL x AS LONG, _
BYVAL s AS LONG, _
BYVAL ac AS LONG)
TempA = AddUnsigned(AddUnsigned(H(b, c, d), x), ac)
a = AddUnsigned(a, TempA)
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
END SUB
Private SUB II(a AS LONG, _
BYVAL b AS LONG, _
BYVAL c AS LONG, _
BYVAL d AS LONG, _
BYVAL x AS LONG, _
BYVAL s AS LONG, _
BYVAL ac AS LONG)
TempA = AddUnsigned(AddUnsigned(I(b, c, d), x), ac)
a = AddUnsigned(a, TempA)
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
END SUB
CONST MODULUS_BITS AS LONG = 512
CONST CONGRUENT_BITS AS LONG = 448
DIM WordArray(2) AS LONG
DIM lWordArray(2) AS LONG
DIM lWordCount AS LONG
Private FUNCTION ConvertToWordArray(sMessage AS STRING) AS LONG
DIM lMessageLength AS LONG
DIM lNumberOfWords AS LONG
DIM lBytePosition AS LONG
DIM lByteCount AS LONG
lMessageLength = LEN(sMessage)
lNumberOfWords = (((lMessageLength + _
((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ _
(MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * _
(MODULUS_BITS \ BITS_TO_A_WORD)
REDIM lWordArray(lNumberOfWords - 1) AS LONG
lBytePosition = 0
lByteCount = 0
DO
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount MOD BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) OR LShift(ASC(MID$(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
LOOP UNTIL lByteCount >= lMessageLength
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount MOD BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) OR _
LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
REDIM WordArray(LBOUND(lWordArray) TO UBOUND(lWordArray)) AS LONG
FOR mI = LBOUND(WordArray) TO UBOUND(WordArray)
WordArray(mI) = lWordArray(mI)
NEXT
END FUNCTION
DIM TEMPSTR AS STRING
Private FUNCTION WordToHex(BYVAL lValue AS LONG) AS STRING
DIM lByte AS LONG
DIM lCount AS LONG
TEMPSTR = ""
FOR lCount = 0 TO 3
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) AND m_lOnBits(BITS_TO_A_BYTE - 1)
TEMPSTR = TEMPSTR + RIGHT$("0" + HEX$(lByte), 2)
NEXT
Result = TEMPSTR
END FUNCTION
CONST S11 AS LONG = 7
CONST S12 AS LONG = 12
CONST S13 AS LONG = 17
CONST S14 AS LONG = 22
CONST S21 AS LONG = 5
CONST S22 AS LONG = 9
CONST S23 AS LONG = 14
CONST S24 AS LONG = 20
CONST S31 AS LONG = 4
CONST S32 AS LONG = 11
CONST S33 AS LONG = 16
CONST S34 AS LONG = 23
CONST S41 AS LONG = 6
CONST S42 AS LONG = 10
CONST S43 AS LONG = 15
CONST S44 AS LONG = 21
DIM x(2) AS LONG
Public FUNCTION MD5(sMessage AS STRING) AS STRING
DIM k AS LONG
DIM AA AS LONG
DIM BB AS LONG
DIM CC AS LONG
DIM DD AS LONG
DIM a AS LONG
DIM b AS LONG
DIM c AS LONG
DIM d AS LONG
ConvertToWordArray(sMessage)
REDIM x(LBOUND(WordArray) TO UBOUND(WordArray)) AS LONG
FOR mI = LBOUND(WordArray) TO UBOUND(WordArray)
x(mi) = WordArray(mi)
NEXT
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
FOR k = 0 TO UBOUND(x) STEP 16
AA = a
BB = b
CC = c
DD = d
FF a, b, c, d, x(k + 0), S11, &HD76AA478
FF d, a, b, c, x(k + 1), S12, &HE8C7B756
FF c, d, a, b, x(k + 2), S13, &H242070DB
FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
FF d, a, b, c, x(k + 5), S12, &H4787C62A
FF c, d, a, b, x(k + 6), S13, &HA8304613
FF b, c, d, a, x(k + 7), S14, &HFD469501
FF a, b, c, d, x(k + 8), S11, &H698098D8
FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
FF b, c, d, a, x(k + 11), S14, &H895CD7BE
FF a, b, c, d, x(k + 12), S11, &H6B901122
FF d, a, b, c, x(k + 13), S12, &HFD987193
FF c, d, a, b, x(k + 14), S13, &HA679438E
FF b, c, d, a, x(k + 15), S14, &H49B40821
GG a, b, c, d, x(k + 1), S21, &HF61E2562
GG d, a, b, c, x(k + 6), S22, &HC040B340
GG c, d, a, b, x(k + 11), S23, &H265E5A51
GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
GG a, b, c, d, x(k + 5), S21, &HD62F105D
GG d, a, b, c, x(k + 10), S22, &H2441453
GG c, d, a, b, x(k + 15), S23, &HD8A1E681
GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
GG d, a, b, c, x(k + 14), S22, &HC33707D6
GG c, d, a, b, x(k + 3), S23, &HF4D50D87
GG b, c, d, a, x(k + 8), S24, &H455A14ED
GG a, b, c, d, x(k + 13), S21, &HA9E3E905
GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
GG c, d, a, b, x(k + 7), S23, &H676F02D9
GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
HH a, b, c, d, x(k + 5), S31, &HFFFA3942
HH d, a, b, c, x(k + 8), S32, &H8771F681
HH c, d, a, b, x(k + 11), S33, &H6D9D6122
HH b, c, d, a, x(k + 14), S34, &HFDE5380C
HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
HH a, b, c, d, x(k + 13), S31, &H289B7EC6
HH d, a, b, c, x(k + 0), S32, &HEAA127FA
HH c, d, a, b, x(k + 3), S33, &HD4EF3085
HH b, c, d, a, x(k + 6), S34, &H4881D05
HH a, b, c, d, x(k + 9), S31, &HD9D4D039
HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
HH b, c, d, a, x(k + 2), S34, &HC4AC5665
II a, b, c, d, x(k + 0), S41, &HF4292244
II d, a, b, c, x(k + 7), S42, &H432AFF97
II c, d, a, b, x(k + 14), S43, &HAB9423A7
II b, c, d, a, x(k + 5), S44, &HFC93A039
II a, b, c, d, x(k + 12), S41, &H655B59C3
II d, a, b, c, x(k + 3), S42, &H8F0CCC92
II c, d, a, b, x(k + 10), S43, &HFFEFF47D
II b, c, d, a, x(k + 1), S44, &H85845DD1
II a, b, c, d, x(k + 8), S41, &H6FA87E4F
II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
II c, d, a, b, x(k + 6), S43, &HA3014314
II b, c, d, a, x(k + 13), S44, &H4E0811A1
II a, b, c, d, x(k + 4), S41, &HF7537E82
II d, a, b, c, x(k + 11), S42, &HBD3AF235
II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
II b, c, d, a, x(k + 9), S44, &HEB86D391
a = AddUnsigned(a, AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
NEXT
result = LCASE$(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
END FUNCTION
$OPTION WEAKTYPE OFF
$OPTION VBDLL OFF
|
|