php-gpg(github repository)用1个子键加密PGP消息,但不是2个子键?

时间:2014-02-26 00:06:15

标签: php gnupg

我试图让php-gpg库起作用; https://github.com/jasonhinkle/php-gpg

如果我尝试使用具有2个子密钥的PGP公钥加密消息,则会出现以下两个错误。

  

gpg:公钥解密失败:错误的密钥使用了gpg:   解密失败:密钥不可用

但是如果我删除了一个子键并且只使用了一个,它就可以了。如何使用2个子键?

此外,一旦我解密使用具有1个子密钥的PGP公钥加密的消息,我就会收到以下错误。

  

gpg警告消息未受到完整性保护

是否有人有使用此库的经验以及如何解决这些问题? 不幸的是,作者并不喜欢回答有关自己作品的问题。

1 个答案:

答案 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;

根据RFC4880 section 4.2.2.2

3)(可选)注释#134-140行,因为它们将不再对结果产生任何影响。

我还没有测试它如何影响ElGamal的密钥,但是当我这样做时,我会尝试将更改提交到官方存储库。

P.S。我不知道原作者,但维护者似乎回答了the php-pgp issues page上的问题。