📄 synacode.pas
字号:
function MD5Final(var MD5Context: TMD5Ctx): AnsiString;
var
Cnt: Word;
P: Byte;
digest: array[0..15] of Byte;
i: Integer;
n: integer;
begin
for I := 0 to 15 do
Digest[I] := I + 1;
with MD5Context do
begin
Cnt := (Count[0] shr 3) and $3F;
P := Cnt;
BufAnsiChar[P] := $80;
Inc(P);
Cnt := 64 - 1 - Cnt;
if Cnt < 8 then
begin
for n := 0 to cnt - 1 do
BufAnsiChar[P + n] := 0;
ArrByteToLong(BufAnsiChar, BufLong);
// FillChar(BufAnsiChar[P], Cnt, #0);
MD5Transform(State, BufLong);
ArrLongToByte(BufLong, BufAnsiChar);
for n := 0 to 55 do
BufAnsiChar[n] := 0;
ArrByteToLong(BufAnsiChar, BufLong);
// FillChar(BufAnsiChar, 56, #0);
end
else
begin
for n := 0 to Cnt - 8 - 1 do
BufAnsiChar[p + n] := 0;
ArrByteToLong(BufAnsiChar, BufLong);
// FillChar(BufAnsiChar[P], Cnt - 8, #0);
end;
BufLong[14] := Count[0];
BufLong[15] := Count[1];
MD5Transform(State, BufLong);
ArrLongToByte(State, Digest);
// Move(State, Digest, 16);
Result := '';
for i := 0 to 15 do
Result := Result + AnsiChar(digest[i]);
end;
// FillChar(MD5Context, SizeOf(TMD5Ctx), #0)
end;
{==============================================================================}
function MD5(const Value: AnsiString): AnsiString;
var
MD5Context: TMD5Ctx;
begin
MD5Init(MD5Context);
MD5Update(MD5Context, Value);
Result := MD5Final(MD5Context);
end;
{==============================================================================}
function HMAC_MD5(Text, Key: AnsiString): AnsiString;
var
ipad, opad, s: AnsiString;
n: Integer;
MD5Context: TMD5Ctx;
begin
if Length(Key) > 64 then
Key := md5(Key);
ipad := StringOfChar(#$36, 64);
opad := StringOfChar(#$5C, 64);
for n := 1 to Length(Key) do
begin
ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n]));
opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n]));
end;
MD5Init(MD5Context);
MD5Update(MD5Context, ipad);
MD5Update(MD5Context, Text);
s := MD5Final(MD5Context);
MD5Init(MD5Context);
MD5Update(MD5Context, opad);
MD5Update(MD5Context, s);
Result := MD5Final(MD5Context);
end;
{==============================================================================}
function MD5LongHash(const Value: AnsiString; Len: integer): AnsiString;
var
cnt, rest: integer;
l: integer;
n: integer;
MD5Context: TMD5Ctx;
begin
l := length(Value);
cnt := Len div l;
rest := Len mod l;
MD5Init(MD5Context);
for n := 1 to cnt do
MD5Update(MD5Context, Value);
if rest > 0 then
MD5Update(MD5Context, Copy(Value, 1, rest));
Result := MD5Final(MD5Context);
end;
{==============================================================================}
// SHA1 is based on sources by Dave Barton (davebarton@bigfoot.com)
procedure SHA1init( var SHA1Context: TSHA1Ctx );
var
n: integer;
begin
SHA1Context.Hi := 0;
SHA1Context.Lo := 0;
SHA1Context.Index := 0;
for n := 0 to High(SHA1Context.Buffer) do
SHA1Context.Buffer[n] := 0;
for n := 0 to High(SHA1Context.HashByte) do
SHA1Context.HashByte[n] := 0;
// FillChar(SHA1Context, SizeOf(TSHA1Ctx), #0);
SHA1Context.Hash[0] := integer($67452301);
SHA1Context.Hash[1] := integer($EFCDAB89);
SHA1Context.Hash[2] := integer($98BADCFE);
SHA1Context.Hash[3] := integer($10325476);
SHA1Context.Hash[4] := integer($C3D2E1F0);
end;
//******************************************************************************
function RB(A: integer): integer;
begin
Result := (A shr 24) or ((A shr 8) and $FF00) or ((A shl 8) and $FF0000) or (A shl 24);
end;
procedure SHA1Compress(var Data: TSHA1Ctx);
var
A, B, C, D, E, T: integer;
W: array[0..79] of integer;
i: integer;
n: integer;
function F1(x, y, z: integer): integer;
begin
Result := z xor (x and (y xor z));
end;
function F2(x, y, z: integer): integer;
begin
Result := x xor y xor z;
end;
function F3(x, y, z: integer): integer;
begin
Result := (x and y) or (z and (x or y));
end;
function LRot32(X: integer; c: integer): integer;
begin
result := (x shl c) or (x shr (32 - c));
end;
begin
ArrByteToLong(Data.Buffer, W);
// 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] + integer($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] + integer($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] + integer($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] + integer($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;
for n := 0 to high(w) do
w[n] := 0;
// FillChar(W, Sizeof(W), 0);
for n := 0 to high(Data.Buffer) do
Data.Buffer[n] := 0;
// FillChar(Data.Buffer, Sizeof(Data.Buffer), 0);
end;
//******************************************************************************
procedure SHA1Update(var Context: TSHA1Ctx; const Data: AnsiString);
var
Len: integer;
n: integer;
i, k: integer;
begin
Len := Length(data);
for k := 0 to 7 do
begin
i := Context.Lo;
Inc(Context.Lo, Len);
if Context.Lo < i then
Inc(Context.Hi);
end;
for n := 1 to len do
begin
Context.Buffer[Context.Index] := byte(Data[n]);
Inc(Context.Index);
if Context.Index = 64 then
begin
Context.Index := 0;
SHA1Compress(Context);
end;
end;
end;
//******************************************************************************
function SHA1Final(var Context: TSHA1Ctx): AnsiString;
type
Pinteger = ^integer;
var
i: integer;
procedure ItoArr(var Ar: Array of byte; I, value: Integer);
begin
Ar[i + 0] := Value and $000000FF;
Ar[i + 1] := (Value shr 8) and $000000FF;
Ar[i + 2] := (Value shr 16) and $000000FF;
Ar[i + 3] := (Value shr 24) and $000000FF;
end;
begin
Context.Buffer[Context.Index] := $80;
if Context.Index >= 56 then
SHA1Compress(Context);
ItoArr(Context.Buffer, 56, RB(Context.Hi));
ItoArr(Context.Buffer, 60, RB(Context.Lo));
// Pinteger(@Context.Buffer[56])^ := RB(Context.Hi);
// Pinteger(@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]);
ArrLongToByte(Context.Hash, Context.HashByte);
Result := '';
for i := 0 to 19 do
Result := Result + AnsiChar(Context.HashByte[i]);
end;
function SHA1(const Value: AnsiString): AnsiString;
var
SHA1Context: TSHA1Ctx;
begin
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, Value);
Result := SHA1Final(SHA1Context);
end;
{==============================================================================}
function HMAC_SHA1(Text, Key: AnsiString): AnsiString;
var
ipad, opad, s: AnsiString;
n: Integer;
SHA1Context: TSHA1Ctx;
begin
if Length(Key) > 64 then
Key := SHA1(Key);
ipad := StringOfChar(#$36, 64);
opad := StringOfChar(#$5C, 64);
for n := 1 to Length(Key) do
begin
ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n]));
opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n]));
end;
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, ipad);
SHA1Update(SHA1Context, Text);
s := SHA1Final(SHA1Context);
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, opad);
SHA1Update(SHA1Context, s);
Result := SHA1Final(SHA1Context);
end;
{==============================================================================}
function SHA1LongHash(const Value: AnsiString; Len: integer): AnsiString;
var
cnt, rest: integer;
l: integer;
n: integer;
SHA1Context: TSHA1Ctx;
begin
l := length(Value);
cnt := Len div l;
rest := Len mod l;
SHA1Init(SHA1Context);
for n := 1 to cnt do
SHA1Update(SHA1Context, Value);
if rest > 0 then
SHA1Update(SHA1Context, Copy(Value, 1, rest));
Result := SHA1Final(SHA1Context);
end;
{==============================================================================}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -