首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在PHP中使用PGP加密文件?

在PHP中使用PGP加密文件?
EN

Stack Overflow用户
提问于 2013-04-12 19:04:42
回答 2查看 43.4K关注 0票数 27

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

我在谷歌上搜索了一下PGP,发现它的隐私性很好,我还发现了OpenPGP http://www.openpgp.org/和GnuPG http://www.gnupg.org/这两种类型的PGP是什么?我应该用哪一个呢?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-12 20:10:32

问题1:关于PGP

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

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

问题2:在PHP中使用GnuPG

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

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

代码语言:javascript
复制
<?php
$gpg = new gnupg();
$info = $gpg -> import($keydata);
print_r($info);
?>

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

代码语言:javascript
复制
<?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

票数 49
EN

Stack Overflow用户

发布于 2019-04-19 08:00:18

我在这里给出一个答案,因为网上很多PHP GnuPG的例子都是非常简单的,希望这能让一些人省去一些挫败感。

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

代码语言:javascript
复制
gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt

如果你做了我做的事情,并以接收者的身份传递了密钥,它就不起作用了!

目前还不清楚这个字段在GPG manualPHP documentation中是什么,后者将这个字段称为“指纹”。使用以下命令检查gpg的钥匙环,查找新导入的密钥:

代码语言:javascript
复制
gpg --list-keys

这将输出如下所示:

代码语言:javascript
复制
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代码可能如下所示:

代码语言:javascript
复制
// 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!');

然后,收件人的代码将如下所示:

代码语言:javascript
复制
// 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版本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15969740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档