【问题标题】:php-gpg (github repository) encrypts PGP message with 1 subkey fine, but not 2 subkeys?php-gpg(github存储库)用1个子密钥加密PGP消息,但不是2个子密钥?
【发布时间】:2014-02-26 00:06:15
【问题描述】:

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

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

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

但如果我删除我的一个子键并且只使用一个,它就可以工作。如何让它与 2 个子键一起使用?

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

gpg 警告消息没有完整性保护

有没有人使用过这个库以及如何解决这些问题? 不幸的是,作者不是一个喜欢回答有关他自己作品的问题的人。

【问题讨论】:

    标签: php gnupg


    【解决方案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 的密钥,但是当我这样做时,我会尝试将更改提交到官方存储库。

    附:不知道原作者,不过维护者好像在the php-pgp issues page回答问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 2012-05-06
      • 2016-06-25
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2016-05-29
      相关资源
      最近更新 更多