从delphi 7到xe的字符串编码错误

时间:2013-10-30 14:50:30

标签: string delphi encryption aes delphi-xe

我在互联网上发现了一些隐藏字符串的来源,我在delphi 7上看到字符串被加密和解密很好,当我尝试用delphi xe2,xe3,xe4,xe5做同样的事情时,加密端解密失败出现此错误"无效的缓冲区大小用于解密"

我从这里使用aes.pas和eiaes.pas:http://code.google.com/p/jalphi-lib/source/browse/trunk/codemyth/delphi/dontuseit/?r=7

我认为问题在于字符串的加入。

有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您提供链接的AES库尚未更新,以支持以后版本的Delphi(Delphi 2009以后版本)中的“ String ”现在是 UnicodeString 每个角色都是 WideChar

您有4个选项:

  1. 请与图书馆作者联系,询问是否有Unicode版本 计划/可用

  2. 尝试修改库以自己支持Unicode(或查找 能够/将帮助做到这一点的人

  3. 查找已支持Unicode的替代加密库

  4. 确保您只对文件库使用ANSI字符串。

  5. 最后一个选项对您来说可能不可行,但如果是,那么您仍然需要修改AES库,但不需要进行任何代码更改。

    问题是Delphi的更高版本中的“ String ”和“ Char ”是“ Wide ”类型(每个2字节) '字符')。这种差异几乎肯定会导致AES库中的代码出现问题,该代码假定每个字符只有 ONE 字节。

    您可以通过确保AES代码使用ANSI Strings来使这些假设有效。

    如果您选择这样做,那么我建议您引入两种新类型:

    type
      AESString = ANSIString;
      AESChar   = ANSIChar;
      PAESChar  = ^AESChar;
    

    然后,您需要通过AES库代码替换对“字符串”的任何引用,将“字符串”,“字符”替换为“字符串” “ AESChar ”和“ PChar ”与“ PAESChar ”。

    这应该使AES成为一个ANSI字符串库,如果这对你很重要,它仍然可用于Delphi 7(即Delphi 2009之前的版本)。

    如果您在将来发现需要完全支持Unicode字符串,然后需要正确修复AES库代码本身,您可以执行此操作,然后只需更改 AESString 和< strong> AESChar 类型:

    type
      AESString = String;
      AESChar   = Char;
    

    如果使用非Unicode版本的Delphi编译,则库将自动恢复为ANSI字符串(“字符串”== ANSIString pre-D2009 ),所以如果你需要支持Unicode和非Unicode版本的Delphi,你的Unicode更改将需要考虑到这一点。你需要小心,但这并不困难。