从DELPHI2009开始,所有的string类型都被编译器当成了widestring了.早期版本的各个模块单元不得不重写.前些天一直在忙着处理这个AES单元,在网上搜索到了几个所谓的解决方案,但实际上都是在乱来,结果虽然是正确的,但是比结果更为重要的是修改的思路吧.这个单元在D2009无法使用,是因为输出结果时使用的是widestring导致尾部有部分字符被截断. 网上的解决办法居然是去修改原来封装得接近完美的单元...天...其实这问题很容易解决,只要重写一下他的输出流...
共有两个单元,AES,和ELAES,以下是AES单元的主要内容.ELAES单元不需要改动.不多说了,需要的自己看吧.
type
TMyStringStream=class(TStringStream)
function GetHexData:string;
end;
implementation
{ TMyStringStream }
function TMyStringStream.GetHexData: string;
var
i:integer;
begin
for I := 0 to (size - 1) do //div 2 do
Result := Result + IntToHex(Bytes[I], 2);
end;
function AES_EncryptString(Value,Key: String): string;
var
SS, DS: TMyStringStream;
Size: Integer;
AESKey: TAESKey128;
Key: AnsiString;//string;
AnsiValue:AnsiString;
begin
AnsiValue:=Value;
Result := '';
SS := TMyStringStream.Create(AnsiValue);
DS := TMyStringStream.Create('');
try
Size := SS.Size;
DS.WriteBuffer(Size, SizeOf(Size));
FillChar(AESKey, SizeOf(AESKey), 0);
Move(PAnsiChar(Key)^, AESKey, Min(SizeOf(AESKey), Length(Key)));
EncryptAESStreamECB(SS, 0, AESKey, DS);
Result :=DS.GetHexData;// StrToHex(DS.DataString);
finally
SS.Free;
DS.Free;
end;
end;
function AES_DecryptString(Value,Key: string): string;
var
SS: TMyStringStream;
DS: TMyStringStream;
Size: Integer;
AESKey: TAESKey128;
Key: AnsiString;
begin
Result := '';
SS := TMyStringStream.Create(HexToAnsi(Value));//Trim(HexToStr(Value)));
DS := TMyStringStream.Create('');
try
Size := SS.Size;
SS.ReadBuffer(Size, SizeOf(Size)); //起始信息
FillChar(AESKey, SizeOf(AESKey), 0);
Move(PAnsiChar(Key)^, AESKey, Min(SizeOf(AESKey), Length(Key)));
DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey, DS);
//DecryptAESStreamECB(SS, SS.Size, AESKey, DS);
//Result :=DS.GetStringData;//
Result := DS.DataString;
finally
SS.Free;
DS.Free;
end;
end;