请问一下有什么能在delphi 2009下用的加密解密的控件或算法接口什么的? 以前用的AES的算法接口在delphi 2009里不能用了. 似乎是字符串长度的改变不兼容delphi 2009了.
http://download.csdn.net/source/142372请问一下有什么能在delphi 2009下正常使用的加密解密算法吗? 非常感谢.谢谢.

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    没那么简单我把所以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;
      

  5.   

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

  6.   

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

  7.   


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

  8.   

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

  9.   

    請問 
    i8013 您好,我是台湾的网友, 请教您 有关您 PO 的 AES.PAS 加密问题  
    原文 :
    http://download.csdn.net/source/1333382在 2011 XE 中,编译可以通过,但是 以下字符串,加密后,再解密后就不是原来的字符串了
    测试字符串如下 : delphi 煊堃     , 解密后 : Delphi ??
    煊堃 是 UNICODE 字体
    应该是 UNICODE 的字符串问题,不改 Aes.pas 的程序,可以吗 ?
    您的范例用的是 GB 码, 印象中 GB 码也是 UNICODE 的一种
    为何您的范例可以,我输入的就不行 ?? 感谢您