gnupg_encrypt

(PECL gnupg >= 0.1)

gnupg_encrypt加密给定的文本

描述

gnupg_encrypt(resource $identifier, string $plaintext): string|false

使用之前使用 gnupg_addencryptkey 设置的密钥加密给定的 plaintext,并返回加密后的文本。

参数

identifier

来自 gnupg_init()gnupg 的 gnupg 标识符。

plaintext

要加密的文本。

返回值

成功时,此函数返回加密后的文本。失败时,此函数返回 false

示例

示例 #1 过程化的 gnupg_encrypt() 示例

<?php
$res
= gnupg_init();
gnupg_addencryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC");
$enc = gnupg_encrypt($res, "just a test");
echo
$enc;
?>

示例 #2 OO gnupg_encrypt() 示例

<?php
$gpg
= new gnupg();
$gpg->addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$enc = $gpg->encrypt("just a test");
echo
$enc;
?>

添加注释

用户贡献注释 7 个注释

13
Mahbub Kabir
10 年前
// 要在命令行中生成密钥类型,请在 gpg 中使用 --gen-key
// 要导出公钥,请在 gpg 中使用 --export -a "用户名" > public.key

<?php
putenv
("GNUPGHOME=/tmp");

// 它假设公钥存在于 /tmp/keys 文件夹中
$publicKey = file_get_contents(getenv('GNUPGHOME') . '/keys/public.key');

$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
$info = $gpg->import($publicKey);
$gpg->addencryptkey($info['fingerprint']);

$uploadFileContent = file_get_contents('/tmp/file-to-encrypt');
$enc = $gpg->encrypt($uploadFileContent);
echo
$enc

希望这有帮助
13
nick johnson
16 年前
在花费了一些时间试图让这个扩展工作之后,我发现您必须设置 GNUPGHOME 环境变量以便可以找到密钥环,并且必须将其设置为等于 .gnupg 目录本身,而不是 apache/httpd 用户的主目录(这是 dan 的示例代码中显示的)。以下是该示例以及我当时正在编写的用于加密要存储在数据库中的数据的简单函数。

<?php
// 设置环境以便 gnupg 可以找到密钥环
putenv("GNUPGHOME=/home/apache/.gnupg");

function
encrypt_string($str,$fingerprint) {
$res = gnupg_init();
gnupg_addencryptkey($res,$fingerprint);
$enc = gnupg_encrypt($res, $str);
return
$enc;
}
?>
4
Stressed dev. Permission issue (SELinux)
2 年前
如果您使用的是 CentOS 8 并且遇到文件夹权限问题,请记住在开发期间禁用 SELinux。(/etc/selinux/config),只需更改为禁用或允许。然后,当您的项目投入生产时,将其切换回强制并添加适当的 se 上下文。
2
emiliocolombo3 at gmail dot com
8 年前
示例

获取密钥信息

<?php
putenv
('GNUPGHOME=/home/sender/.gnupg');

// 创建新的 GnuPG 对象
$gpg = new gnupg();

// 如果发生错误,则抛出异常
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// 获取包含字符串 'example' 的密钥列表
try {
$keys = $gpg->keyinfo('example');
print_r($info);
} catch (
Exception $e) {
echo
'ERROR: ' . $e->getMessage();
}
?>

加密简单的邮件

<?php
// 设置密钥环目录路径
// 设置密钥环目录路径
putenv('GNUPGHOME=/home/sender/.gnupg');

// 创建新的 GnuPG 对象
$gpg = new gnupg();

// 如果出现错误,则抛出异常
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// 收件人的电子邮件地址
$recipient = '[email protected]';

// 纯文本消息
$plaintext =
"亲爱的戴夫:\n
答案是 42。\n
约翰"
;

// 查找与电子邮件地址匹配的密钥
// 加密纯文本消息
// 显示并写入文件
try {
$gpg->addencryptkey($recipient);
$ciphertext = $gpg->encrypt($plaintext);
echo
'<pre>' . $ciphertext . '</pre>';
file_put_contents('/tmp/ciphertext.gpg', $ciphertext);
} catch (
Exception $e) {
die(
'错误:' . $e->getMessage());
}
?>

解密邮件

<?php
// 设置密钥环目录路径
putenv('GNUPGHOME=/home/recipient/.gnupg');

// 创建新的 GnuPG 对象
$gpg = new gnupg();

// 如果出现错误,则抛出异常
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// 收件人的电子邮件地址
$recipient = '[email protected]';

// 密文消息
$ciphertext = file_get_contents('/tmp/ciphertext.gpg');

// 通过提供密码来注册密钥
// 使用密钥解密密文
// 显示纯文本消息
try {
$gpg->adddecryptkey($recipient, 'guessme');
$plaintext = $gpg->decrypt($ciphertext);
echo
'<pre>' . $plaintext . '</pre>';
} catch (
Exception $e) {
die(
'错误:' . $e->getMessage());
}
?>
1
paul at cressbrook dot co dot uk
17 年前


