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

📄 dcpsha512.pas

📁 delphi下一整套加密组件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  TestHash: TDCP_sha384;
  TestOut: array[0..47] of byte;
begin
  TestHash:= TDCP_sha384.Create(nil);
  TestHash.Init;
  TestHash.UpdateStr('abc');
  TestHash.Final(TestOut);
  Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)));
  TestHash.Init;
  TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu');
  TestHash.Final(TestOut);
  Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result;
  TestHash.Free;
end;

procedure TDCP_sha384.Init;
begin
  Burn;
  CurrentHash[0]:= $cbbb9d5dc1059ed8;
  CurrentHash[1]:= $629a292a367cd507;
  CurrentHash[2]:= $9159015a3070dd17;
  CurrentHash[3]:= $152fecd8f70e5939;
  CurrentHash[4]:= $67332667ffc00b31;
  CurrentHash[5]:= $8eb44a8768581511;
  CurrentHash[6]:= $db0c2e0d64f98fa7;
  CurrentHash[7]:= $47b5481dbefa4fa4;
  fInitialized:= true;
end;

procedure TDCP_sha384.Final(var Digest);
begin
  if not fInitialized then
    raise EDCP_hash.Create('Hash not initialized');
  HashBuffer[Index]:= $80;
  if Index>= 112 then
    Compress;
  Pint64(@HashBuffer[112])^:= SwapDWord(LenHi);
  Pint64(@HashBuffer[120])^:= SwapDWord(LenLo);
  Compress;
  CurrentHash[0]:= SwapDWord(CurrentHash[0]);
  CurrentHash[1]:= SwapDWord(CurrentHash[1]);
  CurrentHash[2]:= SwapDWord(CurrentHash[2]);
  CurrentHash[3]:= SwapDWord(CurrentHash[3]);
  CurrentHash[4]:= SwapDWord(CurrentHash[4]);
  CurrentHash[5]:= SwapDWord(CurrentHash[5]);
  Move(CurrentHash,Digest,384 div 8);
  Burn;
end;

{******************************************************************************}
class function TDCP_sha512.GetAlgorithm: string;
begin
  Result:= 'SHA512';
end;

class function TDCP_sha512.GetId: integer;
begin
  Result:= DCP_sha512;
end;

class function TDCP_sha512.GetHashSize: integer;
begin
  Result:= 512;
end;

class function TDCP_sha512.SelfTest: boolean;
const
  Test1Out: array[0..63] of byte=
    ($dd,$af,$35,$a1,$93,$61,$7a,$ba,$cc,$41,$73,$49,$ae,$20,$41,$31,
     $12,$e6,$fa,$4e,$89,$a9,$7e,$a2,$0a,$9e,$ee,$e6,$4b,$55,$d3,$9a,
     $21,$92,$99,$2a,$27,$4f,$c1,$a8,$36,$ba,$3c,$23,$a3,$fe,$eb,$bd,
     $45,$4d,$44,$23,$64,$3c,$e8,$0e,$2a,$9a,$c9,$4f,$a5,$4c,$a4,$9f);
  Test2Out: array[0..63] of byte=
    ($8e,$95,$9b,$75,$da,$e3,$13,$da,$8c,$f4,$f7,$28,$14,$fc,$14,$3f,
     $8f,$77,$79,$c6,$eb,$9f,$7f,$a1,$72,$99,$ae,$ad,$b6,$88,$90,$18,
     $50,$1d,$28,$9e,$49,$00,$f7,$e4,$33,$1b,$99,$de,$c4,$b5,$43,$3a,
     $c7,$d3,$29,$ee,$b6,$dd,$26,$54,$5e,$96,$e5,$5b,$87,$4b,$e9,$09);
var
  TestHash: TDCP_sha512;
  TestOut: array[0..63] of byte;
begin
  TestHash:= TDCP_sha512.Create(nil);
  TestHash.Init;
  TestHash.UpdateStr('abc');
  TestHash.Final(TestOut);
  Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)));
  TestHash.Init;
  TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu');
  TestHash.Final(TestOut);
  Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result;
  TestHash.Free;
end;

procedure TDCP_sha512.Init;
begin
  Burn;
  CurrentHash[0]:= $6a09e667f3bcc908;
  CurrentHash[1]:= $bb67ae8584caa73b;
  CurrentHash[2]:= $3c6ef372fe94f82b;
  CurrentHash[3]:= $a54ff53a5f1d36f1;
  CurrentHash[4]:= $510e527fade682d1;
  CurrentHash[5]:= $9b05688c2b3e6c1f;
  CurrentHash[6]:= $1f83d9abfb41bd6b;
  CurrentHash[7]:= $5be0cd19137e2179;
  fInitialized:= true;
end;

procedure TDCP_sha512.Final(var Digest);
begin
  if not fInitialized then
    raise EDCP_hash.Create('Hash not initialized');
  HashBuffer[Index]:= $80;
  if Index>= 112 then
    Compress;
  Pint64(@HashBuffer[112])^:= SwapDWord(LenHi);
  Pint64(@HashBuffer[120])^:= SwapDWord(LenLo);
  Compress;
  CurrentHash[0]:= SwapDWord(CurrentHash[0]);
  CurrentHash[1]:= SwapDWord(CurrentHash[1]);
  CurrentHash[2]:= SwapDWord(CurrentHash[2]);
  CurrentHash[3]:= SwapDWord(CurrentHash[3]);
  CurrentHash[4]:= SwapDWord(CurrentHash[4]);
  CurrentHash[5]:= SwapDWord(CurrentHash[5]);
  CurrentHash[6]:= SwapDWord(CurrentHash[6]);
  CurrentHash[7]:= SwapDWord(CurrentHash[7]);
  Move(CurrentHash,Digest,Sizeof(CurrentHash));
  Burn;
end;

end.

⌨️ 快捷键说明

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