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

📄 ripemd.pas

📁 超级Delphi函数包,包括编程时常需要的一些函数
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   GGG(aaa, bbb, ccc, ddd, X[15],  9);
   GGG(ddd, aaa, bbb, ccc, X[ 5],  7);
   GGG(ccc, ddd, aaa, bbb, X[ 1], 15);
   GGG(bbb, ccc, ddd, aaa, X[ 3], 11);
   GGG(aaa, bbb, ccc, ddd, X[ 7],  8);
   GGG(ddd, aaa, bbb, ccc, X[14],  6);
   GGG(ccc, ddd, aaa, bbb, X[ 6],  6);
   GGG(bbb, ccc, ddd, aaa, X[ 9], 14);
   GGG(aaa, bbb, ccc, ddd, X[11], 12);
   GGG(ddd, aaa, bbb, ccc, X[ 8], 13);
   GGG(ccc, ddd, aaa, bbb, X[12],  5);
   GGG(bbb, ccc, ddd, aaa, X[ 2], 14);
   GGG(aaa, bbb, ccc, ddd, X[10], 13);
   GGG(ddd, aaa, bbb, ccc, X[ 0], 13);
   GGG(ccc, ddd, aaa, bbb, X[ 4],  7);
   GGG(bbb, ccc, ddd, aaa, X[13],  5);

   // parallel round 4
   FFF(aaa, bbb, ccc, ddd, X[ 8], 15);
   FFF(ddd, aaa, bbb, ccc, X[ 6],  5);
   FFF(ccc, ddd, aaa, bbb, X[ 4],  8);
   FFF(bbb, ccc, ddd, aaa, X[ 1], 11);
   FFF(aaa, bbb, ccc, ddd, X[ 3], 14);
   FFF(ddd, aaa, bbb, ccc, X[11], 14);
   FFF(ccc, ddd, aaa, bbb, X[15],  6);
   FFF(bbb, ccc, ddd, aaa, X[ 0], 14);
   FFF(aaa, bbb, ccc, ddd, X[ 5],  6);
   FFF(ddd, aaa, bbb, ccc, X[12],  9);
   FFF(ccc, ddd, aaa, bbb, X[ 2], 12);
   FFF(bbb, ccc, ddd, aaa, X[13],  9);
   FFF(aaa, bbb, ccc, ddd, X[ 9], 12);
   FFF(ddd, aaa, bbb, ccc, X[ 7],  5);
   FFF(ccc, ddd, aaa, bbb, X[10], 15);
   FFF(bbb, ccc, ddd, aaa, X[14],  8);

   // combine results
   ddd := ddd + cc + MDbuf[1];              // final result for MDbuf[0] 
   MDbuf[1] := MDbuf[2] + dd + aaa;
   MDbuf[2] := MDbuf[3] + aa + bbb;
   MDbuf[3] := MDbuf[0] + bb + ccc;
   MDbuf[0] := ddd;
end;

procedure compress160(var MDbuf: array of LongWord; X: array of LongWord);
var
  aa, bb, cc, dd, ee: LongWord;
  aaa, bbb, ccc, ddd, eee: LongWord;
