PGP / GPG PHP加密签名使用GnuPG和Java解密验证使用Bouncy Castle

问题描述

我有一个客户,希望使用PGP签名和加密的数据。当我使用Java代码(使用bouncycastle openpgp)时,它可以解密并验证他端(客户端是Java)上发送的数据。

问题是我的软件在PHP中,我想使用GnuPG签名和加密数据,如果我使用GnuPG,则我的客户端无法解密数据。

如果我只是用PHP加密数据,则Java可以毫无问题地解密。问题是当我用PHP签名数据时,Java无法解密和验证。

PHP和Java之间的签名是否存在已知问题?

我什至尝试了Crypt_GPG,那里也有完全相同的问题。

解决方法

经过深入调查,发现了有趣的事实。

原来,我使用的私钥是罪魁祸首。我从某个地方获得的密钥显然是在https://pgpkeygen.com/在线生成的(从不使用在生产环境中在线生成的密钥)

该密钥包含一个主RSA密钥和两个子密钥(我不确定为什么PGP允许子密钥以及在何处有用)

无论如何,问题在于Java在对数据进行签名时使用了主键。但是PHP使用了其中一个子密钥,因此Java客户端的解密逻辑试图验证签名是否使用主密钥,因此无法成功进行验证。

我使用命令行gpg工具编辑私钥,并删除了其他子密钥,然后PHP代码使用了主键,因为那是该私钥中唯一可用的密钥,并且一切正常。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...