如何使用OpenSSL验证GPG签名

4
我编写了一个简单的跨平台工具,使用gpgme验证GPG签名。然而,gpgme在Windows上表现不佳,在其他平台(例如OSX)上需要安装GnuPG命令行实用程序,这是一个相当沉重的依赖项。我也研究了其他openpgp库,如netgpg,但这些库甚至更不易移植(它必须使用mingw-w64构建)。
是否可能实现一个独立的工具,仅使用像openssl和zlib这样的标准库来验证GPG签名?据我所知,openpgp由标准密码和哈希函数组成。是什么让这个过程变得如此困难,以至于没有好的C库可以完成这项任务?
1个回答

5

OpenSSL不支持OpenPGP格式,因此不兼容。请使用像GnuPG、Bouncycastle(适用于Java/C#的框架)或其他实现OpenPGP的工具(例如JavaScript中的OpenPGP.js和Go库)。

虽然OpenPGP使用标准的加密算法和摘要算法,但它有不同的消息格式,尤其是使用自己的CFB模式变体。如果您想支持加密,则需要同时实现OpenPGP消息格式的解析器并与OpenPGP CFB模式兼容,并最终将结果传递给OpenSSL进行实际的加密操作。

最后,支持整个信任网络概念,包括完整的OpenPGP规范是一个广泛的任务,需要考虑各种问题([1], [2], ...)。在Unix世界中,人们似乎对GnuPG和GPGME感到满意,这些软件已经经过深入测试和分析,即使是非常高级的安全问题也能得到解决(例如,这种侧信道攻击)。新的实现很可能会面临类似于GnuPG已经解决的问题的漏洞。


谢谢,这很有帮助。我本来希望问题不会太复杂,因为我只需要签名验证,不需要加密。 - Jeroen Ooms
这可能确实大大减少了工作量,但你仍然需要实现消息格式。也许 gpgv 已经实现了你正在寻找的功能。 - Jens Erat
基本解析应该不难,只需要一些正则表达式的魔法... gpgverify 只能作为可执行文件使用,对吗?我需要绑定... 或者有一个我不知道的 libgpgv 吗? - Jeroen Ooms
由于OpenPGP是二进制协议(ASCII编码只是一种编码方式),我不会使用正则表达式。您还可以查看pgpdump,它是一个OpenPGP解析器(和“漂亮的打印机”),我认为它是用C编写的。 - Jens Erat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接