支持 IDEA 的 GnuPG

GnuPG with IDEA support

我正在尝试 "integrate" 我当前的系统支持 IDEA 密码,该系统使用 GnuPG 命令行界面 encrypting/decrypting 在我的公司和我们的合作伙伴之间发送的数据文件。我已经阅读了所有可以在网上找到的有关设置此设置的各种方法的说明,但我仍然无法正确加载 IDEA 密码。

首先,我的配置:我使用的是 Windows 7(64 位)专业版和 GnuPG 2.0.17。 --version列表如下:

gpg (GnuPG) 2.0.17 (Gpg4win 2.1.0)
libgcrypt 1.4.6
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:/Users/<username>/AppData/Roaming/gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
        CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

命令行可执行文件实际上位于网络共享上 (\<SERVERNAME>\<ShareName>\GnuPG\gpg.exe),它通常可以完美地满足我 encrypt/decrypt EXCEPT 当我 运行 进入使用 IDEA 密码加密的文件时。我在尝试时收到以下消息:

gpg: cipher algorithm 1 (IDEA) is unknown or disabled
gpg: encrypted with 2048-bit ELG key, ID C4186BB7, created 2003-05-14
      "<keyname@domain.com>"
gpg: public key decryption failed: Invalid cipher algorithm
gpg: decryption failed: No secret key

所以,我开始谷歌搜索我能找到的一切。我已经下载了 idea.dll 库(在挖掘各种试图找到它的垃圾之后)并按照说明将其放在 \<SERVERNAME>\<ShareName>\GnuPG\lib 目录中。

我能找到的大部分资源都在谈论将行 load-extension lib\idea 添加到位于 [=18 的 gpg.conf 文件中=]。这不起作用,因为我仍然得到与 --version 命令相同的结果(支持的算法中没有列出 IDEA 密码)。我也尝试过明确使用库的完整路径,而不仅仅是像这样的 "shortcut":load-extension "\<SERVERNAME>\<ShareName>\GnuPG\lib\idea.dll",但没有运气。

另一个建议是将 load-extension 开关添加到实际的命令行中,如下所示:

\<SERVERNAME>\<ShareName>\GnuPG\gpg.exe --load-extension idea

我也尝试了这个选项的多种变体,包括使用完整文件名、完整路径和文件名等,但我仍然无法加载 IDEA 密码。我尝试将 idea.dll 放入 GnuPG 主目录(C:/Users/<username>/AppData/Roaming/gnupg)并尝试加载 GnuPG使用上面列出的所有相同建议从该位置获取它。

我的 idea.dll 文件在属性对话框中没有列出任何版本信息,但它的修改日期列为 2002 年 9 月 20 日。任何建议关于我在这里可能忽略的事情?

编辑 1: 我最终想放弃通过命令行执行 encryption/decryption 并迁移我的应用程序以使用 BouncyCastle API,因为我相信 IDEA 密码是 "built-in" 那边。不幸的是,我也无法正常工作(请参阅我的SO question on the problems I'm facing with BouncyCastle)。

编辑 2: 另一件需要注意的事情是,我上面所做的所有测试都是来自基本的(提升的)命令提示符 - 完全超出了我的实际应用程序 - 这样我就可以消除它作为问题的潜在原因。

所以,我一直在四处寻找,甚至在 Spiceworks 社区网站上交叉发布了我的问题。我发现的一件事——但基本上忽略了,因为我当时没有看到相关性——是 thread in the GnuPG mailing list。然而,Spiceworks 上的一位其他用户再次向我指出了它,所以我又读了一遍。我基本上是在重新发布我在该网站上发布的内容,作为其他可能 运行 关注此问题的人的参考。

Werner Koch 在该邮件列表中的消息中是这样说的:

Nope. GnuPG-2 does not support loading of extensions. the option is a dummy option. The reason for this is that crypto operations are done by Libgcrypt and not by gpg.exe.

The next version of Libgcrypt will support IDEA and thus GnuPG 2.1 will be able to decrypt old (i.e. PGP 2) files, directly. However, using IDEA is not a good idea, we have far better algorithms for ages.

...提问者的回答是:

When I have to make use of "idea.dll" so that I can decrypt messages that were encrypted with it, I then use Gpg 1.4.x, and I have it in an altogether separate folder from the real installation of Gpg 2.0.x. I could not agree with you more in regard to its comparatively inferior algorithms, but that does not preclude my needing it from time to time.

Is there any reason I should not place it in the same folder as the gpg.exe version 1.4.x and then make reference to it there? Thanks.

根据这些评论,我认为,由于我使用的是 GnuPG v2.0.17,也许我需要尝试找到旧版本的 GnuPG(来自 1.4.x 系列)我可以采用。我找到并下载了 1.4.20 的源代码,下载 MnGW/MSYS 并尝试编译它。不幸的是,我在编译时遇到了问题,并且在这个过程中不断出现错误。

然后,我刚好在查看 Windows Explorer window 来检查我正在使用的一些文件的路径,我注意到另一个目录包含 gpg.exe 文件。我启动命令提示符并尝试 运行 对其进行 --version 检查,我得到了这个:

gpg (GnuPG) 1.4.9
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:/Users/<username>/AppData/Roaming/gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
**gpg: LoadLibrary failed: The system cannot find the file specified.

gpg: invalid module `c:\lib\gnupg\lib/idea': The specified module could not be
 found.**

Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

HOLY CRAP! 版本是 1.4.9,这次它真的出现了至少 正在尝试 加载 IDEA 库!

所以,我再次尝试,但这次我使用了 --load-extension 开关:

C:\gnu\gnupg\gpg --load-extension C:\GnuPG\lib\idea.dll --version
gpg (GnuPG) 1.4.9
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:/Users/<username>/AppData/Roaming/gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
Cipher: **IDEA**, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

又是废话! 这次是 IDEA 密码!

所以,真实 测试来了——我尝试在命令行中使用这个较旧的可执行文件来解密文件:

C:\GNU\GnuPG\gpg.exe --load-extension C:\GnuPG\lib\idea.dll --batch --passphrase <password> --output "C:\Testing\decrypted.txt" --decrypt "C:\Testing\encrypted.pgp"

现在执行此操作会得到以下输出:

gpg: WARNING: cipher algorithm IDEA not found in recipient preferences
gpg: encrypted with 2048-bit ELG-E key, ID C4186BB7, created 2003-05-14
      "<keyname@domain.com>"

我看了,果然,解密的文件就在那里! 尽管我收到了关于 IDEA 密码算法的警告,还是正常解密文件,完全按照预期输出!

我想这里的答案是您根本不能使用 GnuPG v2.0.x 来解密使用 IDEA 密码加密的文件。似乎您必须退回到以前版本的 GnuPG 才能加载库。谢谢你的帮助。我想我现在终于可以组合出一个有效的命令行解决方案了。也许有一天我真的会完成 BouncyCastle API 实现的工作,但现在我只是很高兴让它工作。 (跳着我快乐的舞)

编辑: 所以,对于我的“最终”(但绝对不是完美的)解决方案,我的应用程序试图通过 2.0 版本解密文件,然后,如果失败(解密文件不存在),请尝试使用加载了 IDEA 密码的 1.4 版本进行解密。到目前为止,通过我的所有测试,这似乎完全符合预期,并且我的 IDEA 加密文件正在正常解密。我可能应该构建一些实际从命令行读取标准输出的东西,以确定是否使用 1.4 再次尝试,但这看起来对我的目的有用,直到我弄清楚 BouncyCastle。