我在互联网上发现了一些隐藏字符串的来源,我在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
我认为问题在于字符串的加入。
有可能解决这个问题吗?
答案 0 :(得分:3)
您提供链接的AES库尚未更新,以支持以后版本的Delphi(Delphi 2009以后版本)中的“ String ”现在是 UnicodeString 每个角色都是 WideChar 。
您有4个选项:
请与图书馆作者联系,询问是否有Unicode版本 计划/可用
尝试修改库以自己支持Unicode(或查找 能够/将帮助做到这一点的人
查找已支持Unicode的替代加密库
确保您只对文件库使用ANSI字符串。
最后一个选项对您来说可能不可行,但如果是,那么您仍然需要修改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更改将需要考虑到这一点。你需要小心,但这并不困难。