Unit MD5;
Interface
uses Windows, Messages, SysUtils, Variants; type MyArray = array of Integer; function rHEX (num: Integer): string; function str2blks_MD5 (str: string): MyArray; function Add (x, y: Integer): Integer; function rol (NUM, CNT: Integer): Integer; Function CMN (q, a, b, x, s, t: integer): Integer; Function FF (A, B, C, D, X, S, T: Integer): Integer; Function GG (A, B, C, D, X, S, T: Integer): Integer; Function HH (A, B, C, D, X, S, T: Integer): Integer; Function II (A , B, C, D, X, S, T: Integer: Integer; Function MD5 (str: string): String;
IMPLEMENTATION
Const HEX_CHR = '0123456789Abcdef';
Function Rhex (NUM: INTEGER): String; var s: string; n: integer; p: pbyte; i: integer; begin n: = Num; p: = pbyte (@n); s: = '; for i; : = 0 to 3 do S: = S INTTOHEX (PBYTE (Integer (P) i) ^, 2); Result: = ANSIWERCASE (S); END;
Function str2blks_md5 (str: string): MyArray; var nblk: integer; i: integer; blks: myarray; begin nblk: = (length (STR) 8) SHR 6 1; //64 integral setlength (BLKS, NBLK * 16); for i: = 0 to nblk * 16-1 DO BLKS [I]: = 0; for i: = 0 to length (str) -1 do blks [i shr 2]: = BLKS [I SHR 2] OR BYTE (STR [i 1]) SHL ((i MOD 4) * 8);
I: = Length (STR); BLKS [I Shr 2]: = BLKS [I Shr 2] OR $ 80 SHL ((i mod 4) * 8); BLKS [NBLK * 16 - 2]: = Length (Str) * RESULT: = BLKS; END;
Function add (x, y: integer): integer; // var // L, H: integer; begin // Implementation and operation // L: = X and $ fff y and $ fff; // h: = X SHR 16 Y SHR 16 L SHR 16; // Result: = H SHL 16 OR L AND $ FFFF; Result: = x Y; END;
Function Rol (NUM, CNT: Integer): Integer; Begin Result: = Num SHL CNT or Num Shr (32 - CNT); END;
Function CMN (Q, A, B, X, S, T: Integer): Integer; Begin Result: = Add (ADD (ADD (Add (ADD (A, Q), Add (x, t)), s), b) END; FUNCTION FF (A, B, C, D, X, S, T: Integer): integer; begin result: = CMN ((B And C) OR ((B xor $ fffffff) And d), A, B, X, S, T); End; Function GG (A, B, C, D, X, S, T: Integer): Integer; Begin Result: = CMN ((B and D) OR (C and (D) XOR $ fffffff), A, B, X, S, T); End; Function HH (A, B, C, D, X, S, T: Integer): Integer; Begin Result: = CMN (B xor C XOR D, A, B, X, S, T); End; Function II (A, B, C, D, X, S, T: Integer): Integer; Begin Result: = CMN (c xor (b or) D xor $ fffffff)), A, B, X, S, T); END;
Function MD5: String; VAR A, B, C, D: Integer; Olda, Oldb, Oldc, Oldd: Integer; I, J: Integer; Blks: MyArray; Begin A: = 1732584193; B: = -271733879; C: = -1732584194; D: = 271733878; BLKS: = STR2BLKS_MD5 (STR); for J: = 0 to high (blks) Div 16 do // step 16 begin Olda: = a; oldb: = B; Oldc: = C; Oldd: = D; i: = j * 16; A: = FF (A, B, C, D, BLKS [i 0], 7, -680876936); D: = ff (D, A , B, C, BLKS [I 1], 12, -389564586); C: = FF (C, D, A, B, BLKS [i 2], 17, 606105819); B: = FF (B, C, D, A, BLKS [i 3], 22, -1044525330); A: = FF (A, B, C, D, BLKS [i 4], 7, -176418897); D: = FF (D, A, B, C, BLKS [I 5], 12, 1200080426); C: = FF (C, D, A, B, BLKS [i 6], 17, -1473231341); B: = FF (B, C, D , A, BLKS [i 7], 22, -45705983); A: = FF (A, B, C, D, BLKS [i 8], 7, 1770035416); D: = FF (D, A, B, C, BLKS [i 9], 12, -1958414417); C: = FF (C, D, A, B, BLKS [i 10], 17, -42063); B: = FF (B, C, D , A, BLKS [I 11], 22, -1990404162); A: = FF (A, B, C, D, BLKS [I 12], 7, 1804603682); D: = FF (D, A, B, C, BLKS [i 13], 12, -40341101); C: = FF (C, D, A , B, -1502002290); B: = FF (B, C, D, A, BLKS [i 15], 22, 1236535329); A: = Gg (A, B, C, D, BLKS [i 1], 5, -165796510); D: = GG (D, A, B, C, BLKS [i 6], 9, -1069501632); C: = GG (C, D, A, B, BLKS [I 11], 14, 643717713); B: = Gg (B, C, D, A, BLKS [i 0], 20, -373897302); A: = Gg (a, b, C, D, BLKS [i 5], 5, -701558691); D: = GG (D, A, B, C, BLKS [i 10], 9, 38016083); C: =
GG (C, D, A, B, BLKS [i 15], 14, -660478335); B: = GG (B, C, D, A, BLKS [i 4], 20, -405537848); A: = GG (A, B, C, D, BLKS [i 9], 568446438); D: = GG (D, A, B, C, BLKS [i 14], 9, -1019803690); C: = GG (C, D, A, B, BLKS [i 3], 14, -187363961); B: = GG (B, C, D, A, BLKS [i 8], 20, 1163531501); A: = GG (A, B, C, D, BLKS [i 13], 5, -1444681467); D: = GG (D, A, B, C, BLKS [i 2], 9, -51403784); C: = GG (C, D, A, B, BLKS [i 7], 14, 1735328473); B: = GG (B, C, D, A, BLKS [i 12], 20, -1926607734); A: = HH (A, B, C, D, BLKS [i 5], 4. -378558); D: = HH (D, A, B, C, BLKS [i 8], 11, -202574463); C: = HH (C, D, A, B, BLKS [i 11], 16, 1839030562); B: = HH (B, C, D, A, BLKS [i 14], 23, -35309556); A : = HH (A, B, C, D, BLKS [i 1], 4, -1530992060); D: = HH (D, A, B, C, BLKS [i 4], 11, 1272893353); C: = HH (C, D, A, B, BLKS [i 7], 16, -155497632); B: = HH (B, C, D, A, BLKS [i 10], 23, -1094730640); A : = HH (A, B, C, D, BLKS [i 13], 4, 681279174); D: = HH (D, A, B, C , BLKS [i 0], 11, -358537222); C: = HH (C, D, A, B, BLKS [i 3], 16, -722521979); B: = HH (B, C, D, A , BLKS [i 6], 23, 76029189); A: = HH (A, B, C, D, BLKS [i 9], 4, -640364487); D: = HH (D, A, B, C, BLKS [i 12], 11, -421815835); C: = HH (C, D, A, B, BLKS [i 15], 16, 530742520); B: = HH (B, C, D, A , BLKS [i 2], 23, - 995338651); A: = II (A, B, C, D, BLKS [i 0], 6, -198630844); D: = II (D, A, B, C , BLKS [i 7], 10, 1126891415); C: = II (C, D, A, B, BLKS [i 14], 15, -1416354905); B: =
II (B, C, D, A, BLKS [i 5], 21, -57434055); A: = II (A, B, C, D, BLKS [i 12], 6, 1700485571); D: = II (D, A, B, C, BLKS [i 3], 10, -1894986606); C: = II (C, D, A, B, BLKS [i 10], 15, -1051523); B: = II (B, C, D, A, BLKS [i 1], 21, -20554922799); A: = II (A, B, C, D, BLKS [i 8], 6, 1873313359); D: = II (D, A, B, C, BLKS [i 15], 10, -30611744); C: = II (C, D, A, B, BLKS [i 6], 15, -1560198380); B: = II (B, C, D, A, BLKS [i 13], 21, 1309151649); A: = II (A, B, C, D, BLKS [i 4], 6, -145523070); D: = II (D, A, B, C, BLKS [i 11], 10, -1120210379); C: = II (C, D, A, B, BLKS [i 2], 15, 718787259); B: = II (B, C, D, A, BLKS [i 9], 21, -343485551); A: = Add (a, OLDA); B: = Add (b, oldb); c: = add (c, OLDC); D: = Add (d, oldd); end; result: = rhex (a) rhex (b) rhex (c) rhex (d); end; end;