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

imi*_*min 4 php encryption gnupg openpgp

我有一个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-----
Run Code Online (Sandbox Code Playgroud)

我想,并给了一个15个字符的密码来解密它.但我真的不知道用PHP解密文件.我看一下PHP的GnuPG手册页 ,在gnugpg_decrypt()示例下它给出了这段代码:

$res = gnupg_init();
gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC","test");
$plain = gnupg_decrypt($res,$encrypted_text);
echo $plain;
Run Code Online (Sandbox Code Playgroud)

所以看看这个功能gnupg_adddecryptkey,它提到我需要一个指纹.实际上是什么?我在哪里可以得到它?

Jen*_*rat 10

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

这是用于公钥/私钥加密,您似乎没有使用:当使用密码加密时,您省略了公钥/私钥加密部分,并使用会话密钥直接对邮件使用对称加密(有时也是称为密码块或对称密钥),源自您的密码.

PHP的GnuPG模块不支持对称加密.没有执行对称解密的功能,这个限制也在模块的源文档中描述:

该类为GNU Privacy Guard(GPG)提供面向对象的接口.

尽管GPG可以支持对称密钥加密,但此类仅用于促进公钥加密.

您必须通过调用手动执行解密gpg.一个示例命令行将是

gpg --symmetric --decrypt [file]
Run Code Online (Sandbox Code Playgroud)

(或者,您也可以通过STDIN提供输入).要交出密码,请查看GnuPG的--passphrase...选项:

--passphrase-fd n

从文件描述符n中读取密码.只从文件描述符n中读取第一行.如果对n使用0,则将从STDIN读取密码.仅在仅提供一个密码短语时才能使用此选项.

--passphrase-file file

从文件文件中读取密码.只从文件文件中读取第一行.仅在仅提供一个密码短语时才能使用此选项.显然,如果其他用户可以读取此文件,则存储在文件中的密码短语具有可疑的安全性.如果可以避免,请不要使用此选项.

--passphrase string

使用字符串作为密码.仅在仅提供一个密码短语时才能使用此选项.显然,这在多用户系统上的安全性非常可疑.如果可以避免,请不要使用此选项.

请注意,计算机的所有其他用户都可以读取所有其他用户的命令行参数,因此特别是对于共享主机平台,这--passphrase是一个明确的禁忌.

  • 通过--symmetric和--decrypt时,我得到了'gpg:冲突命令'.对我来说,今天只需要后者.我的文件肯定是用--symmetric加密的.我以为这是我的袜子,但也许这种气味来自我老化的gpg 1.4.18. (8认同)
  • `--symmetric`不是`--encrypt`或`--decrypt`的选项,而是_symmetric encryption_的命令.该消息包含在其元数据中对称加密的信息,因此简单的`--decrypt`就足够了. (7认同)

ske*_*r88 6

这个答案不仅与 PHP 兼容,而且与 GnuGPG 兼容。为了总结 Jens Erat 的回答并为遇到此问题的其他人添加加密步骤,这里有一个解决方案,假设存在一个名为 的文件passwords.txt

// encrypt
gpg --output passwords.gpg --symmetric passwords.txt
// decrypt
gpg —decrypt  passwords.gpg
Run Code Online (Sandbox Code Playgroud)