PHP Conference Japan 2024

sodium_crypto_box_seal

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_seal匿名公鑰加密

說明

sodium_crypto_box_seal(#[\SensitiveParameter] 字串 $message, 字串 $public_key): 字串

加密訊息,以便只有收件人可以解密。

sodium_crypto_box() 不同,您只需要知道接收者的公鑰即可使用 sodium_crypto_box_seal()。然而,這種便利性的一個後果是,密文並未綁定到靜態公鑰,因此未經身份驗證。 因此,這是匿名的公鑰加密。

sodium_crypto_box_seal() 仍然提供密文完整性。只是沒有寄件者身份驗證。

如果您還需要寄件者身份驗證,sodium_crypto_sign() 函數可能是最佳的起點。

參數

message(訊息)

要加密的訊息。

public_key(公鑰)

對應於唯一可以解密訊息的密鑰的公鑰。

傳回值

格式為 (一次性公鑰, 加密訊息, 驗證標籤) 的密文字串。

範例

範例 #1 sodium_crypto_box_seal() 範例

<?php
$keypair
= sodium_crypto_box_keypair();
$public_key = sodium_crypto_box_publickey($keypair);

// 將明文混淆以使範例更有趣
$plaintext_b64 = "V3JpdGluZyBzb2Z0d2FyZSBpbiBQSFAgY2FuIGJlIGEgZGVsaWdodCE=";
$decoded_plaintext = sodium_base642bin($plaintext_b64, SODIUM_BASE64_VARIANT_ORIGINAL);

$sealed = sodium_crypto_box_seal($decoded_plaintext, $public_key);
var_dump(base64_encode($sealed));

$opened = sodium_crypto_box_seal_open($sealed, $keypair);
var_dump($opened);
?>

上述範例將輸出類似以下的內容

string(120) "oRBXXAV4iQBrxlV4A21Bord8Yo/D8ZlrIIGNyaRCcGBfpz0map52I3xq6l+CST+1NSgQkbV+HiYyFjXWiWiaCGupGf+zl4bgWj/A9Adtem7Jt3h3emrMsLw="
string(41) "Writing software in PHP can be a delight!"
新增註記

使用者貢獻的註記 1 則註記

craig at craigfrancis dot co dot uk
6 年前
以下是如何使用 sodium_crypto_box_seal() 的快速範例;其中有 2 個人交換 $message - 第 1 個人將其加密,以便只有第 2 個人可以解密。它不允許第 2 個人知道是誰發送的,因為只使用了他們的公鑰(請參閱 sodium_crypto_box 來執行此操作)。

<?php

$金鑰對
= sodium_crypto_box_keypair();
$公開金鑰 = sodium_crypto_box_publickey($金鑰對);
$私密金鑰 = sodium_crypto_box_secretkey($金鑰對);

// $公開金鑰 = sodium_crypto_box_publickey_from_secretkey($私密金鑰);
// $金鑰對 = sodium_crypto_box_keypair_from_secretkey_and_publickey($私密金鑰, $公開金鑰);

//--------------------------------------------------
// 使用者 1,加密

$訊息 = 'hello';

$加密訊息 = sodium_crypto_box_seal($訊息, $公開金鑰);

echo
base64_encode($加密訊息) . "\n";

//--------------------------------------------------
// 使用者 2,解密

$解密訊息 = sodium_crypto_box_seal_open($加密訊息, $金鑰對);

echo
$解密訊息 . "\n";

?>
To Top