请问一下有什么能在delphi 2009下用的加密解密的控件或算法接口什么的? 以前用的AES的算法接口在delphi 2009里不能用了. 似乎是字符串长度的改变不兼容delphi 2009了.
http://download.csdn.net/source/142372请问一下有什么能在delphi 2009下正常使用的加密解密算法吗? 非常感谢.谢谢.
http://download.csdn.net/source/142372请问一下有什么能在delphi 2009下正常使用的加密解密算法吗? 非常感谢.谢谢.
delphi2007 char 一个字节 ==> 2009 二个字节
在以下过程中Tstream中发生了d7和d2009中不一致得情况。tempout ==》TAESBuffer = array [0..15] of byte;procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position := 0;
Count := Source.Size;
end
else Count := Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done := Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
EncryptAES(TempIn, ExpandedKey, TempOut);
==========================================================
这里发生了变化不知为什么,d7和d2009中 tempout和sizeof(tempout)一致
但dest却不一致了
Done := Dest.Write(TempOut, SizeOf(TempOut));
===============================================================
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done := Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES(TempIn, ExpandedKey, TempOut);
======================================================
这里也是
Done := Dest.Write(TempOut, SizeOf(TempOut));
======================================================
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
我按user139的方法弄了下搞定。
d7到d2009对应的 string=ansistring pchar=ansichar
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
ss:AnsiString;
i,j:Integer;begin
ss:='';
if Count = 0 then
begin
Source.Position := 0;
Count := Source.Size;
end
else Count := Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done := Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
EncryptAES(TempIn, ExpandedKey, TempOut);
for I := 0 to 15 do
begin ss:=ss+ IntToHex( tempout[i],2);
end;
Done := dest.Write(tempout, SizeOf(tempout)); if Done < SizeOf(tempout) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done := Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES(TempIn, ExpandedKey, TempOut);
for j := 0 to 15 do
begin
ss:=ss+ IntToHex( tempout[j],2); end;
Done := dest.Write(Tempout, SizeOf(tempout));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end; Dest.Free;
Dest:= TStringStream.Create(ss);end;
用我的方法彻底解决这个问题.而且不需要改动人家的单元,那个AES加密单元ElAES.pas设计很精良,不需要改动.
直接到csdn搜"AES,delphi2009",可以下载我的源代码
http://download.csdn.net/source/1333382
i8013 您好,我是台湾的网友, 请教您 有关您 PO 的 AES.PAS 加密问题
原文 :
http://download.csdn.net/source/1333382在 2011 XE 中,编译可以通过,但是 以下字符串,加密后,再解密后就不是原来的字符串了
测试字符串如下 : delphi 煊堃 , 解密后 : Delphi ??
煊堃 是 UNICODE 字体
应该是 UNICODE 的字符串问题,不改 Aes.pas 的程序,可以吗 ?
您的范例用的是 GB 码, 印象中 GB 码也是 UNICODE 的一种
为何您的范例可以,我输入的就不行 ?? 感谢您