📄 ripemd.pas
字号:
unit RIPEMD;
{(C) Coban (alex@ritlabs.com)}
interface
uses
CryptoUtils;
type
PRMDCtx = ^TRMDCtx;
TRMDCtx = record
MDBuf: array[0..4] of LongWord;
length, curlen: LongWord;
buf: array[0..63] of Byte;
end;
procedure RMD128Init(var md: TRMDCtx);
procedure RMD160Init(var md: TRMDCtx);
procedure RMDUpdate(var md: TRMDCtx; buf: Pointer; len: LongWord; sz: Word);
function RMDFinal(var md: TRMDCtx; sz: LongWord): String;
implementation
function F(x, y, z: LongWord): LongWord;
begin
Result := x xor y xor z;
end;
function G(x, y, z: LongWord): LongWord;
begin
Result := (x and y) or ((not x) and z);
end;
function H(x, y, z: LongWord): LongWord;
begin
Result := (x or (not y)) xor z;
end;
function I(x, y, z: LongWord): LongWord;
begin
Result := (x and z) or (y and (not z));
end;
function J(x, y, z: LongWord): LongWord;
begin
Result := x xor (y or (not z));
end;
procedure FF(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (F(b, c, d) + x);
a := ROL(a, s);
end;
procedure GG(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (G(b, c, d) + x + $5a827999);
a := ROL(a, s);
end;
procedure HH(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (H(b, c, d) + x + $6ed9eba1);
a := ROL(a, s);
end;
procedure II(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (I(b, c, d) + x + $8f1bbcdc);
a := ROL(a, s);
end;
procedure FFF(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (F(b, c, d) + x);
a := ROL(a, s);
end;
procedure GGG(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (G(b, c, d) + x + $6d703ef3);
a := ROL(a, s);
end;
procedure HHH(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (H(b, c, d) + x + $5c4dd124);
a := ROL(a, s);
end;
procedure III(var a: LongWord; b, c, d, x, s: LongWord);
begin
a := a + (I(b, c, d) + x + $50a28be6);
a := ROL(a, s);
end;
procedure FF160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + (F(b, c, d) + x);
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure GG160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + (G(b, c, d) + x + $5a827999);
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure HH160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a +(H(b, c, d) + x + $6ed9eba1);
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure II160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + (I((b), (c), (d)) + (x) + $8f1bbcdc);
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure JJ160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + (J(b, c, d) + x + $a953fd4e);
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure FFF160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + F(b, c, d) + x;
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure GGG160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + G(b, c, d) + x + $7a6d76e9;
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure HHH160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + H(b, c, d) + x + $6d703ef3;
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure III160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + I(b, c, d) + x + $5c4dd124;
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure JJJ160(var a: LongWord; b: LongWord; var c: LongWord; d, e, x, s: LongWord);
begin
a := a + J(b, c, d) + x + $50a28be6;
a := ROL(a, s) + e;
c := ROL(c, 10);
end;
procedure MDInit(var MDBuf: array of LongWord);
begin
MDbuf[0] := $67452301;
MDbuf[1] := $efcdab89;
MDbuf[2] := $98badcfe;
MDbuf[3] := $10325476;
end;
procedure MDInit160(var MDbuf: array of LongWord);
begin
MDInit(MDBuf);
MDbuf[4] := $c3d2e1f0;
end;
procedure RMD128Init(var md: TRMDCtx);
begin
md.length := 0; md.curlen := 0;
MDInit(md.MDBuf);
end;
procedure RMD160Init(var md: TRMDCtx);
begin
md.length := 0; md.curlen := 0;
MDInit160(md.MDBuf);
end;
procedure compress(var MDbuf: array of LongWord; X: array of LongWord);
var
aa, bb, cc, dd: LongWord;
aaa, bbb, ccc, ddd: LongWord;
begin
aa := MDbuf[0]; bb := MDbuf[1]; cc := MDbuf[2]; dd := MDbuf[3];
aaa := MDbuf[0]; bbb := MDbuf[1]; ccc := MDbuf[2]; ddd := MDbuf[3];
// round 1
FF(aa, bb, cc, dd, X[ 0], 11);
FF(dd, aa, bb, cc, X[ 1], 14);
FF(cc, dd, aa, bb, X[ 2], 15);
FF(bb, cc, dd, aa, X[ 3], 12);
FF(aa, bb, cc, dd, X[ 4], 5);
FF(dd, aa, bb, cc, X[ 5], 8);
FF(cc, dd, aa, bb, X[ 6], 7);
FF(bb, cc, dd, aa, X[ 7], 9);
FF(aa, bb, cc, dd, X[ 8], 11);
FF(dd, aa, bb, cc, X[ 9], 13);
FF(cc, dd, aa, bb, X[10], 14);
FF(bb, cc, dd, aa, X[11], 15);
FF(aa, bb, cc, dd, X[12], 6);
FF(dd, aa, bb, cc, X[13], 7);
FF(cc, dd, aa, bb, X[14], 9);
FF(bb, cc, dd, aa, X[15], 8);
// round 2
GG(aa, bb, cc, dd, X[ 7], 7);
GG(dd, aa, bb, cc, X[ 4], 6);
GG(cc, dd, aa, bb, X[13], 8);
GG(bb, cc, dd, aa, X[ 1], 13);
GG(aa, bb, cc, dd, X[10], 11);
GG(dd, aa, bb, cc, X[ 6], 9);
GG(cc, dd, aa, bb, X[15], 7);
GG(bb, cc, dd, aa, X[ 3], 15);
GG(aa, bb, cc, dd, X[12], 7);
GG(dd, aa, bb, cc, X[ 0], 12);
GG(cc, dd, aa, bb, X[ 9], 15);
GG(bb, cc, dd, aa, X[ 5], 9);
GG(aa, bb, cc, dd, X[ 2], 11);
GG(dd, aa, bb, cc, X[14], 7);
GG(cc, dd, aa, bb, X[11], 13);
GG(bb, cc, dd, aa, X[ 8], 12);
// round 3
HH(aa, bb, cc, dd, X[ 3], 11);
HH(dd, aa, bb, cc, X[10], 13);
HH(cc, dd, aa, bb, X[14], 6);
HH(bb, cc, dd, aa, X[ 4], 7);
HH(aa, bb, cc, dd, X[ 9], 14);
HH(dd, aa, bb, cc, X[15], 9);
HH(cc, dd, aa, bb, X[ 8], 13);
HH(bb, cc, dd, aa, X[ 1], 15);
HH(aa, bb, cc, dd, X[ 2], 14);
HH(dd, aa, bb, cc, X[ 7], 8);
HH(cc, dd, aa, bb, X[ 0], 13);
HH(bb, cc, dd, aa, X[ 6], 6);
HH(aa, bb, cc, dd, X[13], 5);
HH(dd, aa, bb, cc, X[11], 12);
HH(cc, dd, aa, bb, X[ 5], 7);
HH(bb, cc, dd, aa, X[12], 5);
// round 4
II(aa, bb, cc, dd, X[ 1], 11);
II(dd, aa, bb, cc, X[ 9], 12);
II(cc, dd, aa, bb, X[11], 14);
II(bb, cc, dd, aa, X[10], 15);
II(aa, bb, cc, dd, X[ 0], 14);
II(dd, aa, bb, cc, X[ 8], 15);
II(cc, dd, aa, bb, X[12], 9);
II(bb, cc, dd, aa, X[ 4], 8);
II(aa, bb, cc, dd, X[13], 9);
II(dd, aa, bb, cc, X[ 3], 14);
II(cc, dd, aa, bb, X[ 7], 5);
II(bb, cc, dd, aa, X[15], 6);
II(aa, bb, cc, dd, X[14], 8);
II(dd, aa, bb, cc, X[ 5], 6);
II(cc, dd, aa, bb, X[ 6], 5);
II(bb, cc, dd, aa, X[ 2], 12);
// parallel round 1
III(aaa, bbb, ccc, ddd, X[ 5], 8);
III(ddd, aaa, bbb, ccc, X[14], 9);
III(ccc, ddd, aaa, bbb, X[ 7], 9);
III(bbb, ccc, ddd, aaa, X[ 0], 11);
III(aaa, bbb, ccc, ddd, X[ 9], 13);
III(ddd, aaa, bbb, ccc, X[ 2], 15);
III(ccc, ddd, aaa, bbb, X[11], 15);
III(bbb, ccc, ddd, aaa, X[ 4], 5);
III(aaa, bbb, ccc, ddd, X[13], 7);
III(ddd, aaa, bbb, ccc, X[ 6], 7);
III(ccc, ddd, aaa, bbb, X[15], 8);
III(bbb, ccc, ddd, aaa, X[ 8], 11);
III(aaa, bbb, ccc, ddd, X[ 1], 14);
III(ddd, aaa, bbb, ccc, X[10], 14);
III(ccc, ddd, aaa, bbb, X[ 3], 12);
III(bbb, ccc, ddd, aaa, X[12], 6);
// parallel round 2
HHH(aaa, bbb, ccc, ddd, X[ 6], 9);
HHH(ddd, aaa, bbb, ccc, X[11], 13);
HHH(ccc, ddd, aaa, bbb, X[ 3], 15);
HHH(bbb, ccc, ddd, aaa, X[ 7], 7);
HHH(aaa, bbb, ccc, ddd, X[ 0], 12);
HHH(ddd, aaa, bbb, ccc, X[13], 8);
HHH(ccc, ddd, aaa, bbb, X[ 5], 9);
HHH(bbb, ccc, ddd, aaa, X[10], 11);
HHH(aaa, bbb, ccc, ddd, X[14], 7);
HHH(ddd, aaa, bbb, ccc, X[15], 7);
HHH(ccc, ddd, aaa, bbb, X[ 8], 12);
HHH(bbb, ccc, ddd, aaa, X[12], 7);
HHH(aaa, bbb, ccc, ddd, X[ 4], 6);
HHH(ddd, aaa, bbb, ccc, X[ 9], 15);
HHH(ccc, ddd, aaa, bbb, X[ 1], 13);
HHH(bbb, ccc, ddd, aaa, X[ 2], 11);
// parallel round 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -