使用PHP如何解密一个对称加密的OpenPGP消息?

6

我有一个以文件形式给我,看起来像这样的 OpenPGP 信息:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.9 (MingW32)

jA0EAgMCtCzaGHIQXY9g0sBnAeDOQ9GuVA/uICuP+7Z2dnjNCLgRN0J/TzJs1qcW
aJYBTkH5KQCClCxjwTYbHZCox1sENfIS+KxpCKJQqAX3SNEFm0ORNE6RNwEgb1Zj
uOdIw8auxUsjmQKFLAcZIPKjBjyJqSQVfmEoteVn1n+pwm8RdIZevCHwLF2URStB
nBVuycaxcaxcaxcxccxcxacqweqweqwe123fsMqQPaTusOBGpEQrWC9jArtvYEUpY
aNF6BfQ0y2CYrZrmzRoQnmtnVu10PagEuWmVxCucyhVwlthVgN0iBog9jhjliQkc
rrDTupqB4IimMEjElGUHtkuvrCQ0jQnOHEAJmmefMDH0NkYKGd5Ngt21I5ge5tob
/uBjHKMxjNgg1nWfg6Lz4jqoKe/EweuEeg==
=+N9N
-----END PGP MESSAGE-----

我猜他们给了一个15个字符的密语来解密文件。但我真的不知道如何使用PHP来解密它。我查看了PHP的GnuPG手册页面,在gnugpg_decrypt()示例下,它给出了以下代码:

$res = gnupg_init();
gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC","test");
$plain = gnupg_decrypt($res,$encrypted_text);
echo $plain;

所以看一下这个函数 gnupg_adddecryptkey,它提到我需要指纹。那是什么?在哪里可以找到它?

2个回答

11

指纹是在公钥和一些元数据(如密钥创建时间)上计算的哈希值。当通过gnupg_import导入密钥后,它也会作为fingerprint属性返回。

这是用于公共/私有密钥加密,但您似乎没有使用:当使用口令进行加密时,您省略了公共/私有密钥加密部分,直接使用从口令派生的会话密钥(有时也称为密码块或对称密钥)对消息进行对称加密。

PHP的GnuPG模块不支持对称加密。没有函数可以执行对称解密,并且这种限制也在模块源代码文档中描述:

此类提供了面向对象的 GNU Privacy Guard (GPG) 接口。

虽然 GPG 可以支持对称密钥加密,但该类仅旨在促进公钥加密。

您需要通过调用gpg手动执行解密。一个示例命令行如下:

gpg --symmetric --decrypt [file]

你也可以通过STDIN提供输入,或者使用GnuPG的--passphrase...选项来提供密码:

--passphrase-fd n

从文件描述符n中读取密码。只有第一行将从文件描述符n中读取。如果将n设置为0,则会从STDIN中读取密码。这仅适用于只提供一个密码的情况。

--passphrase-file file

从文件file中读取密码。只有第一行将从文件file中读取。这仅适用于只提供一个密码的情况。显然,如果其他用户可以读取此文件,则存储在文件中的密码安全性值得怀疑。如果可以避免,请勿使用此选项。

--passphrase string

使用字符串作为密码。这仅适用于只提供一个密码的情况。显然,在多用户系统上使用此选项的安全性非常值得怀疑。如果可以避免,请勿使用此选项。

请注意,计算机上的所有其他用户都可以读取所有其他用户的命令行参数,因此尤其对于共享托管平台,--passphrase绝对是不可取的。


非常有启发性。今天学到了新东西。谢谢! - imin
24
当我使用--symmetric和--decrypt时,出现了"gpg: conflicting commands"的提示。今天对我来说只需要后者。我的文件肯定是使用--symmetric加密的。我原以为是我的袜子引起的问题,但也许这个问题源自我的老旧gpg 1.4.18版本。 - Martin Dorey
13
--symmetric 不是 --encrypt--decrypt 的选项,而是用于进行对称加密的命令。消息包含加密元数据的对称信息,因此只需要使用简单的 --decrypt 命令即可解密。 - Jens Erat

6

这个答案不仅适用于PHP,而且适用于GnuGPG。为了总结Jens Erat的回答并为其他遇到这个问题的人添加加密步骤,以下是一个解决方案,假设存在一个名为passwords.txt的文件:

// encrypt
gpg --output passwords.gpg --symmetric passwords.txt
// decrypt
gpg —decrypt  passwords.gpg

没试过针对文件,但对于目录不起作用。第一条命令会出现“无法打开'<directory-name>'”的错误信息,而第二条命令则会出现“冲突指令”的错误信息。 - Ash
好知道。适用于文件。随意建议一个适用于两者的扩展名! - skeller88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接