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

时间:2016-04-04 02:58:31

标签: 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-----
我想,

给了一个15个字符的密码来解密它。但我真的不知道用PHP解密文件。我看一下PHP's GnuPG manual page,并在gnugpg_decrypt()示例下提供了此代码:

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

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

2 个答案:

答案 0 :(得分:8)

The fingerprint is a hash sum calculated on the public key and some meta data like key creation time. It is also returned after importing a key through gnupg_import作为fingerprint属性。

这适用于您似乎未使用的公钥/私钥加密:使用密码加密时,您省略了公钥/私钥加密部分并直接对邮件使用对称加密,使用从密码短语派生的会话密钥(有时也称为密码块或对称密钥)。

PHP的GnuPG模块不支持对称加密。没有执行对称解密的功能,module's source documentation

中也描述了此限制
  

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

     

虽然GPG可以支持对称密钥加密,但此类仅用于促进公钥加密。

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

gpg --symmetric --decrypt [file]

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

  

<强> --passphrase-fd n

     

从文件描述符n中读取密码。只从文件描述符n中读取第一行。如果对n使用0,则将从STDIN读取密码。这个可以    仅在仅提供一个密码短语时使用。

     

<强> --passphrase-file file

     

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

     

<强> --passphrase string

     

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

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

答案 1 :(得分:3)

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

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