PHP Conference Japan 2024

gnupg_encrypt

(PECL gnupg >= 0.1)

gnupg_encrypt加密給定的文字

描述

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

使用先前透過 gnupg_addencryptkey 設定的金鑰加密給定的 plaintext,並傳回加密的文字。

參數

identifier

gnupg 識別符,來自對 gnupg_init()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;
?>

新增註解

使用者貢獻的註解 6 則註解

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
壓力大的開發者。權限問題 (SELinux)
2 年前
如果您正在使用 CentOS 8 並且遇到資料夾權限問題,請記得在開發期間停用 SELinux。(/etc/selinux/config),只需變更為 disabled 或 permissive。然後,當您的專案上線時,將其切換回 enforcing 並新增適當的 se context。
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 = 'dgar@example.org';

// 純文字訊息
$plaintext =
"親愛的 Dave,\n
答案是 42。\n
John"
;

// 尋找符合電子郵件地址的金鑰
// 加密純文字訊息
// 顯示並寫入檔案
try {
$gpg->addencryptkey($recipient);
$ciphertext = $gpg->encrypt($plaintext);
echo
'<pre>' . $ciphertext . '</pre>';
file_put_contents('/tmp/ciphertext.gpg', $ciphertext);
} catch (
Exception $e) {
die(
'ERROR: ' . $e->getMessage());
}
?>

解密郵件

<?php
// 設定金鑰環目錄的路徑
putenv('GNUPGHOME=/home/recipient/.gnupg');

// 建立新的 GnuPG 物件
$gpg = new gnupg();

// 如果發生錯誤,則拋出例外
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// 收件者的電子郵件地址
$recipient = 'dgar@example.org';

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

// 通過提供密碼註冊私鑰
// 使用私鑰解密密文
// 顯示純文字訊息
try {
$gpg->adddecryptkey($recipient, 'guessme');
$plaintext = $gpg->decrypt($ciphertext);
echo
'<pre>' . $plaintext . '</pre>';
} catch (
Exception $e) {
die(
'ERROR: ' . $e->getMessage());
}
?>
1
paul at cressbrook dot co dot uk
17 年前


我發現 apache 或 httpd 使用者(或網頁伺服器用來執行的任何使用者)需要具有 .gnupg 目錄的寫入權限,gnupg_php 函式才能運作。這可能是你的問題。這似乎是此模組相當不令人滿意的功能 - gnupg 一直發出警告,表示它不安全。
2
dan at f-box dot org
16 年前
這是一個導入 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
"Encrypted Data: " . $enc . "<br/>";

?>
To Top