有没有类似MD5的函数代码 或者其他加密算法?或者能够从一串输入字符串单射生成另一字符串的函数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个简单的字符串映射m,s: String;s[1] := m[1];s[n] := m[n-1] xor m[n] xor n; 我有,unit Md5;interfaceuses SysUtils, Classes, Controls;Const S11 = 7; S12 = 12; S13 = 17; S14 = 22; S21 = 5; S22 = 9; S23 = 14; S24 = 20; S31 = 4; S32 = 11; S33 = 16; S34 = 23; S41 = 6; S42 = 10; S43 = 15; S44 = 21;type TSourceType = (SourceFile, SourceByteArray, SourceString); ULONG32 = record LoWord16: WORD; HiWord16: WORD; end; PULONG32 = ^ULONG32; PLong = ^LongInt; hashDigest = record A: Longint; B: Longint; C: Longint; D: Longint; end; PTR_Hash = ^hashDigest; TMd5 = class(TComponent) private FType : TSourceType; FInputFilePath: String; FInputArray: PByte; FOutputDigest: PTR_Hash; FSourceLength: LongInt; FActiveBlock: Array[0..15] of LongInt; FA, FB, FC, FD, FAA, FBB, FCC, FDD: LongInt; FpA, FpB, FpC, FpD: PLong; procedure FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint); procedure GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint); Procedure HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint); procedure II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint); protected { Protected declarations } public { Public declarations } procedure Md5_Initialize; procedure Md5_Transform; procedure Md5_Hash_Bytes; procedure Md5_Hash_File; function Md5_Hash(ss: String): String; property pInputArray: PByte read FInputArray write FInputArray; property pOutputArray: PTR_Hash read FOutputDigest write FOutputDigest;{!!See FOutputArray} property InputFilePath: String read FInputFilePath write FInputFilePath; property InputLength: LongInt read FSourceLength write FSourceLength; published property InputType: TSourceType read FType write FType; end; procedure Register;implementationfunction ROL(A: Longint; Amount: BYTE): Longint; Assembler;asm mov cl, Amount rol eax, clend;procedure Register;begin RegisterComponents('Standard', [TMd5]);end;procedure TMd5.Md5_Initialize;var a, b, c, d: LongInt;begin a := $67452301; b:=$efcdab89; c:=$98badcfe; d:=$10325476; Move(a, FA, 4); FpA := @FA; Move(b, FB, 4); FpB := @FB; Move(c, FC, 4); FpC := @FC; Move(d, FD, 4); FpD := @FD;end;procedure TMd5.FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);var Fret: LongInt;begin Fret := ((PLong(b)^) And (PLong(c)^)) Or ((Not(PLong(b)^)) And (PLong(d)^)); PLong(a)^ := PLong(a)^ + Fret + PLong(x)^ + ac; LongInt(a^):= ROL(LongInt(a^), s); Inc(PLong(a)^, PLong(b)^);end;procedure TMd5.GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);var Gret: LongInt;begin Gret := (PLong(b)^ And PLong(d)^) Or ( PLong(c)^ And (Not PLong(d)^)); PLong(a)^ := PLong(a)^ + Gret + PLong(x)^ + ac; LongInt(a^):= ROL(LongInt(a^), s); Inc(PLong(a)^, PLong(b)^);end;procedure TMd5.HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);var Hret: LongInt;begin Hret := PLong(b)^ Xor PLong(c)^ Xor PLong(d)^; PLong(a)^ := PLong(a)^ + Hret + PLong(x)^ + ac; LongInt(a^):= ROL(LongInt(a^), s); PLong(a)^ := PLong(b)^ + PLong(a)^;end;procedure TMd5.II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);var Iret: LongInt;begin Iret := (PLong(c)^ Xor (PLong(b)^ Or (Not PLong(d)^))); PLong(a)^ := PLong(a)^ + Iret + PLong(x)^ + ac; LongInt(a^):= ROL(PLong(a)^, s ); PLong(a)^ := PLong(b)^ + PLong(a)^;end;procedure TMd5.Md5_Transform;begin FAA := FA; FBB := FB; FCC := FC; FDD := FD; FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S11, $d76aa478); FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 1], S12, $e8c7b756); FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S13, $242070db); FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 3], S14, $c1bdceee); FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S11, $f57c0faf); FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 5], S12, $4787c62a); FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S13, $a8304613); FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 7], S14, $fd469501); FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S11, $698098d8); FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 9], S12, $8b44f7af); FF (FpC, FpD, FpA, FpB, @FActiveBlock[10], S13, $ffff5bb1); FF (FpB, FpC, FpD, FpA, @FActiveBlock[11], S14, $895cd7be); FF (FpA, FpB, FpC, FpD, @FActiveBlock[12], S11, $6b901122); FF (FpD, FpA, FpB, FpC, @FActiveBlock[13], S12, $fd987193); FF (FpC, FpD, FpA, FpB, @FActiveBlock[14], S13, $a679438e); FF (FpB, FpC, FpD, FpA, @FActiveBlock[15], S14, $49b40821); GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S21, $f61e2562); GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 6], S22, $c040b340); GG (FpC, FpD, FpA, FpB, @FActiveBlock[11], S23, $265e5a51); GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 0], S24, $e9b6c7aa); GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S21, $d62f105d); GG (FpD, FpA, FpB, FpC, @FActiveBlock[10], S22, $2441453); GG (FpC, FpD, FpA, FpB, @FActiveBlock[15], S23, $d8a1e681); GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 4], S24, $e7d3fbc8); GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S21, $21e1cde6); GG (FpD, FpA, FpB, FpC, @FActiveBlock[14], S22, $c33707d6); GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S23, $f4d50d87); GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 8], S24, $455a14ed); GG (FpA, FpB, FpC, FpD, @FActiveBlock[13], S21, $a9e3e905); GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 2], S22, $fcefa3f8); GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S23, $676f02d9); GG (FpB, FpC, FpD, FpA, @FActiveBlock[12], S24, $8d2a4c8a); HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S31, $fffa3942); HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 8], S32, $8771f681); HH (FpC, FpD, FpA, FpB, @FActiveBlock[11], S33, $6d9d6122); HH (FpB, FpC, FpD, FpA, @FActiveBlock[14], S34, $fde5380c); HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S31, $a4beea44); HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 4], S32, $4bdecfa9); HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S33, $f6bb4b60); HH (FpB, FpC, FpD, FpA, @FActiveBlock[10], S34, $bebfbc70); HH (FpA, FpB, FpC, FpD, @FActiveBlock[13], S31, $289b7ec6); HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 0], S32, $eaa127fa); HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S33, $d4ef3085); HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 6], S34, $4881d05); HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S31, $d9d4d039); HH (FpD, FpA, FpB, FpC, @FActiveBlock[12], S32, $e6db99e5); HH (FpC, FpD, FpA, FpB, @FActiveBlock[15], S33, $1fa27cf8); HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 2], S34, $c4ac5665); II (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S41, $f4292244); II (FpD, FpA, FpB, FpC, @FActiveBlock[ 7], S42, $432aff97); II (FpC, FpD, FpA, FpB, @FActiveBlock[14], S43, $ab9423a7); II (FpB, FpC, FpD, FpA, @FActiveBlock[ 5], S44, $fc93a039); II (FpA, FpB, FpC, FpD, @FActiveBlock[12], S41, $655b59c3); II (FpD, FpA, FpB, FpC, @FActiveBlock[ 3], S42, $8f0ccc92); II (FpC, FpD, FpA, FpB, @FActiveBlock[10], S43, $ffeff47d); II (FpB, FpC, FpD, FpA, @FActiveBlock[ 1], S44, $85845dd1); II (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S41, $6fa87e4f); II (FpD, FpA, FpB, FpC, @FActiveBlock[15], S42, $fe2ce6e0); II (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S43, $a3014314); II (FpB, FpC, FpD, FpA, @FActiveBlock[13], S44, $4e0811a1); II (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S41, $f7537e82); II (FpD, FpA, FpB, FpC, @FActiveBlock[11], S42, $bd3af235); II (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S43, $2ad7d2bb); II (FpB, FpC, FpD, FpA, @FActiveBlock[ 9], S44, $eb86d391); Inc(FA, FAA); Inc(FB, FBB); Inc(FC, FCC); Inc(FD, FDD); FillChar(FActiveBlock, SizeOf(FActiveBlock), #0);end; function TMd5.Md5_Hash(ss: String): String;var pStr: PChar; i: Integer; outblock: hashDigest; outarray: array[0..15] of char absolute outblock;begin pOutputArray:= @outblock; Md5_Initialize; case FType of SourceFile: Md5_Hash_File; SourceByteArray: Md5_Hash_Bytes; SourceString: begin pStr := StrAlloc(Length(ss) + 1); try StrPCopy(pStr, ss); FSourceLength := Length(ss); FInputArray := Pointer(pStr); Md5_Hash_Bytes; finally StrDispose(pStr); end; end; end; FOutputDigest^.A := LongInt(FpA^); FOutputDigest^.B := LongInt(FpB^); FOutputDigest^.C := LongInt(FpC^); FOutputDigest^.D := LongInt(FpD^); for i:= 0 to length(outarray)-1 do Result := Result + LowerCase(IntToHex(Byte(outarray[i]),2));end;procedure TMd5.Md5_Hash_Bytes;var Buffer: array[0..4159] of Byte; Count64: Comp; index: longInt;begin Move(FInputArray^, Buffer, FSourceLength); Count64 := FSourceLength * 8; Buffer[FSourceLength] := $80; inc(FSourceLength); while (FSourceLength mod 64)<>56 do begin Buffer[FSourceLength] := 0; Inc(FSourceLength); end; Move(Count64,Buffer[FSourceLength],SizeOf(Count64)); index := 0; Inc(FSourceLength, 8); repeat Move(Buffer[Index], FActiveBlock, 64); Md5_Transform; Inc(Index,64); until Index = FSourceLength;end;procedure TMd5.Md5_Hash_File;var Buffer:array[0..4159] of BYTE; InputFile: File; Count64: Comp; DoneFile : Boolean; Index: LongInt; NumRead: integer;begin DoneFile := False; AssignFile(InputFile, FInputFilePath); Reset(InputFile, 1); Count64 := 0; repeat BlockRead(InputFile,Buffer,4096,NumRead); Count64 := Count64 + NumRead; if NumRead<>4096 then begin Buffer[NumRead]:= $80; Inc(NumRead); while (NumRead mod 64)<>56 do begin Buffer[ NumRead ] := 0; Inc(NumRead); end; Count64 := Count64 * 8; Move(Count64,Buffer[NumRead],8); Inc(NumRead,8); DoneFile := True; end; Index := 0; repeat Move(Buffer[Index], FActiveBlock, 64); Md5_Transform; Inc(Index,64); until Index = NumRead; until DoneFile; CloseFile(InputFile);end;end. 为什么执行时,提示pOutputArray:= @outblock;错误 Automation Object DLL在ie中的调用细则? 请教各位高手,有谁知道深圳市宝腾互联科技有限公司(万分感谢) 你信吗,其实一开始我自己都不信..... 时间判断问题 delphi调用C语言的dll问题!请大家帮帮忙! 使用 Installshield express for delphi5.0打包程序是,如何配置bde别名,我用的是oracle 数据库 设计时怎样替换控件 怎么欺骗一段js代码本地执行? 关于不缓存到临时文件夹的验证码图片的保存 如何定制WINDOWS的鼠标右键弹出菜单? 我经常要用到Form1的属性,有没有简便的书写?(在线等) 游戏中的按钮和对话框
s[n] := m[n-1] xor m[n] xor n;
unit Md5;interfaceuses SysUtils, Classes, Controls;Const
S11 = 7;
S12 = 12;
S13 = 17;
S14 = 22;
S21 = 5;
S22 = 9;
S23 = 14;
S24 = 20;
S31 = 4;
S32 = 11;
S33 = 16;
S34 = 23;
S41 = 6;
S42 = 10;
S43 = 15;
S44 = 21;type
TSourceType = (SourceFile, SourceByteArray, SourceString);
ULONG32 = record
LoWord16: WORD;
HiWord16: WORD;
end;
PULONG32 = ^ULONG32;
PLong = ^LongInt;
hashDigest = record
A: Longint;
B: Longint;
C: Longint;
D: Longint;
end;
PTR_Hash = ^hashDigest; TMd5 = class(TComponent)
private
FType : TSourceType;
FInputFilePath: String;
FInputArray: PByte;
FOutputDigest: PTR_Hash;
FSourceLength: LongInt;
FActiveBlock: Array[0..15] of LongInt;
FA, FB, FC, FD, FAA, FBB, FCC, FDD: LongInt;
FpA, FpB, FpC, FpD: PLong;
procedure FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
procedure GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
Procedure HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
procedure II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
protected
{ Protected declarations }
public
{ Public declarations }
procedure Md5_Initialize;
procedure Md5_Transform;
procedure Md5_Hash_Bytes;
procedure Md5_Hash_File;
function Md5_Hash(ss: String): String;
property pInputArray: PByte read FInputArray write FInputArray;
property pOutputArray: PTR_Hash read FOutputDigest write FOutputDigest;{!!See FOutputArray}
property InputFilePath: String read FInputFilePath write FInputFilePath;
property InputLength: LongInt read FSourceLength write FSourceLength;
published
property InputType: TSourceType read FType write FType;
end; procedure Register;
implementationfunction ROL(A: Longint; Amount: BYTE): Longint; Assembler;
asm
mov cl, Amount
rol eax, cl
end;
procedure Register;
begin
RegisterComponents('Standard', [TMd5]);
end;procedure TMd5.Md5_Initialize;
var
a, b, c, d: LongInt;
begin
a := $67452301; b:=$efcdab89; c:=$98badcfe; d:=$10325476;
Move(a, FA, 4); FpA := @FA;
Move(b, FB, 4); FpB := @FB;
Move(c, FC, 4); FpC := @FC;
Move(d, FD, 4); FpD := @FD;
end;procedure TMd5.FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
var
Fret: LongInt;
begin
Fret := ((PLong(b)^) And (PLong(c)^)) Or ((Not(PLong(b)^)) And (PLong(d)^));
PLong(a)^ := PLong(a)^ + Fret + PLong(x)^ + ac;
LongInt(a^):= ROL(LongInt(a^), s);
Inc(PLong(a)^, PLong(b)^);
end;procedure TMd5.GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
var
Gret: LongInt;
begin
Gret := (PLong(b)^ And PLong(d)^) Or ( PLong(c)^ And (Not PLong(d)^));
PLong(a)^ := PLong(a)^ + Gret + PLong(x)^ + ac;
LongInt(a^):= ROL(LongInt(a^), s);
Inc(PLong(a)^, PLong(b)^);
end;procedure TMd5.HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
var
Hret: LongInt;
begin
Hret := PLong(b)^ Xor PLong(c)^ Xor PLong(d)^;
PLong(a)^ := PLong(a)^ + Hret + PLong(x)^ + ac;
LongInt(a^):= ROL(LongInt(a^), s);
PLong(a)^ := PLong(b)^ + PLong(a)^;
end;procedure TMd5.II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
var
Iret: LongInt;
begin
Iret := (PLong(c)^ Xor (PLong(b)^ Or (Not PLong(d)^)));
PLong(a)^ := PLong(a)^ + Iret + PLong(x)^ + ac;
LongInt(a^):= ROL(PLong(a)^, s );
PLong(a)^ := PLong(b)^ + PLong(a)^;
end;procedure TMd5.Md5_Transform;
begin
FAA := FA;
FBB := FB;
FCC := FC;
FDD := FD;
FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S11, $d76aa478);
FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 1], S12, $e8c7b756);
FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S13, $242070db);
FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 3], S14, $c1bdceee);
FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S11, $f57c0faf);
FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 5], S12, $4787c62a);
FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S13, $a8304613);
FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 7], S14, $fd469501);
FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S11, $698098d8);
FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 9], S12, $8b44f7af);
FF (FpC, FpD, FpA, FpB, @FActiveBlock[10], S13, $ffff5bb1);
FF (FpB, FpC, FpD, FpA, @FActiveBlock[11], S14, $895cd7be);
FF (FpA, FpB, FpC, FpD, @FActiveBlock[12], S11, $6b901122);
FF (FpD, FpA, FpB, FpC, @FActiveBlock[13], S12, $fd987193);
FF (FpC, FpD, FpA, FpB, @FActiveBlock[14], S13, $a679438e);
FF (FpB, FpC, FpD, FpA, @FActiveBlock[15], S14, $49b40821);
GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S21, $f61e2562);
GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 6], S22, $c040b340);
GG (FpC, FpD, FpA, FpB, @FActiveBlock[11], S23, $265e5a51);
GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 0], S24, $e9b6c7aa);
GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S21, $d62f105d);
GG (FpD, FpA, FpB, FpC, @FActiveBlock[10], S22, $2441453);
GG (FpC, FpD, FpA, FpB, @FActiveBlock[15], S23, $d8a1e681);
GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 4], S24, $e7d3fbc8);
GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S21, $21e1cde6);
GG (FpD, FpA, FpB, FpC, @FActiveBlock[14], S22, $c33707d6);
GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S23, $f4d50d87);
GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 8], S24, $455a14ed);
GG (FpA, FpB, FpC, FpD, @FActiveBlock[13], S21, $a9e3e905);
GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 2], S22, $fcefa3f8);
GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S23, $676f02d9);
GG (FpB, FpC, FpD, FpA, @FActiveBlock[12], S24, $8d2a4c8a);
HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S31, $fffa3942);
HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 8], S32, $8771f681);
HH (FpC, FpD, FpA, FpB, @FActiveBlock[11], S33, $6d9d6122);
HH (FpB, FpC, FpD, FpA, @FActiveBlock[14], S34, $fde5380c);
HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S31, $a4beea44);
HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 4], S32, $4bdecfa9);
HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S33, $f6bb4b60);
HH (FpB, FpC, FpD, FpA, @FActiveBlock[10], S34, $bebfbc70);
HH (FpA, FpB, FpC, FpD, @FActiveBlock[13], S31, $289b7ec6);
HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 0], S32, $eaa127fa);
HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S33, $d4ef3085);
HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 6], S34, $4881d05);
HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S31, $d9d4d039);
HH (FpD, FpA, FpB, FpC, @FActiveBlock[12], S32, $e6db99e5);
HH (FpC, FpD, FpA, FpB, @FActiveBlock[15], S33, $1fa27cf8);
HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 2], S34, $c4ac5665);
II (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S41, $f4292244);
II (FpD, FpA, FpB, FpC, @FActiveBlock[ 7], S42, $432aff97);
II (FpC, FpD, FpA, FpB, @FActiveBlock[14], S43, $ab9423a7);
II (FpB, FpC, FpD, FpA, @FActiveBlock[ 5], S44, $fc93a039);
II (FpA, FpB, FpC, FpD, @FActiveBlock[12], S41, $655b59c3);
II (FpD, FpA, FpB, FpC, @FActiveBlock[ 3], S42, $8f0ccc92);
II (FpC, FpD, FpA, FpB, @FActiveBlock[10], S43, $ffeff47d);
II (FpB, FpC, FpD, FpA, @FActiveBlock[ 1], S44, $85845dd1);
II (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S41, $6fa87e4f);
II (FpD, FpA, FpB, FpC, @FActiveBlock[15], S42, $fe2ce6e0);
II (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S43, $a3014314);
II (FpB, FpC, FpD, FpA, @FActiveBlock[13], S44, $4e0811a1);
II (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S41, $f7537e82);
II (FpD, FpA, FpB, FpC, @FActiveBlock[11], S42, $bd3af235);
II (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S43, $2ad7d2bb);
II (FpB, FpC, FpD, FpA, @FActiveBlock[ 9], S44, $eb86d391);
Inc(FA, FAA);
Inc(FB, FBB);
Inc(FC, FCC);
Inc(FD, FDD);
FillChar(FActiveBlock, SizeOf(FActiveBlock), #0);
end;
var
pStr: PChar;
i: Integer;
outblock: hashDigest;
outarray: array[0..15] of char absolute outblock;
begin
pOutputArray:= @outblock;
Md5_Initialize;
case FType of
SourceFile: Md5_Hash_File;
SourceByteArray: Md5_Hash_Bytes;
SourceString: begin
pStr := StrAlloc(Length(ss) + 1);
try
StrPCopy(pStr, ss);
FSourceLength := Length(ss);
FInputArray := Pointer(pStr);
Md5_Hash_Bytes;
finally
StrDispose(pStr);
end;
end;
end;
FOutputDigest^.A := LongInt(FpA^);
FOutputDigest^.B := LongInt(FpB^);
FOutputDigest^.C := LongInt(FpC^);
FOutputDigest^.D := LongInt(FpD^);
for i:= 0 to length(outarray)-1 do Result := Result + LowerCase(IntToHex(Byte(outarray[i]),2));
end;procedure TMd5.Md5_Hash_Bytes;
var
Buffer: array[0..4159] of Byte;
Count64: Comp;
index: longInt;
begin
Move(FInputArray^, Buffer, FSourceLength);
Count64 := FSourceLength * 8;
Buffer[FSourceLength] := $80;
inc(FSourceLength);
while (FSourceLength mod 64)<>56 do begin
Buffer[FSourceLength] := 0;
Inc(FSourceLength);
end;
Move(Count64,Buffer[FSourceLength],SizeOf(Count64));
index := 0;
Inc(FSourceLength, 8);
repeat
Move(Buffer[Index], FActiveBlock, 64);
Md5_Transform;
Inc(Index,64);
until Index = FSourceLength;
end;procedure TMd5.Md5_Hash_File;
var
Buffer:array[0..4159] of BYTE;
InputFile: File;
Count64: Comp;
DoneFile : Boolean;
Index: LongInt;
NumRead: integer;
begin
DoneFile := False;
AssignFile(InputFile, FInputFilePath);
Reset(InputFile, 1);
Count64 := 0;
repeat
BlockRead(InputFile,Buffer,4096,NumRead);
Count64 := Count64 + NumRead;
if NumRead<>4096 then begin
Buffer[NumRead]:= $80;
Inc(NumRead);
while (NumRead mod 64)<>56 do begin
Buffer[ NumRead ] := 0;
Inc(NumRead);
end;
Count64 := Count64 * 8;
Move(Count64,Buffer[NumRead],8);
Inc(NumRead,8);
DoneFile := True;
end;
Index := 0;
repeat
Move(Buffer[Index], FActiveBlock, 64);
Md5_Transform;
Inc(Index,64);
until Index = NumRead;
until DoneFile;
CloseFile(InputFile);
end;
end.
pOutputArray:= @outblock;
错误