我试图让php-gpg库起作用; https://github.com/jasonhinkle/php-gpg
如果我尝试使用具有2个子密钥的PGP公钥加密消息,则会出现以下两个错误。
gpg:公钥解密失败:错误的密钥使用了gpg: 解密失败:密钥不可用
但是如果我删除了一个子键并且只使用了一个,它就可以了。如何使用2个子键?
此外,一旦我解密使用具有1个子密钥的PGP公钥加密的消息,我就会收到以下错误。
gpg警告消息未受到完整性保护
是否有人有使用此库的经验以及如何解决这些问题? 不幸的是,作者并不喜欢回答有关自己作品的问题。
答案 0 :(得分:1)
我认为Public_Key.php
中存在一个错误导致某些指纹计算错误。
您可能正在使用属于a revision from 2014-02-04的文件版本。该版本包含一项更改,旨在解决使用新数据包格式(在RFC4880 section 4.2中定义)的密钥计算公钥指纹的问题。
我为类似的问题调试了这段代码,并发现当前的修复程序引入了一个假设,即公钥只包含一个密钥(而且没有子密钥)。使用包含一些子键的公钥文件,将返回最后一个子键,但具有主键的指纹。这会导致公钥不正确,因此无法解密使用此损坏密钥加密的所有数据。
我相信这个版本的快速修复是:
1)取消注释第143行 - 使库为所有子键计算正确的指纹
2)更改第90行:
if ($len > 191 && $len < 224) $len = (($len - 192) << 8) + ord($sa[$i++]);
为:
if ($len > 191 && $len < 224) $len = (($len - 192) << 8) + ord($sa[$i++]) + 192;
3)(可选)注释#134-140行,因为它们将不再对结果产生任何影响。
我还没有测试它如何影响ElGamal的密钥,但是当我这样做时,我会尝试将更改提交到官方存储库。
P.S。我不知道原作者,但维护者似乎回答了the php-pgp issues page上的问题。