在PHP中使用PGP加密文件?

问题描述 投票:20回答:2

我想使用PGP加密来加密CSV文件,我通过PHP脚本生成,然后通过电子邮件将该文件发送到客户端。客户端会给我加密密钥,我需要将其用于加密文件。

我用Google搜索了PGP并发现它是相当好的隐私,我也找到了OpenPGP http://www.openpgp.org/和GnuPG http://www.gnupg.org/这两种类型的PGP是什么?我应该使用哪一个?

如何使用PHP中的PGP使用我的客户端将提供的密钥加密文件?

我第一次听到这个术语,任何人都可以帮助理解这一点并在PHP中实现它。

php pgp gnupg openpgp
2个回答
41
投票

Question 1: About PGP

  • PGP(Pretty Good Privacy)是赛门铁克公司的产品和商标(几年前他们购买了它)。
  • OpenPGP是PGP使用的标准。
  • GnuPG(Gnu Privacy Guard)是PGP的免费开源实现。

所以你想要做的是加密到OpenPGP密钥。您的客户端用于解密数据的OpenPGP的哪种实现对您来说并不重要。使用PHP,通常使用GnuPG并且内置接口。

Question 2: Using GnuPG in PHP

使用GnuPG interface,这是可以为PHP安装的扩展。

首先,导入密钥,其中$keydata是ASCII装甲公钥:

<?php
$gpg = new gnupg();
$info = $gpg -> import($keydata);
print_r($info);
?>

然后使用此密钥加密数据,这次使用客户端密钥的指纹:

<?php
  $gpg = new gnupg();
  $gpg -> addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
  $enc = $gpg -> encrypt("just a test");
  echo $enc;
?>

如果要加密文件,请阅读并将其传递给encrypt()。在引用键时,务必使用至少长键ID(例如DEADBEEFDEADBEEF),更好的指纹(如示例中所示);和never use short key IDs (DEADBEEF), as those are vulnerable to collision attacks


这是用户在PHP手册中添加的更多comprehensive example for doing both


0
投票

在这里留下一个答案,因为PHP GnuPG的网络上有很多例子都是非常简单的,希望这可以节省一些人的挫败感。

基本上,它反映了GnuPG命令行工具的工作方式。如果密钥不在gpg的密钥环中,则需要导入密钥,然后您需要选择用于加密/解密的收件人密钥。

gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt

如果你做了我做了什么,并作为收件人传递密钥,它不起作用!

目前尚不清楚这个领域在GPG manualPHP documentation中是什么,它将这个领域称为“指纹”。检查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版本。

© www.soinside.com 2019 - 2024. All rights reserved.