在PHP中使用PGP加密文件?

在PHP中使用PGP加密文件?,php,pgp,gnupg,openpgp,Php,Pgp,Gnupg,Openpgp,我想使用PGP加密来加密CSV文件,我通过PHP脚本生成,然后通过电子邮件将该文件发送给客户端。客户端将给我加密密钥,我需要用于加密文件 我在谷歌上搜索了一下PGP,发现它的隐私性非常好,我还发现了OpenPGP和GnuPG这两种PGP是什么?我应该用哪一个 另外,如何使用我的客户端提供的密钥在PHP中使用PGP加密文件 我第一次听到这个词,有谁能帮助我理解这个词并用PHP实现它。问题1:关于PGP PGP(相当好的隐私)是赛门铁克公司的产品和商标(他们几年前购买了它) OpenPGP是PGP

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

我在谷歌上搜索了一下PGP,发现它的隐私性非常好,我还发现了OpenPGP和GnuPG这两种PGP是什么?我应该用哪一个

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

我第一次听到这个词,有谁能帮助我理解这个词并用PHP实现它。

问题1:关于PGP
  • PGP(相当好的隐私)是赛门铁克公司的产品和商标(他们几年前购买了它)
  • OpenPGP是PGP使用的标准
  • GnuPG(Gnu隐私保护)是PGP的免费开源实现
因此,您要做的是加密到OpenPGP密钥。客户端使用哪个OpenPGP实现来解密数据对您来说并不重要。对于PHP,通常使用GnuPG,并且内置了接口

问题2:在PHP中使用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
),更好的指纹(如示例所示);和


用户在PHP手册中添加了更多内容。

问题1:关于PGP
  • PGP(相当好的隐私)是赛门铁克公司的产品和商标(他们几年前购买了它)
  • OpenPGP是PGP使用的标准
  • GnuPG(Gnu隐私保护)是PGP的免费开源实现
因此,您要做的是加密到OpenPGP密钥。客户端使用哪个OpenPGP实现来解密数据对您来说并不重要。对于PHP,通常使用GnuPG,并且内置了接口

问题2:在PHP中使用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
),更好的指纹(如示例所示);和



这是用户在PHP手册中添加的更多内容。

这里将留下一个答案,因为网络上的许多PHP GnuPG示例都是非常简单的,希望这能为用户节省一些挫折

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

gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
如果你做了我做的事情,并以收件人的身份传递密钥,那么它就不起作用了

不清楚该字段在中是什么,也不清楚哪个字段将该字段称为“指纹”。使用以下工具检查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]
// 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);
这将为您提供UID,并在第二行显示与每个密钥相关的指纹据我所知,您可以使用UID和指纹作为收件人。

因此,要加密的PHP代码可能如下所示:

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]
// 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);
然后收件人的代码将如下所示:

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]
// 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的版本。

在这里留下答案,因为网络上的许多PHP GnuPG示例都是非常简单的,希望这能为某些人省去一些挫折

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

gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
如果你做了我做的事情,并以收件人的身份传递密钥,那么它就不起作用了

不清楚该字段在中是什么,也不清楚哪个字段将该字段称为“指纹”。使用以下工具检查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]
// 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);
这将为您提供UID,并在第二行显示与每个密钥相关的指纹据我所知,您可以使用UID和指纹作为收件人。

因此,要加密的PHP代码可能如下所示:

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]
// 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);
然后收件人的代码将如下所示:

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]
// 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的版本。

之后,我应该如何在邮件中发送此消息,我是否应该简单地将$enc变量作为邮件正文,然后启用PGP的电子邮件软件将能够自己读取它?或者如何在邮件中发送此信息?您希望将加密文件作为附件发送,还是对整个邮件进行加密?我不确定客户是否要求使用PGP加密文件并以邮件形式发送。说明:addencryptkey需要指纹。您可以使用
gpg–fingerprint{user\u id}
获取用户指纹。切勿使用用户id,尤其是短(8位)的用户id。看见出于编程/脚本编制目的,请始终存储和处理完整指纹。长密钥ID