【PHP8.x】sodium_crypto_box_seal()関数の使い方
sodium_crypto_box_seal関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
sodium_crypto_box_seal関数は、特定の受信者のみが復号できるメッセージを暗号化するシーリングボックスを生成する関数です。この関数は非対称暗号(公開鍵暗号)を利用し、メッセージの機密性を保護します。
平文メッセージと受信者の公開鍵を引数に取ります。これらの情報をもとに、送信者を秘匿し、指定された受信者のみが復号できる暗号化データ(シーリングボックス)を生成して返します。受信者は自身の秘密鍵でシーリングボックスを復号し、メッセージを安全に読み取ります。
送信者のプライバシーを保護しつつ、機密情報を特定の相手に安全に伝える場合に有用です。例えば、匿名メッセージや、送信者を秘匿したい情報共有の場面で役立ちます。PHPのLibreSodium拡張機能の一部として、堅牢な暗号化機能をPHPアプリケーションに提供します。
構文(syntax)
1<?php 2$message = 'This is the message to be sealed.'; 3$recipient_public_key = str_repeat('A', SODIUM_CRYPTO_BOX_PUBLICKEYBYTES); // 受信者の公開鍵 (実際のキーを使用) 4 5$sealed_message = sodium_crypto_box_seal($message, $recipient_public_key); 6?>
引数(parameters)
string $message, string $public_key
- string $message: 封印(暗号化)する対象のメッセージを指定する文字列
- string $public_key: メッセージを復号するための受信者の公開鍵を指定する文字列
戻り値(return)
string
与えられた公開鍵とメッセージを安全に暗号化し、その暗号化されたデータを返します。
サンプルコード
PHP Sodium: メッセージを暗号化・復号する
1<?php 2 3/** 4 * sodium_crypto_box_seal および sodium_crypto_box_seal_open 関数の使用例を示します。 5 * 6 * この関数は、受信者の公開鍵を使用してメッセージを匿名で暗号化する方法と、 7 * 受信者が自身の鍵ペアを使用してそのメッセージを復号する方法を実演します。 8 * 送信者は自分の鍵ペアを持つ必要がなく、受信者の公開鍵だけで暗号化できます。 9 */ 10function demonstrateCryptoBoxSeal(): void 11{ 12 // 1. Sodium拡張が有効になっているかを確認します。 13 if (!extension_loaded('sodium')) { 14 echo "エラー: 'sodium' 拡張機能がロードされていません。php.ini で有効にしてください。\n"; 15 return; 16 } 17 18 echo "--- Sodium Crypto Box Seal デモンストレーション ---\n\n"; 19 20 // --- 受信者側の処理 --- 21 echo "1. 受信者が鍵ペアを生成します。\n"; 22 // 受信者用の鍵ペアを生成します。これには秘密鍵と公開鍵が含まれます。 23 $recipient_keypair = sodium_crypto_box_keypair(); 24 // 鍵ペアから公開鍵を抽出します。これは送信者に渡されます。 25 $recipient_public_key = sodium_crypto_box_publickey($recipient_keypair); 26 27 echo " 受信者の公開鍵が生成されました。\n\n"; 28 29 // --- 送信者側の処理 --- 30 echo "2. 送信者がメッセージを準備し、受信者の公開鍵を使って暗号化します。\n"; 31 $original_message = "これは送信者からの秘密のメッセージです。"; 32 echo " 元のメッセージ: \"{$original_message}\"\n"; 33 34 // 受信者の公開鍵を使用してメッセージを暗号化します。 35 // 送信者はメッセージを暗号化するために自身の鍵ペアを必要としません。 36 // この暗号化されたメッセージは、受信者が自身の完全な鍵ペアを使用した場合のみ復号できます。 37 $sealed_message = sodium_crypto_box_seal($original_message, $recipient_public_key); 38 39 if ($sealed_message === false) { 40 echo "エラー: メッセージの暗号化に失敗しました。\n"; 41 return; 42 } 43 44 echo " メッセージは正常に暗号化されました。(長さ: " . strlen($sealed_message) . " バイト)\n"; 45 // 暗号化されたメッセージはバイナリデータなので、一部を16進数で表示します。 46 echo " 暗号化されたメッセージ (最初の32バイト): " . bin2hex(substr($sealed_message, 0, 32)) . "...\n\n"; 47 48 // --- 受信者側の処理 (復号) --- 49 echo "3. 受信者が暗号化されたメッセージを受信し、自身の鍵ペアを使って復号します。\n"; 50 // 受信者の完全な鍵ペアを使用して暗号化されたメッセージを復号します。 51 $opened_message = sodium_crypto_box_seal_open($sealed_message, $recipient_keypair); 52 53 if ($opened_message === false) { 54 echo "エラー: 暗号化されたメッセージの復号に失敗しました。メッセージが破損しているか、この受信者向けではありません。\n"; 55 return; 56 } 57 58 echo " メッセージは正常に復号されました。\n"; 59 echo " 復号されたメッセージ: \"{$opened_message}\"\n\n"; 60 61 // 元のメッセージと復号されたメッセージが一致するか検証します。 62 if ($original_message === $opened_message) { 63 echo "検証: 元のメッセージと復号されたメッセージが一致しました!暗号化/復号は成功です。\n"; 64 } else { 65 echo "検証: 元のメッセージと復号されたメッセージが一致しません。何らかの問題が発生しました!\n"; 66 } 67 68 // 秘密鍵などの機密情報をメモリからクリアします。 69 sodium_memzero($recipient_keypair); 70} 71 72// デモンストレーション関数を実行します。 73demonstrateCryptoBoxSeal(); 74 75?>
PHPのsodium_crypto_box_seal関数は、Sodium拡張機能が提供する暗号化ツールの一つで、メッセージを匿名かつ安全に暗号化するために利用されます。この関数の最大の特徴は、メッセージの送信者が自身の鍵ペアを持たなくても、受信者の公開鍵さえあればメッセージを暗号化できる点です。これにより、受信者に対して誰でも秘密の情報を送ることが可能になり、そのメッセージを復号できるのは、対応する秘密鍵を持つ正当な受信者だけに限られます。
引数としては、暗号化したい元のメッセージを文字列として$messageに、メッセージの受信者の公開鍵を文字列として$public_keyに渡します。関数が成功すると、暗号化されたメッセージが文字列として返されます。もし暗号化に失敗した場合はfalseが戻り値となります。暗号化されたメッセージは、受信者がsodium_crypto_box_seal_open関数と自身の完全な鍵ペア(秘密鍵と公開鍵)を用いることで復号されます。この仕組みは、送信者の身元を明かすことなく、特定の受信者へ秘密情報を送る場面で役立ちます。
sodium_crypto_box_seal関数は、受信者の公開鍵のみを使ってメッセージを匿名で暗号化します。この機能を利用するには、PHPのSodium拡張機能が有効になっていることを確認してください。暗号化や復号の処理が失敗する可能性があるため、戻り値がfalseでないか必ずチェックする習慣が重要です。復号には、暗号化時に使用した公開鍵に対応する受信者の完全な鍵ペアが必要となります。秘密鍵を含む鍵ペアは非常に機密性が高いため、使用後はsodium_memzero関数で必ずメモリから安全に消去し、決して外部に漏洩させないよう厳重に管理してください。この関数は送信者を認証するものではない点にもご注意ください。
Sealed Boxでメッセージを暗号化・復号する
1<?php 2 3/** 4 * PHP Sodium extensionを使用し、受信者の公開鍵でメッセージを暗号化(Sealed Box)、 5 * その後、対応する秘密鍵で復号するサンプルコードです。 6 * 7 * sodium_crypto_box_seal は非対称暗号化の一種です。 8 * 送信者は受信者の公開鍵のみを知っていればメッセージを暗号化できます。 9 * 復号できるのは、対応する秘密鍵を持つ受信者のみです。 10 * この方式(Sealed Box)では、送信者の鍵ペアは不要です。 11 */ 12function encryptAndDecryptWithSealedBox(): void 13{ 14 // Sodium拡張が利用可能か確認 15 if (!extension_loaded('sodium')) { 16 echo "エラー: PHP拡張 'sodium' がロードされていません。\n"; 17 return; 18 } 19 20 // 1. 受信者の鍵ペアを生成します。 21 // 本番環境では、これらの鍵は安全に生成・保存・管理されるべきです。 22 $recipientKeyPair = sodium_crypto_box_keypair(); 23 $recipientPublicKey = sodium_crypto_box_publickey($recipientKeyPair); 24 $recipientSecretKey = sodium_crypto_box_secretkey($recipientKeyPair); 25 26 // 2. 暗号化する元のメッセージを定義します。 27 $originalMessage = 'このメッセージはsodium_crypto_box_sealで暗号化されます。'; 28 29 echo "元のメッセージ: " . $originalMessage . "\n"; 30 echo "----------------------------------------\n"; 31 32 // 3. sodium_crypto_box_seal を使ってメッセージを暗号化します。 33 // 送信者は受信者の公開鍵 ($recipientPublicKey) を使って暗号化を行います。 34 $sealedBox = sodium_crypto_box_seal($originalMessage, $recipientPublicKey); 35 36 echo "暗号化されたデータ (Sealed Box, バイナリをhex表示): " . bin2hex($sealedBox) . "\n"; 37 echo "----------------------------------------\n"; 38 39 // 4. 暗号化されたメッセージを復号 (sodium_crypto_box_open) 40 // 受信者は自身の公開鍵と秘密鍵 ($recipientPublicKey, $recipientSecretKey) を使って復号します。 41 $decryptedMessage = sodium_crypto_box_open($sealedBox, $recipientPublicKey, $recipientSecretKey); 42 43 // 5. 結果の検証 44 if ($decryptedMessage !== false && $decryptedMessage === $originalMessage) { 45 echo "復号されたメッセージ: " . $decryptedMessage . "\n"; 46 echo "結果: 暗号化と復号が成功し、メッセージが一致しました。\n"; 47 } else { 48 echo "エラー: 暗号化または復号に失敗しました。\n"; 49 if ($decryptedMessage === false) { 50 echo "詳細: sodium_crypto_box_open 関数が false を返しました (復号失敗)。\n"; 51 } 52 } 53} 54 55// 関数を実行 56encryptAndDecryptWithSealedBox(); 57
PHP 8のsodium_crypto_box_seal関数は、受信者の公開鍵を用いてメッセージを暗号化する「Sealed Box」という非対称暗号化方式を提供します。この方式では、メッセージを送る側は受信者の公開鍵さえ知っていれば暗号化でき、メッセージを受け取る側だけが、対応する秘密鍵を使って復号できます。送信者側の鍵ペアは不要です。
引数には、暗号化したい元の文字列メッセージを$messageとして、暗号化されたメッセージを復号する受信者の公開鍵を$public_keyとして指定します。関数は暗号化されたデータを含む文字列を戻り値として返します。
サンプルコードでは、まず受信者の公開鍵と秘密鍵のペアを生成しています。次に、暗号化したいメッセージを定義し、sodium_crypto_box_seal関数を使ってそのメッセージと受信者の公開鍵でデータを暗号化します。暗号化されたデータは$sealedBox変数に格納されます。最後に、sodium_crypto_box_open関数を用いて、元の受信者の公開鍵と秘密鍵を使ってデータを復号し、元のメッセージと一致するかどうかを確認しています。これにより、メッセージが安全に暗号化され、正しく復号できることが示されています。
本サンプルコードを利用する際は、PHPのSodium拡張がサーバーにインストールされ、有効になっていることを確認してください。最も重要な注意点は、生成される鍵ペア、特に秘密鍵の厳重な管理です。本番環境では、鍵が外部に漏洩しないよう、安全な方法で生成、保存、管理し、使い回しは避ける必要があります。sodium_crypto_box_seal関数は、受信者の公開鍵だけでメッセージを暗号化できる「Sealed Box」という非対称暗号方式です。この方式では送信者の鍵ペアは不要ですが、暗号化されたメッセージが誰から送られたか(送信者の身元)を検証する機能は含まれていません。また、sodium_crypto_box_open関数での復号が失敗した場合、falseが返されますので、必ず復号結果の検証を行ってください。