2

我目前正在将一个项目(使用加密)从 Delphi 6 转换为 XE。该项目使用旧的 Delphi Encryption Compendium,它在 XE 中不起作用。所以我想我会从那个组件集换成 LockBox。LockBox 有两个版本 - 2 和 3。我在 Delphi 6 中使用 LockBox2 没有问题。我虽然会在 XE 中使用 LockBox3,但我遇到的问题是我在使用时无法获得相同的结果ExFile 演示程序(来自 LockBox2)。

在那个演示中,我选择了 Blowfish 算法,将密码设置为不带引号的“testkey”,程序将加密文件。

在 Delphi XE 中,我掉到了表单上

Codec1: TCodec;
CryptographicLibrary1: TCryptographicLibrary;

并将 Codec1 链接到 CryptographicLibrary1 并单击按钮时执行以下代码(在 LockBox3 站点上找到用于解密字符串的类似代码)....

  codec1.StreamCipherId := BlockCipher_ProgId;
  codec1.BlockCipherId := Blowfish_ProgId;
  codec1.ChainModeId := ECB_ProgId;
  codec1.Password := 'testkey';
  codec1.encryptFile('d:\tools\mingw\bin\md5.exe', 
   'd:\tools\mingw\bin\md5_xe_2.exe');

但最终结果是输出文件的大小与 LockBox2 ExFile 演示中的大小不同。

所以我的问题是......

  1. 我在上面的 XE 代码中做错了什么,以至于我从 LockBox2 给 ExFile 演示提供了不同的结果?

  2. 我应该只在 XE 中使用 LockBox2 吗?

  3. 与 2 相关,是否有人在看守代码 LockBox2(用于 XE)?

任何帮助将不胜感激。

问候,

4

1 回答 1

3
  1. 用户“mj2008”一针见血。Delphi 6 使用 ansistring 作为字符串。Delphi XE 使用 UTF-16LE。相同的密码,在屏幕上呈现或从键盘输入,是完全不同的数据,因此结果自然会不同。

关于预期的文件大小。Blowfish 是一个 8 字节(64 位)的块模式密码。尽管对于其他链接模式会有所不同,但 ECB 使用块填充来填充最后一个块。TPLB3 对 ECB 使用 RFC1321 填充方案,也就是说,它用一个 80 美元的字节填充消息,后面跟着足够的零来获得整个块的大小。TPLB2 使用不同的方案:它用零填充直到最后一个字节,它设置为包块中预填充的字节数。

因此,如果您的明文文件大小为 X 字节,并且使用 Blowfish/ECB 加密,则密文大小 Y 应为:

Y = X + 8 - (X mod 8)

(有关更多详细信息,请参阅论坛主题: http: //lockbox.seanbdurkin.id.au/tiki-view_forum_thread.php ?comments_parentId=154&topics_offset=2&topics_sort_mode=lastPost_desc&forumId=2 )

*2。需要注意的是,我对您的程序的目的和上下文一无所知,并且特定情况可能会影响这个问题,我想说为您的 Delphi XE 程序使用 TurboPower LockBox 3。如果您需要与旧的LB2密文互操作,那么编写并执行一次,将LB2密文转换为LB3密文的转换程序。然后丢弃LB2。

*3。我继续维护 LB2,但我只会修复 LB2 中报告的主要缺陷,我不会修复 LB2 中的 RSA 组件。

于 2011-09-24T06:35:08.100 回答