以下代码出自http://blog.csdn.net/hellogv/,引用请注明出处!
代码有点乱,想要具体实现方法的朋友,可以给我留言
附:以下代码在杨泽晖 (Jorlen Young)所开发的AES算法接口上改进!
function StrToHex(Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
Result := Result + IntToHex(Ord(Value[I]), 2);
end;
function EncryptString(Value: string; Key: string): string;
var
SS, DS: TStringStream;
Size: Int64;
AESKey256: TAESKey256;
begin
Result := '';
SS := TStringStream.Create(Value);
DS := TStringStream.Create('');
try
Size := SS.Size;
DS.WriteBuffer(Size, SizeOf(Size));
FillChar(AESKey256, SizeOf(AESKey256), 0 );
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
EncryptAESStreamECB(SS, 0, AESKey256, DS);
Result := StrToHex(DS.DataString);
finally
SS.Free;
DS.Free;
end;
end;
function HexToStr(Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
begin
if ((I mod 2) = 1) then
Result := Result + Chr(StrToInt('0x'+ Copy(Value, I, 2)));
end;
end;
function DecryptString(Value: string; Key: string): string;
var
SS, DS: TStringStream;
Size: Int64;
AESKey256: TAESKey256;
begin
Result := '';
SS := TStringStream.Create(HexToStr(Value));
DS := TStringStream.Create('');
try
Size := SS.Size;
SS.ReadBuffer(Size, SizeOf(Size));
FillChar(AESKey256, SizeOf(AESKey256), 0 );
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey256, DS);
Result := DS.DataString;
finally
SS.Free;
DS.Free;
end;
end;
// ---------- 文件加密函数 按照 256 位密匙加密
procedure TSysClass.EncryptFile(SourceFile, DestFile: string;Key: string);
var
SFS, DFS: TFileStream;
Size: Int64;
AESKey256: TAESKey256;
info:string;
begin
SFS := TFileStream.Create(SourceFile, fmOpenRead);
try
DFS := TFileStream.Create(DestFile, fmCreate);
try
//-----------------------------文件解密部分---------------------------------
Size := SFS.Size;
DFS.WriteBuffer(Size, SizeOf(Size));
FillChar(AESKey256, SizeOf(AESKey256), 0 );
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
EncryptAESStreamECB(SFS, 0, AESKey256, DFS);
//-----------------------------在文件尾部加入判断解密是否成功的信息----------
info:=EncryptString('123456789',Key);
DFS.Seek(0,soFromEnd);
DFS.Write(Info[1],60);//往后面写入60个字符,其中有一些保留没有使用
finally
DFS.Free;
end;
finally
SFS.Free;
end;
end;
// ---------- 文件解密函数 按照 256 位密匙解密
Function TSysClass.DecryptFile(SourceFile, DestFile: string;Key: string):boolean;
var
Test, DFS: TFileStream;
SFS:TMemoryStream;
Size: Int64;
AESKey256: TAESKey256;
Info:string;
begin
SetLength(Info,60);
//----------------------------------------先检测文件解密是否正确-------------------
Test := TFileStream.Create(SourceFile, fmOpenRead);
try
Test.Seek(-60,soFromEnd);
Test.Read(Info[1],60);
//-----------------------------判断密码是否正确,如果错误
if AnsiContainsStr(Trim(info),EncryptString('123456789',Key)) = false then begin
result:=false;//解密失败
Test.Free;//释放流
exit;
end;
//-----------------------------如果密码正确,取得实际文件的内容
Test.Seek(0,soFromBeginning);
SFS:=TMemoryStream.Create;
SFS.CopyFrom(Test,Test.Size-60);
Test.Free;
except //-----------------------如果出现异常不能打开文件
SFS.Free;
Test.Free;
result:=false;
exit;
end;
//-------------------------------正式开始解密
SFS.Position:=0;
SFS.ReadBuffer(Size, SizeOf(Size));
DFS := TFileStream.Create(DestFile, fmCreate);
FillChar(AESKey256, SizeOf(AESKey256), 0 );
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
DecryptAESStreamECB(SFS, SFS.Size - SFS.Position, AESKey256, DFS);
DFS.Size := Size;
DFS.Free;
SFS.Free;
result:=true;
end;
//-----------------------【加密解密基础函数】----------------------------------------------------