问题描述
我有一个客户,希望使用PGP签名和加密的数据。当我使用Java代码(使用bouncycastle openpgp)时,它可以解密并验证他端(客户端是Java)上发送的数据。
问题是我的软件在PHP中,我想使用GnuPG签名和加密数据,如果我使用GnuPG,则我的客户端无法解密数据。
如果我只是用PHP加密数据,则Java可以毫无问题地解密。问题是当我用PHP签名数据时,Java无法解密和验证。
我什至尝试了Crypt_GPG,那里也有完全相同的问题。
解决方法
经过深入调查,发现了有趣的事实。
原来,我使用的私钥是罪魁祸首。我从某个地方获得的密钥显然是在https://pgpkeygen.com/在线生成的(从不使用在生产环境中在线生成的密钥)
该密钥包含一个主RSA密钥和两个子密钥(我不确定为什么PGP允许子密钥以及在何处有用)
无论如何,问题在于Java在对数据进行签名时使用了主键。但是PHP使用了其中一个子密钥,因此Java客户端的解密逻辑试图验证签名是否使用主密钥,因此无法成功进行验证。
我使用命令行gpg工具编辑私钥,并删除了其他子密钥,然后PHP代码使用了主键,因为那是该私钥中唯一可用的密钥,并且一切正常。