我发现 apache 或 httpd 用户(或者运行 web 服务器的任何用户)需要对 .gnupg 目录具有写入权限,才能使 gnupg_php 函数正常工作。这可能是你的问题。这个模块似乎有一个不太令人满意的功能——gnupg 一直发出它不安全的警告。
2
dan at f-box dot org
16 年前
这是一个使用 import addencryptkey 和 encrypt 的过程式示例。显然,在实际应用中,你只导入一次密钥。

<?php

putenv
("GNUPGHOME=/tmp");
$pubkey = "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.6 (GNU/Linux)

mQGiBEe68W8RBACVuFuv4d+roDSCdRO1SuO8dQwds4VTjVOqgVKQtq6+8Fe95RY8
BAf1IyLj4bxvWPhr0wZdVwTosD/sFoPtdCyhVcF932nP0GLHsTEeVwSz9mid22HI
O4Kmwj2kE+I+C9QdzAg0zaWQnVaF9UC7pIdMR6tEnADI8nkVDdZ+zb2ziwCg6Yqu
tk3KAzKRT1SNUzTE/n9y2PED/1tIWiXfGBGzseX0W/e1G+MjuolWOXv4BXeiFGmn
8wnHsQ4Z4Tzk+ag0k+6pZZXjcL6Le486wpZ9MAe6LM31XDpQDVtyCL8t63nvQpB8
TUimbseBZMb3TytCubNLGFe5FnNLGDciElcD09d2xC6Xv6zE2jj4GtBW1bXqYWtl
jm0PA/4u6av6o6pIgLRfAawspr8kaeZ8+FU4NbIiS6xZmBUEQ/o7q95VKGgFVKBi
ugDOlnbgSzBIwSlsRVT2ivu/XVWnhQaRCotSm3AzOc2XecqrJ6F1gqk0n+yP/1h1
yeTvvfS5zgqNTG2UmovjVsKFzaDqmsYZ+sYfwc209z9PY+6FuLQnQXBhY2hlVGVz
dCAoVGVzdGluZykgPGFwYWNoZUBsb2NhbGhvc3Q+iF4EExECAB4FAke68W8CGwMG
CwkIBwMCAxUCAwMWAgECHgECF4AACgkQJE9COu2PFIEGDwCglArzAza13xjbdR04
DQ1U9FWQhMYAnRrWQeGTRm+BYm6SghNpDOKcmMqruQENBEe68XAQBADPIO+JFe5t
BQmI4l60bNMNSUqsL0TtIP8G6Bpd8q2xBOemHCLfGT9Y5DN6k0nneBQxajSfWBQ5
ZdKFwV5ezICz9fnGisEf9LPSwctfUIcvumbcPPsrUOUZX7BuCHrcfy1nebS3myO/
ScTKpW8Wz8AjpKTBG55DMkXSvnx+hS+PEwADBQP/dNnVlKYdNKA70B4QTEzfvF+E
5lyiauyT41SQoheTMhrs/3RIqUy7WWn3B20aTutHWWYXdYV+E85/CarhUmLNZGA2
tml1Mgl6F2myQ/+MiKi/aj9NVhcuz38OK/IAze7kNJJqK+UEWblB2Wfa31/9nNzv
ewVHa1xHtUyVDaewAACISQQYEQIACQUCR7rxcAIbDAAKCRAkT0I67Y8UgRwEAKDT
L6DwyEZGLTpAqy2OLUH7SFKm2ACgr3tnPuPFlBtHx0OqY4gGiNMJHXE=
=jHPH
-----END PGP PUBLIC KEY BLOCK-----"
;

$enc = (null);
$res = gnupg_init();
echo
"gnupg_init RTV = <br/><pre>\n";
var_dump($res);
echo
"</pre>\n";
$rtv = gnupg_import($res, $pubkey);
echo
"gnupg_import RTV = <br/><pre>\n";
var_dump($rtv);
echo
"</pre>\n";
$rtv = gnupg_addencryptkey($res, "C25F29936D9046D73A77DCF8244F423AED8F1481");
echo
"gnupg_addencryptkey RTV = <br /><pre>\n";
var_dump($rtv);
echo
"</pre>\n";
$enc = gnupg_encrypt($res, "just a test to see if anything works");
echo
"加密数据:" . $enc . "<br/>";

?>
-7
jkushner at livemercial dot com
17 年前
非常好的函数,但我似乎无法让它正常工作。
这是我的代码:

/**
* 测试值。将从数据库中获取。
*/
$_STR_recipientKeyId='78F21BCA81042C23';

// 这是一个我创建的包装类,它包含 gnupg 类
if(!class_exists('core_Gnupg')){
require(CORE_PATH_CLASS.'Gnupg.class.php');
}

//$_OBJ_gpg 只是该类的实例。
//returnInfo 接收用户 ID 名称,并使用 keyinfo() 函数返回该用户的数组数据。
$_ARR_keyinfo=$_OBJ_gpg->returnInfo($_STR_recipientUserId);

// 现在我有了完整有效的用户 ID
// 例如:Jonathan Kushner <[email protected]>
$_STR_recipientUserId=$_ARR_keyinfo[0]['uids'][0]['uid'];

###########################

你看,最初我使用的是上面的 $_ARR_keyinfo 中的指纹,并将其传递到 encrypt 函数中,但它仍然将加密数据与我与 apache 关联的个人私钥相关联。

有什么想法吗?
To Top