generateMD2

=Generate MD2=

This function will return the MD2 hash for the supplied string. A MD2 hash can be used to verify that the contents of a string (or file) have not been tampered with. For more information about MD2 see [|this] wikipedia entry.

code ' MD2 Message Digest Algorithm ' See RFC 1319 for details - http://www.ietf.org/rfc/rfc1319.txt ' Also see errata at http://www.rfc-editor.org/errata_search.php?rfc=1319 ' ' RunBASIC version by Neal Collins

' Test Data data "", "8350e5a3e24c153df2275c9f80692773" data "a", "32ec01ec4a6dac72c0ab96fb34c0b5d1" data "abc", "da853b0d3f88d99b30283a69e6ded6bb" data "message digest", "ab4f496bfb2a530b219ff33031fe06b0" data "abcdefghijklmnopqrstuvwxyz", "4e8ddff3650292ab5a4108c3aa47940b" data "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "da33def2a42df13975352846c30338cd"

' Run some tests

for i = 1 to 6 read a$, b$ print "Test "; i; " - "; if generateMD2$(a$) = b$ then print "PASSED" else print "FAILED" end if next i

' MD2 Hash Function

function generateMD2$(M$)

N = len(M$)

' Step 1. Append padding bytes '

r = 16 - (N mod 16) if r = 0 then r = 16

for i = 0 to r - 1 M$ = M$ + chr$(r) next i

N = N + r

' Step 2. Append Checksums '

' Load S dim S(255)

restore for i = 0 to 255 read S(i) next i

' Clear checksum

dim C(15)

L = 0

' Process each 16 byte block for i = 0 to N / 16 - 1 ' Checksum block i   for j = 0 to 15 c = asc(mid$(M$, i * 16 + j + 1, 1)) C(j) = C(j) xor S(c xor L)     L = C(j) next j next i

for i = 0 to 15 M$ = M$ + chr$(C(i)) next i

N = N + 16

' Step 3. Initialise the MD Buffer '

dim X(47)

' Step 4. Process Message in 16-Byte Blocks ' -

for i = 0 to N / 16 - 1

' Copy block i into X   for j = 0 to 15 X(16 + j) = asc(mid$(M$, i * 16 + j + 1, 1)) X(32 + j) = X(16 + j) xor X(j) next j

t = 0

' Do 18 rounds for j = 0 to 17

' Round j      for k = 0 to 47 t = X(k) xor S(t) X(k) = t     next k

t = (t + j) mod 256 next j next i

' Step 5. Output ' --

X$ = ""

for i = 0 to 15 X$ = X$ + right$("0" + dechex$(X(i)), 2) next i

generateMD2$ = lower$(X$)

data 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6 data 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188 data 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24 data 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251 data 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63 data 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50 data 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165 data 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210 data 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157 data 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27 data 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15 data 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197 data 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65 data 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123 data 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233 data 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228 data 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237 data 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 end function code