begin
   aa := MDbuf[0]; bb := MDbuf[1]; cc := MDbuf[2]; dd := MDbuf[3]; ee := MDbuf[4];
   aaa := MDbuf[0]; bbb := MDbuf[1]; ccc := MDbuf[2]; ddd := MDbuf[3]; eee := MDbuf[4];

   // round 1
   FF160(aa, bb, cc, dd, ee, X[ 0], 11);
   FF160(ee, aa, bb, cc, dd, X[ 1], 14);
   FF160(dd, ee, aa, bb, cc, X[ 2], 15);
   FF160(cc, dd, ee, aa, bb, X[ 3], 12);
   FF160(bb, cc, dd, ee, aa, X[ 4],  5);
   FF160(aa, bb, cc, dd, ee, X[ 5],  8);
   FF160(ee, aa, bb, cc, dd, X[ 6],  7);
   FF160(dd, ee, aa, bb, cc, X[ 7],  9);
   FF160(cc, dd, ee, aa, bb, X[ 8], 11);
   FF160(bb, cc, dd, ee, aa, X[ 9], 13);
   FF160(aa, bb, cc, dd, ee, X[10], 14);
   FF160(ee, aa, bb, cc, dd, X[11], 15);
   FF160(dd, ee, aa, bb, cc, X[12],  6);
   FF160(cc, dd, ee, aa, bb, X[13],  7);
   FF160(bb, cc, dd, ee, aa, X[14],  9);
   FF160(aa, bb, cc, dd, ee, X[15],  8);

   // round 2 
   GG160(ee, aa, bb, cc, dd, X[ 7],  7);
   GG160(dd, ee, aa, bb, cc, X[ 4],  6);
   GG160(cc, dd, ee, aa, bb, X[13],  8);
   GG160(bb, cc, dd, ee, aa, X[ 1], 13);
   GG160(aa, bb, cc, dd, ee, X[10], 11);
   GG160(ee, aa, bb, cc, dd, X[ 6],  9);
   GG160(dd, ee, aa, bb, cc, X[15],  7);
   GG160(cc, dd, ee, aa, bb, X[ 3], 15);
   GG160(bb, cc, dd, ee, aa, X[12],  7);
   GG160(aa, bb, cc, dd, ee, X[ 0], 12);
   GG160(ee, aa, bb, cc, dd, X[ 9], 15);
   GG160(dd, ee, aa, bb, cc, X[ 5],  9);
   GG160(cc, dd, ee, aa, bb, X[ 2], 11);
   GG160(bb, cc, dd, ee, aa, X[14],  7);
   GG160(aa, bb, cc, dd, ee, X[11], 13);
   GG160(ee, aa, bb, cc, dd, X[ 8], 12);

   // round 3 
   HH160(dd, ee, aa, bb, cc, X[ 3], 11);
   HH160(cc, dd, ee, aa, bb, X[10], 13);
   HH160(bb, cc, dd, ee, aa, X[14],  6);
   HH160(aa, bb, cc, dd, ee, X[ 4],  7);
   HH160(ee, aa, bb, cc, dd, X[ 9], 14);
   HH160(dd, ee, aa, bb, cc, X[15],  9);
   HH160(cc, dd, ee, aa, bb, X[ 8], 13);
   HH160(bb, cc, dd, ee, aa, X[ 1], 15);
   HH160(aa, bb, cc, dd, ee, X[ 2], 14);
   HH160(ee, aa, bb, cc, dd, X[ 7],  8);
   HH160(dd, ee, aa, bb, cc, X[ 0], 13);
   HH160(cc, dd, ee, aa, bb, X[ 6],  6);
   HH160(bb, cc, dd, ee, aa, X[13],  5);
   HH160(aa, bb, cc, dd, ee, X[11], 12);
   HH160(ee, aa, bb, cc, dd, X[ 5],  7);
   HH160(dd, ee, aa, bb, cc, X[12],  5);

   // round 4 
   II160(cc, dd, ee, aa, bb, X[ 1], 11);
   II160(bb, cc, dd, ee, aa, X[ 9], 12);
   II160(aa, bb, cc, dd, ee, X[11], 14);
   II160(ee, aa, bb, cc, dd, X[10], 15);
   II160(dd, ee, aa, bb, cc, X[ 0], 14);
   II160(cc, dd, ee, aa, bb, X[ 8], 15);
   II160(bb, cc, dd, ee, aa, X[12],  9);
   II160(aa, bb, cc, dd, ee, X[ 4],  8);
   II160(ee, aa, bb, cc, dd, X[13],  9);
   II160(dd, ee, aa, bb, cc, X[ 3], 14);
   II160(cc, dd, ee, aa, bb, X[ 7],  5);
   II160(bb, cc, dd, ee, aa, X[15],  6);
   II160(aa, bb, cc, dd, ee, X[14],  8);
   II160(ee, aa, bb, cc, dd, X[ 5],  6);
   II160(dd, ee, aa, bb, cc, X[ 6],  5);
   II160(cc, dd, ee, aa, bb, X[ 2], 12);

   // round 5 
   JJ160(bb, cc, dd, ee, aa, X[ 4],  9);
   JJ160(aa, bb, cc, dd, ee, X[ 0], 15);
   JJ160(ee, aa, bb, cc, dd, X[ 5],  5);
   JJ160(dd, ee, aa, bb, cc, X[ 9], 11);
   JJ160(cc, dd, ee, aa, bb, X[ 7],  6);
   JJ160(bb, cc, dd, ee, aa, X[12],  8);
   JJ160(aa, bb, cc, dd, ee, X[ 2], 13);
   JJ160(ee, aa, bb, cc, dd, X[10], 12);
   JJ160(dd, ee, aa, bb, cc, X[14],  5);
   JJ160(cc, dd, ee, aa, bb, X[ 1], 12);
   JJ160(bb, cc, dd, ee, aa, X[ 3], 13);
   JJ160(aa, bb, cc, dd, ee, X[ 8], 14);
   JJ160(ee, aa, bb, cc, dd, X[11], 11);
   JJ160(dd, ee, aa, bb, cc, X[ 6],  8);
   JJ160(cc, dd, ee, aa, bb, X[15],  5);
   JJ160(bb, cc, dd, ee, aa, X[13],  6);

   // parallel round 1 
   JJJ160(aaa, bbb, ccc, ddd, eee, X[ 5],  8);
   JJJ160(eee, aaa, bbb, ccc, ddd, X[14],  9);
   JJJ160(ddd, eee, aaa, bbb, ccc, X[ 7],  9);
   JJJ160(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
   JJJ160(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
   JJJ160(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
   JJJ160(eee, aaa, bbb, ccc, ddd, X[11], 15);
   JJJ160(ddd, eee, aaa, bbb, ccc, X[ 4],  5);
   JJJ160(ccc, ddd, eee, aaa, bbb, X[13],  7);
   JJJ160(bbb, ccc, ddd, eee, aaa, X[ 6],  7);
   JJJ160(aaa, bbb, ccc, ddd, eee, X[15],  8);
   JJJ160(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
   JJJ160(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
   JJJ160(ccc, ddd, eee, aaa, bbb, X[10], 14);
   JJJ160(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
   JJJ160(aaa, bbb, ccc, ddd, eee, X[12],  6);

   // parallel round 2 
   III160(eee, aaa, bbb, ccc, ddd, X[ 6],  9); 
   III160(ddd, eee, aaa, bbb, ccc, X[11], 13);
   III160(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
   III160(bbb, ccc, ddd, eee, aaa, X[ 7],  7);
   III160(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
   III160(eee, aaa, bbb, ccc, ddd, X[13],  8);
   III160(ddd, eee, aaa, bbb, ccc, X[ 5],  9);
   III160(ccc, ddd, eee, aaa, bbb, X[10], 11);
   III160(bbb, ccc, ddd, eee, aaa, X[14],  7);
   III160(aaa, bbb, ccc, ddd, eee, X[15],  7);
   III160(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
   III160(ddd, eee, aaa, bbb, ccc, X[12],  7);
   III160(ccc, ddd, eee, aaa, bbb, X[ 4],  6);
   III160(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
   III160(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
   III160(eee, aaa, bbb, ccc, ddd, X[ 2], 11);

   // parallel round 3
   HHH160(ddd, eee, aaa, bbb, ccc, X[15],  9);
   HHH160(ccc, ddd, eee, aaa, bbb, X[ 5],  7);
   HHH160(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
   HHH160(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
   HHH160(eee, aaa, bbb, ccc, ddd, X[ 7],  8);
   HHH160(ddd, eee, aaa, bbb, ccc, X[14],  6);
   HHH160(ccc, ddd, eee, aaa, bbb, X[ 6],  6);
   HHH160(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
   HHH160(aaa, bbb, ccc, ddd, eee, X[11], 12);
   HHH160(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
   HHH160(ddd, eee, aaa, bbb, ccc, X[12],  5);
   HHH160(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
   HHH160(bbb, ccc, ddd, eee, aaa, X[10], 13);
   HHH160(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
   HHH160(eee, aaa, bbb, ccc, ddd, X[ 4],  7);
   HHH160(ddd, eee, aaa, bbb, ccc, X[13],  5);

   // parallel round 4
   GGG160(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
   GGG160(bbb, ccc, ddd, eee, aaa, X[ 6],  5);
   GGG160(aaa, bbb, ccc, ddd, eee, X[ 4],  8);
   GGG160(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
   GGG160(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
   GGG160(ccc, ddd, eee, aaa, bbb, X[11], 14);
   GGG160(bbb, ccc, ddd, eee, aaa, X[15],  6);
   GGG160(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
   GGG160(eee, aaa, bbb, ccc, ddd, X[ 5],  6);
   GGG160(ddd, eee, aaa, bbb, ccc, X[12],  9);
   GGG160(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
   GGG160(bbb, ccc, ddd, eee, aaa, X[13],  9);
   GGG160(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
   GGG160(eee, aaa, bbb, ccc, ddd, X[ 7],  5);
   GGG160(ddd, eee, aaa, bbb, ccc, X[10], 15);
   GGG160(ccc, ddd, eee, aaa, bbb, X[14],  8);

   // parallel round 5
   FFF160(bbb, ccc, ddd, eee, aaa, X[12] ,  8);
   FFF160(aaa, bbb, ccc, ddd, eee, X[15] ,  5);
   FFF160(eee, aaa, bbb, ccc, ddd, X[10] , 12);
   FFF160(ddd, eee, aaa, bbb, ccc, X[ 4] ,  9);
   FFF160(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
   FFF160(bbb, ccc, ddd, eee, aaa, X[ 5] ,  5);
   FFF160(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
   FFF160(eee, aaa, bbb, ccc, ddd, X[ 7] ,  6);
   FFF160(ddd, eee, aaa, bbb, ccc, X[ 6] ,  8);
   FFF160(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
   FFF160(bbb, ccc, ddd, eee, aaa, X[13] ,  6);
   FFF160(aaa, bbb, ccc, ddd, eee, X[14] ,  5);
   FFF160(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
   FFF160(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
   FFF160(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
   FFF160(bbb, ccc, ddd, eee, aaa, X[11] , 11);

   ddd := ddd + cc + MDbuf[1];
   MDbuf[1] := MDbuf[2] + dd + eee;
   MDbuf[2] := MDbuf[3] + ee + aaa;
   MDbuf[3] := MDbuf[4] + aa + bbb;
   MDbuf[4] := MDbuf[0] + bb + ccc;
   MDbuf[0] := ddd;
end;

procedure RMDUpdate(var md: TRMDCtx; buf: Pointer; len: LongWord; sz: Word);
var
  X: array[0..15] of LongWord;
begin
  while (len > 0) do
  begin
    md.buf[md.curlen] := PByte(buf)^;
    Inc(md.curlen);
    buf := Ptr(LongWord(buf) + 1);
    if (md.curlen = 64) then
    begin
      Move((@md.buf)^, X, 64);
      if sz = 160 then
        compress160(md.MDBuf, X)
      else
        compress(md.MDBuf, X);
      Inc(md.length, 64);
      md.curlen := 0;
    end;
    Dec(len);
  end;
end;

procedure MDfinish(var MDbuf: array of LongWord; strptr: Pointer; lswlen, mswlen: LongWord; Cipher: Byte);
var
  X: array[0..15] of LongWord;
  i: LongWord;
begin
  FillChar(X, SizeOf(X), 0);
  i := 0;
  while i < (lswlen and 63) do
  begin
    X[i shr 2] := X[i shr 2] xor (PByte(strptr)^ shl (8 * (i and 3)));
    Inc(i);
    strptr := Ptr(LongWord(strptr) + 1);
  end;
  X[(lswlen shr 2) and 15] := X[(lswlen shr 2) and 15] xor (LongWord(1) shl (8 * (lswlen and 3) + 7));
  if ((lswlen and 63) > 55) then
  begin
    if Cipher = 160 then
      compress160(MDbuf, X)
    else
      compress(MDbuf, X);
    FillChar(X, SizeOf(X), 0);
  end;
  X[14] := lswlen shl 3;
  X[15] := (lswlen shr 29) or (mswlen shl 3);
  if Cipher = 160 then
    compress160(MDbuf, X)
  else
    compress(MDbuf, X);
end;

function RMDFinal(var md: TRMDCtx; sz: LongWord): String;
begin
  Inc(md.length, md.curlen);
  MDfinish(md.MDbuf, @md.buf, md.length, 0, sz);
  Result :=
    IntToHex(Endian(md.MDBuf[0]), 8) +
    IntToHex(Endian(md.MDBuf[1]), 8) +
    IntToHex(Endian(md.MDBuf[2]), 8) +
    IntToHex(Endian(md.MDBuf[3]), 8);
  if sz = 160 then
    Result := Result + IntToHex(Endian(md.MDBuf[4]), 8);
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -