微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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代码使用了主键,因为那是该私钥中唯一可用的密钥,并且一切正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?