我在这里留下一个答案,因为网络上PHP GnuPG的许多示例都非常基础,希望这能为某些人节省一些沮丧。
基本上,它反映了GnuPG命令行工具的工作方式。如果密钥尚未在gpg的密钥环中,则需要导入密钥,然后需要选择用于加密/解密的接收者密钥。
gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
如果您像我一样将密钥作为收件人传递,那么它不起作用!在
GPG手册或
PHP文档中都不清楚这个字段是什么,它被称为“指纹”。请检查gpg的密钥环,查看您刚导入的密钥。
gpg --list-keys
这将输出类似于以下内容:
pub rsa2048 2019-04-14 [SC] [expires: 2021-04-14]
0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA
uid [ultimate] Dean Or
sub rsa2048 2019-04-14 [E] [expires: 2021-04-14]
这将提供给您每个密钥的UID和指纹。据我所知,您可以使用UID和指纹作为接收者。
因此,您的PHP加密代码可能如下所示:
// Encrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient public key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-public-key.asc');
}
$gpg->addencryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
echo $gpg->encrypt('This is a test!');
然后收件人的代码将如下所示:
// Decrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient private key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-private-key.asc');
}
$gpg->adddecryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA', '');
echo $gpg->decrypt($encyptedMessage);
请注意,接收者的公钥和私钥的指纹是相同的。
adddecryptkey 存在一个已知问题,无法输入密码!您需要删除密码或更改您的 GnuPG 版本。
gpg -fingerprint {user_id}
获取用户的指纹。 - MatthewFALSE
),但空字符串永远不应发生。 - Jens Erat