1

我在互联网上找到了一些 crypt 字符串的来源,我看到在 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

我认为问题在于字符串的结尾。

有可能解决这个问题吗?

4

1 回答 1

3

您提供链接的 AES 库尚未更新以支持以下事实:“ String ”在 Delphi 的更高版本(Delphi 2009 及更高版本)中现在是UnicodeString,其中每个字符都是WideChar

您有 4 个选项:

  1. 联系图书馆作者并询问是否计划/提供 Unicode 版本

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

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

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

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

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

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

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

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

You will then need to go through the AES library code replacing any reference to "String" with "AESString", "Char" with "AESChar" and "PChar" with "PAESChar".

This should then make AES an ANSI String library and it will still be usable in Delphi 7 (i.e. pre-Delphi 2009) if that's important for you.

If you then find in the future that you do need to fully support Unicode strings and then need to properly fix the AES library code itself, you can do this and then simply change the AESString and AESChar types to:

type
  AESString = String;
  AESChar   = Char;

If this is then compiled with a non-Unicode version of Delphi, the library will automatically revert back to ANSI String ("String" == ANSIString pre-D2009), so your Unicode changes will need to take this into account if you need to support both Unicode and non-Unicode versions of Delphi. You do need to be careful, but this is not difficult.

于 2013-10-30T20:07:08.250 回答