-->

使用PGP加密的文件在PHP?(Encrypt files using PGP in PHP?)

2019-08-22 06:41发布

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

我Google关于PGP,发现它是非常好的隐私,我也发现OpenPGP的http://www.openpgp.org/和GnuPG的http://www.gnupg.org/什么是这两种类型的PGP的? 我应该使用哪一个?

还如何加密使用PGP PHP中的关键,我的客户端将提供一个文件?

我听说过这个名词第一次,任何人都可以请理解这一点,并在PHP执行这方面的帮助。

Answer 1:

问题1:关于PGP

  • PGP(良好隐私)是一个产品,赛门铁克公司的注册商标(他们几年前买了它)。
  • OpenPGP的是由PGP使用的标准。
  • 的GnuPG(GNU隐私卫士)是PGP的自由和开源实现。

所以,你想要做的是加密到OpenPGP金钥。 其中的OpenPGP的实现您的客户端使用解密的数据是不是对你很重要。 使用PHP,常用的GnuPG使用并有内置接口。

问题2:在PHP中使用GnuPG

使用GnuPG的接口 ,这是一个可以安装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 ),较好的指纹(如上例)参照键时; 与从不使用短密钥ID( DEADBEEF ),因为这些都容易受到碰撞攻击 。


该是一个比较做既全面例如通过PHP手册用户加入。



Answer 2:

要离开这里的答案为跨网为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版本。



文章来源: Encrypt files using PGP in PHP?