如何使用 OpenSSL 验证 GPG 签名

Jer*_*oen 4 ssl gnupg openpgp public-key-encryption gpgme

我编写了一个简单的跨平台实用程序来使用gpgme验证 GPG 签名。然而,gpgme 在 Windows 和其他平台(例如 osx)上工作得不太好,它需要安装 GnuPG 命令行实用程序,这是一个相当重的依赖项。我还研究了其他 openpgp 库,例如netgpg,但它们的可移植性更差(它确实必须使用 mingw-w64 构建)。

是否可以实现一个独立的工具来仅使用 openssl 和 zlib 等标准库来验证 GPG 签名?据我了解,openpgp 由标准密码和哈希函数组成。是什么让这件事变得如此困难以至于没有好的 C 库来做到这一点?

Jen*_*rat 5

OpenSSL 不实现 OpenPGP 格式并且不兼容。使用 OpenPGP 实现,例如 GnuPG、Bouncycastle(适用于 Java/C# 的框架)或其他(适用于 JavaScript 的 OpenPGP.js,并且有一个 Go 库)。

虽然 OpenPGP 使用标准的加密摘要和加密算法,但它具有不同的消息格式,特别是使用自己的CFB 模式变体。您必须实现 OpenPGP 消息格式的解析器并与 OpenPGP CFB 模式兼容(如果您想支持加密),最后将结果传递给 OpenSSL 进行实际加密。

最后,支持整个信任网络概念(包括完整的 OpenPGP 规范)是一项广泛的任务,并且需要考虑各种问题([1][2]、...)。在 Unix 世界中,人们似乎对 GnuPG 和 GPGME 感到足够满意,它们甚至针对非常高级的安全问题(例如,这种侧通道攻击)都经过了深入的测试和分析。新的实现很可能容易受到 GnuPG 已经解决的类似问题的影响。