318 lines
9.2 KiB
ObjectPascal
318 lines
9.2 KiB
ObjectPascal
(**************************************************)
|
|
|
|
unit AES;
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Classes, Math, ElAES;
|
|
|
|
type
|
|
TKeyBit = (kb128, kb192, kb256);
|
|
|
|
function StrToHex(Value: string): string;
|
|
function HexToStr(Value: string): string;
|
|
function EncryptString(Value: string; Key: string;
|
|
KeyBit: TKeyBit = kb128): string;
|
|
function DecryptString(Value: string; Key: string;
|
|
KeyBit: TKeyBit = kb128): string;
|
|
function EncryptStream(Stream: TStream; Key: string;
|
|
KeyBit: TKeyBit = kb128): TStream;
|
|
function DecryptStream(Stream: TStream; Key: string;
|
|
KeyBit: TKeyBit = kb128): TStream;
|
|
procedure EncryptFile(SourceFile, DestFile: string;
|
|
Key: string; KeyBit: TKeyBit = kb128);
|
|
procedure DecryptFile(SourceFile, DestFile: string;
|
|
Key: string; KeyBit: TKeyBit = kb128);
|
|
|
|
implementation
|
|
|
|
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 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;
|
|
|
|
{ -- 字符串加密函数 默认按照 128 位密匙加密 -- }
|
|
function EncryptString(Value: string; Key: string;
|
|
KeyBit: TKeyBit = kb128): string;
|
|
var
|
|
SS, DS: TStringStream;
|
|
Size: Int64;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
Result := '';
|
|
SS := TStringStream.Create(Value);
|
|
DS := TStringStream.Create('');
|
|
try
|
|
Size := SS.Size;
|
|
DS.WriteBuffer(Size, SizeOf(Size));
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
EncryptAESStreamECB(SS, 0, AESKey128, DS);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
EncryptAESStreamECB(SS, 0, AESKey192, DS);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
EncryptAESStreamECB(SS, 0, AESKey256, DS);
|
|
end;
|
|
Result := StrToHex(DS.DataString);
|
|
finally
|
|
SS.Free;
|
|
DS.Free;
|
|
end;
|
|
end;
|
|
|
|
{ -- 字符串解密函数 默认按照 128 位密匙解密 -- }
|
|
function DecryptString(Value: string; Key: string;
|
|
KeyBit: TKeyBit = kb128): string;
|
|
var
|
|
SS, DS: TStringStream;
|
|
Size: Int64;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
Result := '';
|
|
SS := TStringStream.Create(HexToStr(Value));
|
|
DS := TStringStream.Create('');
|
|
try
|
|
Size := SS.Size;
|
|
SS.ReadBuffer(Size, SizeOf(Size));
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey128, DS);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey192, DS);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey256, DS);
|
|
end;
|
|
Result := DS.DataString;
|
|
finally
|
|
SS.Free;
|
|
DS.Free;
|
|
end;
|
|
end;
|
|
|
|
{ -- 流加密函数 默认按照 128 位密匙解密 -- }
|
|
function EncryptStream(Stream: TStream; Key: string;
|
|
KeyBit: TKeyBit = kb128): TStream;
|
|
var
|
|
Count: Int64;
|
|
OutStrm: TStream;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
OutStrm := TStream.Create;
|
|
Stream.Position := 0;
|
|
Count := Stream.Size;
|
|
OutStrm.Write(Count, SizeOf(Count));
|
|
try
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
EncryptAESStreamECB(Stream, 0, AESKey128, OutStrm);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
EncryptAESStreamECB(Stream, 0, AESKey192, OutStrm);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
EncryptAESStreamECB(Stream, 0, AESKey256, OutStrm);
|
|
end;
|
|
Result := OutStrm;
|
|
finally
|
|
OutStrm.Free;
|
|
end;
|
|
end;
|
|
|
|
{ -- 流解密函数 默认按照 128 位密匙解密 -- }
|
|
function DecryptStream(Stream: TStream; Key: string;
|
|
KeyBit: TKeyBit = kb128): TStream;
|
|
var
|
|
Count, OutPos: Int64;
|
|
OutStrm: TStream;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
OutStrm := TStream.Create;
|
|
Stream.Position := 0;
|
|
OutPos :=OutStrm.Position;
|
|
Stream.ReadBuffer(Count, SizeOf(Count));
|
|
try
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,
|
|
AESKey128, OutStrm);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,
|
|
AESKey192, OutStrm);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,
|
|
AESKey256, OutStrm);
|
|
end;
|
|
OutStrm.Size := OutPos + Count;
|
|
OutStrm.Position := OutPos;
|
|
Result := OutStrm;
|
|
finally
|
|
OutStrm.Free;
|
|
end;
|
|
end;
|
|
|
|
{ -- 文件加密函数 默认按照 128 位密匙解密 -- }
|
|
procedure EncryptFile(SourceFile, DestFile: string;
|
|
Key: string; KeyBit: TKeyBit = kb128);
|
|
var
|
|
SFS, DFS: TFileStream;
|
|
Size: Int64;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
SFS := TFileStream.Create(SourceFile, fmOpenRead);
|
|
try
|
|
DFS := TFileStream.Create(DestFile, fmCreate);
|
|
try
|
|
Size := SFS.Size;
|
|
DFS.WriteBuffer(Size, SizeOf(Size));
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
EncryptAESStreamECB(SFS, 0, AESKey128, DFS);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
EncryptAESStreamECB(SFS, 0, AESKey192, DFS);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
EncryptAESStreamECB(SFS, 0, AESKey256, DFS);
|
|
end;
|
|
finally
|
|
DFS.Free;
|
|
end;
|
|
finally
|
|
SFS.Free;
|
|
end;
|
|
end;
|
|
|
|
{ -- 文件解密函数 默认按照 128 位密匙解密 -- }
|
|
procedure DecryptFile(SourceFile, DestFile: string;
|
|
Key: string; KeyBit: TKeyBit = kb128);
|
|
var
|
|
SFS, DFS: TFileStream;
|
|
Size: Int64;
|
|
AESKey128: TAESKey128;
|
|
AESKey192: TAESKey192;
|
|
AESKey256: TAESKey256;
|
|
begin
|
|
SFS := TFileStream.Create(SourceFile, fmOpenRead);
|
|
try
|
|
SFS.ReadBuffer(Size, SizeOf(Size));
|
|
DFS := TFileStream.Create(DestFile, fmCreate);
|
|
try
|
|
{ -- 128 位密匙最大长度为 16 个字符 -- }
|
|
if KeyBit = kb128 then
|
|
begin
|
|
FillChar(AESKey128, SizeOf(AESKey128), 0 );
|
|
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
|
|
DecryptAESStreamECB(SFS, SFS.Size - SFS.Position, AESKey128, DFS);
|
|
end;
|
|
{ -- 192 位密匙最大长度为 24 个字符 -- }
|
|
if KeyBit = kb192 then
|
|
begin
|
|
FillChar(AESKey192, SizeOf(AESKey192), 0 );
|
|
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
|
|
DecryptAESStreamECB(SFS, SFS.Size - SFS.Position, AESKey192, DFS);
|
|
end;
|
|
{ -- 256 位密匙最大长度为 32 个字符 -- }
|
|
if KeyBit = kb256 then
|
|
begin
|
|
FillChar(AESKey256, SizeOf(AESKey256), 0 );
|
|
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
|
|
DecryptAESStreamECB(SFS, SFS.Size - SFS.Position, AESKey256, DFS);
|
|
end;
|
|
DFS.Size := Size;
|
|
finally
|
|
DFS.Free;
|
|
end;
|
|
finally
|
|
SFS.Free;
|
|
end;
|
|
end;
|
|
end.
|