【问题标题】:string encoding error from delphi 7 to xe从delphi 7到xe的字符串编码错误
【发布时间】:2013-10-30 14:50:30
【问题描述】:

我在互联网上找到了一些 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

我认为问题在于字符串的编码。

这个问题能解决吗?

【问题讨论】:

  • 您必须使用支持 UNICODE 的加密库,例如 Delphi Encryption Compendium (DEC)
  • 没有字符串这样的类型,它是一些真实类型的快捷方式。在 Delphi 7 中,字符串指向 AnsiString,在 Delphi XE2 中,它是 UnicodeString 的快捷方式(在 Delphi 1 中,它是 ShortString 的快捷方式)。 char 和 PChar(分别为 AnsiChar 或 WideChar)也是如此。通过用选择和固定的真实类型替换 char/PChar/string 小丑(在不同的 Delphi 版本中不同)来修复您的代码和库代码。
  • 您需要阅读文档并了解您的编译器。自 Delphi 2009 起,Char 别名为 WideChar,为 16 位类型。
  • 您还可以从 Spring For Delphi spring4d 或 Lockbox lockbox-3 库中获取现成和维护的 AES 实现。然而,任何加密都适用于二进制数据,并且您会为任何 Delphi 版本选择一些相同的真实数据表示 - 但至少这个选择不会对您隐藏,并且您会知道自己在做什么。
  • 该存储库中的好路径,dontuseit :-)

标签: string delphi encryption aes delphi-xe


【解决方案1】:

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

您有 4 个选项:

  1. 联系库作者并询问是否有 Unicode 版本 计划/可用

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

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

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

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

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

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

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

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

然后,您需要检查 AES 库代码,将所有对“String”的引用替换为“AESString”、“Char”与“AESChar”和“PChar”与“PAESChar”。

这应该使 AES 成为一个 ANSI 字符串库,并且如果这对您很重要,它仍然可以在 Delphi 7(即 Delphi 2009 之前)中使用。

如果您以后发现确实需要完全支持 Unicode 字符串,然后需要正确修复 AES 库代码本身,您可以这样做,然后只需更改 AESString 和 AESChar 类型:

type
  AESString = String;
  AESChar   = Char;

如果随后使用非 Unicode 版本的 Delphi 编译,该库将自动恢复为 ANSI String ("String" == ANSIString pre-D2009 ),因此如果您需要同时支持 Unicode 和非 Unicode 版本的 Delphi,您的 Unicode 更改将需要考虑到这一点。您确实需要小心,但这并不难。

【讨论】:

  • 是的,在 delphi 7 中替换所有引用后继续工作,但现在使用较新的 delphi 版本所有转换仍然出错
  • 我使用 Delphi 2006(ANSI 字符串,如 Delphi 7)和 Delphi 2010(Unicode 字符串)对此进行了测试。在进行建议的更改后,无论是在 Delphi 2006 和 2010 中传递 ANSIString、String 还是 WideString 变量(将自动转换为 ANSIString 以供 AES 代码处理),我都能从 EncryptString() 获得一致的结果。如果你得到不同的结果那么您可能还没有更改所有对 AESString、AESChar 和 AESPChar 的 String、Char 和 PChar 引用。 fyi:我发现没有“Char”引用,但是有 String 和 PChar。
  • 您可能对我的博客文章感兴趣,我在其中描述了使用测试用例来验证和验证对 AES 库所做的更改,以使其成为严格的 ANSI 库。 deltics.co.nz/blog/posts/2006
猜你喜欢
  • 2023-03-18
  • 2011-12-14
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多