PHP Conference Japan 2024

sodium_crypto_box

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box已驗證的公鑰加密

說明

sodium_crypto_box(#[\SensitiveParameter] 字串 $message, 字串 $nonce, #[\SensitiveParameter] 字串 $key_pair): 字串

使用非對稱式(公鑰)加密來加密訊息。

sodium_crypto_box() 為首碼的函式所使用的演算法是基於 Montgomery 曲線 Curve25519 的橢圓曲線迪菲-赫爾曼金鑰交換;通常縮寫為 X25519。

參數

message

要加密的訊息。

nonce

一個每條訊息只能使用一次的數字,長度為 24 位元組。這個大小的界限足以生成隨機數(例如,random_bytes())。

金鑰對 (key_pair)

參見 sodium_crypto_box_keypair_from_secretkey_and_publickey()。這應該包含傳送者的 X25519 私鑰和接收者的 X25519 公鑰。

回傳值

回傳加密後的訊息(密文加上驗證標籤)。密文將比明文長 16 位元組,並且是一個原始二進位字串。有關安全的儲存編碼,請參見 sodium_bin2base64()

新增註解

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

craig at craigfrancis dot co dot uk
6 年前
以下是如何使用 sodium_crypto_box() 的簡要範例:兩個人交換 $message,其中一人將其加密,以便只有另一人可以解密,並確保訊息確實是由發送者發送的(沒有被竄改)。

<?php

$keypair1
= sodium_crypto_box_keypair();
$keypair1_public = sodium_crypto_box_publickey($keypair1);
$keypair1_secret = sodium_crypto_box_secretkey($keypair1);

$keypair2 = sodium_crypto_box_keypair();
$keypair2_public = sodium_crypto_box_publickey($keypair2);
$keypair2_secret = sodium_crypto_box_secretkey($keypair2);

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

$message = 'hello';

$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);

$encryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair1_secret, $keypair2_public);
$encrypted = sodium_crypto_box($message, $nonce, $encryption_key);

echo
base64_encode($encrypted) . "\n";

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

$decryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair2_secret, $keypair1_public);
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $decryption_key);

echo
$decrypted . "\n";

?>
To Top