PHP Conference Nagoya 2025

sodium_crypto_box

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box認証付きの公開鍵による暗号化

説明

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

非対称(公開鍵)暗号を使ってメッセージを暗号化します。

sodium_crypto_box() というプレフィックスが付いた関数が使うアルゴリズムは、 Elliptic Curve Diffie-Hellman over the Montgomery curve, Curve25519; 略して X25519 です。

パラメータ

message

暗号化するメッセージ

nonce

メッセージごとに一度だけ使われる数値。 長さは24バイトです。 これは、 (たとえば、random_bytes()を使って) ランダムな値を生成するのに十分大きな長さです。

key_pair

sodium_crypto_box_keypair_from_secretkey_and_publickey() を参照ください。 この鍵ペアには、 送信者の X25519 形式の秘密鍵と、 受信者の X25519 形式の公開鍵が含まれているべきです。

戻り値

暗号化されたメッセージ(暗号化済みのテキストと、認証タグ)を返します。 暗号化済みのテキストは、 生のバイナリ文字列の分だけ、 プレーンテキストより16バイト長くなっています。 安全なエンコード方法については、 sodium_bin2base64() を参照ください。

add a note

User Contributed Notes 1 note

up
11
craig at craigfrancis dot co dot uk
6 years ago
Here's a quick example on how to use sodium_crypto_box(); where you have 2 people exchanging a $message, where person 1 encrypts it so that only person 2 can decrypt it, and be sure that person 1 actually sent it (without it being tampered with).

<?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);

//--------------------------------------------------
// Person 1, encrypting

$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";

//--------------------------------------------------
// Person 2, decrypting

$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