delphi xe SHA1


本文整理自网络,侵删。

 

调用:
var
s:string;
begin
   s:=SHA1encode('abc');
   ShowMessage(s);
end;

 

 

{**************************************************** A binary compatible SHA1 implementation         ** written by Dave Barton (davebarton@bigfoot.com) ***************************************************** 160bit hash size                                ****************************************************}unit sha1;interfaceuses  Sysutils,windows,Classes;type  TSHA1Digest= array[0..19] of byte;  TSHA1Context= record    Hash: array[0..4] of DWord;    Hi, Lo: integer;    Buffer: array[0..63] of byte;    Index: integer;  end;procedure SHA1Init(var Context: TSHA1Context);procedure SHA1Update(var Context: TSHA1Context; Buffer: pointer; Len: integer);procedure SHA1Final(var Context: TSHA1Context; var Digest: TSHA1Digest);function SHA1encode(const s:AnsiString):AnsiString;//******************************************************************************implementation{$R-}function SHA1encode(const s:AnsiString):AnsiString;var  Context: TSHA1Context;  Digest: TSHA1Digest;  outs:array [0..40] of char ;begin  SHA1Init(Context);  SHA1Update(Context,@s[1],length(s));  SHA1Final(Context,Digest);  BinToHex(pchar(@Digest),pchar(@outs[0]),Sizeof(Digest));  outs[40]:=#0;  result:=AnsiString(outs);end;//******************************************************************************function F1(x, y, z: DWord): DWord;begin  Result:= z xor (x and (y xor z));end;function F2(x, y, z: DWord): DWord;begin  Result:= x xor y xor z;end;function F3(x, y, z: DWord): DWord;begin  Result:= (x and y) or (z and (x or y));end;//******************************************************************************function RB(A: DWord): DWord;begin  Result:= (A shr 24) or ((A shr 8) and $FF00) or ((A shl 8) and $FF0000) or (A shl 24);end;function LRot32(X: dword; c: integer): dword; register; assembler;asm  mov ecx, edx  rol eax, clend;procedure SHA1Compress(var Data: TSHA1Context);var  A, B, C, D, E, T: DWord;  W: array[0..79] of DWord;  i: integer;begin  Move(Data.Buffer,W,Sizeof(Data.Buffer));  for i:= 0 to 15 do    W[i]:= RB(W[i]);  for i:= 16 to 79 do    W[i]:= LRot32(W[i-3] xor W[i-8] xor W[i-14] xor W[i-16],1);  A:= Data.Hash[0]; B:= Data.Hash[1]; C:= Data.Hash[2]; D:= Data.Hash[3]; E:= Data.Hash[4];  for i:= 0 to 19 do  begin    T:= LRot32(A,5) + F1(B,C,D) + E + W[i] + $5A827999;    E:= D; D:= C; C:= LRot32(B,30); B:= A; A:= T;  end;  for i:= 20 to 39 do  begin    T:= LRot32(A,5) + F2(B,C,D) + E + W[i] + $6ED9EBA1;    E:= D; D:= C; C:= LRot32(B,30); B:= A; A:= T;  end;  for i:= 40 to 59 do  begin    T:= LRot32(A,5) + F3(B,C,D) + E + W[i] + $8F1BBCDC;    E:= D; D:= C; C:= LRot32(B,30); B:= A; A:= T;  end;  for i:= 60 to 79 do  begin    T:= LRot32(A,5) + F2(B,C,D) + E + W[i] + $CA62C1D6;    E:= D; D:= C; C:= LRot32(B,30); B:= A; A:= T;  end;  Data.Hash[0]:= Data.Hash[0] + A;  Data.Hash[1]:= Data.Hash[1] + B;  Data.Hash[2]:= Data.Hash[2] + C;  Data.Hash[3]:= Data.Hash[3] + D;  Data.Hash[4]:= Data.Hash[4] + E;  FillChar(W,Sizeof(W),0);  FillChar(Data.Buffer,Sizeof(Data.Buffer),0);end;//******************************************************************************procedure SHA1Init(var Context: TSHA1Context);begin  Context.Hi:= 0; Context.Lo:= 0;  Context.Index:= 0;  FillChar(Context.Buffer,Sizeof(Context.Buffer),0);  Context.Hash[0]:= $67452301;  Context.Hash[1]:= $EFCDAB89;  Context.Hash[2]:= $98BADCFE;  Context.Hash[3]:= $10325476;  Context.Hash[4]:= $C3D2E1F0;end;//******************************************************************************procedure SHA1UpdateLen(var Context: TSHA1Context; Len: integer);var  i, k: integer;begin  for k:= 0 to 7 do  begin    i:= Context.Lo;    Inc(Context.Lo,Len);    if Context.Lo< i then      Inc(Context.Hi);  end;end;//******************************************************************************procedure SHA1Update(var Context: TSHA1Context; Buffer: pointer; Len: integer);type  PByte= ^Byte;begin  SHA1UpdateLen(Context,Len);  while Len> 0 do  begin    Context.Buffer[Context.Index]:= PByte(Buffer)^;    Inc(PByte(Buffer));    Inc(Context.Index);    Dec(Len);    if Context.Index= 64 then    begin      Context.Index:= 0;      SHA1Compress(Context);    end;  end;end;//******************************************************************************procedure SHA1Final(var Context: TSHA1Context; var Digest: TSHA1Digest);type  PDWord= ^DWord;begin  Context.Buffer[Context.Index]:= $80;  if Context.Index>= 56 then    SHA1Compress(Context);  PDWord(@Context.Buffer[56])^:= RB(Context.Hi);  PDWord(@Context.Buffer[60])^:= RB(Context.Lo);  SHA1Compress(Context);  Context.Hash[0]:= RB(Context.Hash[0]);  Context.Hash[1]:= RB(Context.Hash[1]);  Context.Hash[2]:= RB(Context.Hash[2]);  Context.Hash[3]:= RB(Context.Hash[3]);  Context.Hash[4]:= RB(Context.Hash[4]);  Move(Context.Hash,Digest,Sizeof(Digest));  FillChar(Context,Sizeof(Context),0);end;end.


 

相关阅读 >>

Delphi 几种程序自杀的方法

Delphi free和freeandnil之间的区别

Delphi 输出用空格对齐字符串的函数

Delphi x秒生成大量垃圾字符

Delphi文件复制函数

Delphi 调用golang dll

Delphi_关于null,nil

Delphi 文件夹操作

Delphi api 函数中使用 pchar 参数的几种方法

Delphi adoconnection连接 sqlserver

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...