Pra*_*ant 24 php gnupg pgp openpgp
我想使用PGP加密来加密CSV文件,我通过PHP脚本生成,然后通过电子邮件将该文件发送到客户端.客户端会给我加密密钥,我需要将其用于加密文件.
我用Google搜索了PGP并发现它是非常好的隐私,我也找到了OpenPGP http://www.openpgp.org/和GnuPG http://www.gnupg.org/这两种类型的PGP是什么?我应该使用哪一个?
如何使用PHP中的PGP使用我的客户端将提供的密钥加密文件?
我第一次听到这个术语,任何人都可以帮助理解这一点并在PHP中实现它.
Jen*_*rat 42
所以你想要做的是加密到OpenPGP密钥.您的客户端用于解密数据的OpenPGP的哪种实现对您来说并不重要.使用PHP,通常使用GnuPG并且内置接口.
使用GnuPG接口,这是可以为PHP安装的扩展.
首先,导入密钥,其中$keydata
是ASCII装甲公钥:
<?php
$gpg = new gnupg();
$info = $gpg -> import($keydata);
print_r($info);
?>
Run Code Online (Sandbox Code Playgroud)
然后使用此密钥加密数据,这次使用客户端密钥的指纹:
<?php
$gpg = new gnupg();
$gpg -> addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$enc = $gpg -> encrypt("just a test");
echo $enc;
?>
Run Code Online (Sandbox Code Playgroud)
如果要加密文件,请阅读并传递给它们encrypt()
.DEADBEEFDEADBEEF
在引用密钥时,务必使用至少长密钥ID(例如),更好的指纹(如示例中所示); 并且从不使用短密钥ID(DEADBEEF
),因为它们容易受到冲突攻击.
这是一个更全面的示例,用于在PHP手册中由用户添加.
在这里留下一个答案,因为网上许多 PHP GnuPG 的例子都是非常简单的,希望这可以减轻一些人的挫败感。
基本上,它反映了 GnuPG 命令行工具的工作方式。如果 gpg 的密钥环中尚未包含密钥,则需要导入该密钥,然后您需要选择收件人的密钥以用于加密/解密。
gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
Run Code Online (Sandbox Code Playgroud)
如果您按照我的做法并以收件人身份传递密钥,则它不起作用!
GPG 手册或PHP 文档中都不清楚该字段是什么,PHP 文档将该字段称为“指纹”。检查 gpg 的密钥环中是否有新导入的密钥:
gpg --list-keys
Run Code Online (Sandbox Code Playgroud)
这将输出类似这样的内容:
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]
Run Code Online (Sandbox Code Playgroud)
这将为您提供 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!');
Run Code Online (Sandbox Code Playgroud)
那么接收者的代码将如下所示:
// 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);
Run Code Online (Sandbox Code Playgroud)
请注意,接收者的公钥和私钥的指纹是相同的。
还有一个已知问题是 adddecryptkey 不使用密码!您需要删除密码或更改您的 GnuPG 版本。
归档时间: |
|
查看次数: |
31526 次 |
最近记录: |