27

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

我在 Google 上搜索了 PGP,发现它的隐私非常好,我还发现 OpenPGP http://www.openpgp.org/和 GnuPG http://www.gnupg.org/这两种 PGP 是什么?我应该使用哪一个?

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

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

4

2 回答 2

49

问题一:关于PGP

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

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

问题 2:在 PHP 中使用 GnuPG

使用GnuPG 接口,这是一个可以为 PHP 安装的扩展。

首先,导入密钥,$keydataASCII 铠装公钥在哪里:

<?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(). 确保DEADBEEFDEADBEEF在引用密钥时至少使用长密钥 ID(例如 )、更好的指纹(如示例中);并且永远不要使用短密钥 ID ( DEADBEEF),因为它们很容易受到碰撞攻击


这是用户在 PHP 手册中添加的更全面的示例。

于 2013-04-12T12:10:31.507 回答
4

在这里留下一个答案,因为网络上的许多 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 版本。

于 2019-04-19T00:00:18.073 回答