⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ripemd.pas

📁 超级Delphi函数包,包括编程时常需要的一些函数
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -