+ -
当前位置:首页 → 问答吧 → 请问一下有什么能在delphi2009下用的加密解密的控件或算法接口什么的? 以前用的AES在delphi 2009里不能用了. 谢谢.

请问一下有什么能在delphi2009下用的加密解密的控件或算法接口什么的? 以前用的AES在delphi 2009里不能用了. 谢谢.

时间:2009-01-24

来源:互联网

请问一下有什么能在delphi 2009下用的加密解密的控件或算法接口什么的? 

以前用的AES的算法接口在delphi 2009里不能用了. 似乎是字符串长度的改变不兼容delphi 2009了.
http://download.csdn.net/source/142372

请问一下有什么能在delphi 2009下正常使用的加密解密算法吗? 非常感谢.

谢谢.

作者: bitbugs   发布时间: 2009-01-24

DELPHI2009下不兼容2007的主要原因是string.可以自己修改下代码就可以兼容

作者: codegame   发布时间: 2009-01-24



 注意 :  delphi2007 String  ==> delphi2009 AnsiString
  delphi2007 char 一个字节 ==> 2009 二个字节

作者: starluck   发布时间: 2009-01-24

字节数计算方法变了,解决方法同上

作者: gyk120   发布时间: 2009-01-26

谢谢楼上各位, 请问有没有啥编译开关之类的方法, 让一个pas默认按ansistring处理?

作者: bitbugs   发布时间: 2009-01-26

没那么简单我把所以String 换成ansistring也不行。

我测试发现的问题

ELAES单元中
在以下过程中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;

作者: chenday   发布时间: 2009-02-08

我已经改好了,方法就是在dest.write那里直接写入HEX码,而不是TempOut,需要用另外一个buffer.

作者: user139   发布时间: 2009-02-13

引用 6 楼 user139 的回复:
我已经改好了,方法就是在dest.write那里直接写入HEX码,而不是TempOut,需要用另外一个buffer.

user139:能将你改写的程序给我吗?谢谢!(1#sctc.cc请将#改为@)

作者: liaobo   发布时间: 2009-02-20


我按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;

作者: chenday   发布时间: 2009-03-06

mark

作者: lingyin55   发布时间: 2009-03-07

字符串不兼容,我记得曾经改过一个什么东西的源代码到2009下面,比较麻烦

作者: olivemfc   发布时间: 2009-03-07

升级到2009太痛苦了!

作者: liaobo   发布时间: 2009-03-09

以上方法均不是很好的,这没有必要改字符串的.改字符串,违背delphi2009的思想.
用我的方法彻底解决这个问题.而且不需要改动人家的单元,那个AES加密单元ElAES.pas设计很精良,不需要改动.
直接到csdn搜"AES,delphi2009",可以下载我的源代码
http://download.csdn.net/source/1333382

作者: i8013   发布时间: 2009-05-21

学习了。

作者: illiperson   发布时间: 2009-11-24

請問 
i8013 您好,我是台湾的网友, 请教您 有关您 PO 的 AES.PAS 加密问题  
原文 :
http://download.csdn.net/source/1333382

在 2011 XE 中,编译可以通过,但是 以下字符串,加密后,再解密后就不是原来的字符串了
测试字符串如下 : delphi 煊堃 , 解密后 : Delphi ??
煊堃 是 UNICODE 字体
应该是 UNICODE 的字符串问题,不改 Aes.pas 的程序,可以吗 ?
您的范例用的是 GB 码, 印象中 GB 码也是 UNICODE 的一种
为何您的范例可以,我输入的就不行 ?? 

感谢您

作者: drops711   发布时间: 2011-08-09