【PHP8.x】SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES定数の使い方
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES定数は、PHPのlibsodium拡張機能において、ChaCha20-Poly1305認証付き暗号化アルゴリズムで使用される秘密鍵の推奨されるバイト長を表す定数です。この定数を使用することで、開発者はセキュリティ上適切な鍵の長さを簡単に取得し、暗号化処理を安全に実装できます。
ChaCha20-Poly1305は、データの機密性(内容が漏れないようにする)と完全性(データが改ざんされていないかを確認する)の両方を同時に保証する「認証付き暗号化(AEAD)」と呼ばれる方式の一つです。これは、高速で堅牢な暗号化アルゴリズムとして広く利用されています。この定数が示す値は、sodium_crypto_aead_chacha20poly1305_keygen()のような鍵生成関数で利用されるほか、生成された鍵のバイト長が正しいかを確認する際にも役立ちます。
プログラミングにおいて暗号化機能を扱う際、この定数を用いることで、ChaCha20-Poly1305アルゴリズムの仕様に準拠した、セキュリティ上適切な鍵の長さを確実に利用できます。これにより、開発者は鍵の長さに関する潜在的なセキュリティリスクを回避し、安全な暗号化処理を簡単に実現できます。
構文(syntax)
1<?php 2echo SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP Sodium: Chacha20-Poly1305 AEAD暗号化デモ
1<?php 2 3/** 4 * このサンプルコードはPHP 8とSodium拡張が有効な環境で動作します。 5 * 6 * SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES 定数と 7 * sodium_crypto_aead_chacha20poly1305_ietf_npubbytes に関連する 8 * Chacha20-Poly1305 IETF AEAD 暗号化の基本的な使用例を示します。 9 * 10 * この関数は、メッセージを暗号化し、その後復号化する一連の流れを実演します。 11 * 暗号化されたデータには認証タグが含まれ、改ざんを検出できます。 12 */ 13function demonstrateAeadChacha20Poly1305IetfEncryption(): void 14{ 15 echo "--- Chacha20-Poly1305 IETF AEAD 暗号化デモ ---\n"; 16 17 // 1. オリジナルのメッセージを準備します。 18 $originalMessage = "これは秘密のメッセージです。誰にも読まれてはいけません!"; 19 echo "元のメッセージ: " . $originalMessage . "\n\n"; 20 21 // 2. 暗号化に使用する鍵を生成します。 22 // SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES は、 23 // Chacha20-Poly1305で使用される鍵のバイト数(32バイト)を定義する定数です。 24 $key = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES); 25 echo "鍵の生成 (バイト数: " . SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES . ")\n"; 26 // 鍵は機密情報であり、安全に保管・管理する必要があります。ここではデモンストレーションのため生成しています。 27 28 // 3. ナンス(使い捨ての数値、Nonce)を生成します。 29 // SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES は、 30 // IETF版Chacha20-Poly1305で使用されるナンスのバイト数(12バイト)を定義する定数です。 31 // ナンスは、同じ鍵で複数のメッセージを暗号化する際に必須で、毎回異なる値を使用する必要があります。 32 // ナンスが再利用されると、深刻なセキュリティ上の脆弱性につながります。 33 $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES); 34 echo "ナンスの生成 (バイト数: " . SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES . ")\n"; 35 // ナンスは機密情報ではありませんが、改ざんされないように保護されるべきです。 36 37 // 4. 追加認証データ(Authenticated Additional Data - AAD)を準備します。 38 // このデータは暗号化されませんが、認証タグの一部として保護されます。 39 // 例えば、メッセージの受信者やタイムスタンプなど、公開しても良いが改ざんされたくない情報に使われます。 40 $additionalData = "user_id:123, transaction_id:XYZ"; 41 echo "追加認証データ: " . $additionalData . "\n\n"; 42 43 // 5. メッセージを暗号化します。 44 // `sodium_crypto_aead_chacha20poly1305_ietf_encrypt` 関数を使用します。 45 // 結果として得られる暗号文には、元のメッセージと認証タグが含まれます。 46 $encryptedMessage = sodium_crypto_aead_chacha20poly1305_ietf_encrypt( 47 $originalMessage, 48 $additionalData, 49 $nonce, 50 $key 51 ); 52 echo "暗号化されたメッセージ (Hex): " . bin2hex($encryptedMessage) . "\n"; 53 echo "暗号文の長さ: " . strlen($encryptedMessage) . " バイト\n\n"; 54 55 // 6. 暗号化されたメッセージを復号化します。 56 // 復号化には、暗号化時と同じ鍵、ナンス、追加認証データが必要です。 57 // `sodium_crypto_aead_chacha20poly1305_ietf_decrypt` 関数を使用します。 58 // 認証が失敗(メッセージまたは追加データが改ざんされた)した場合、false を返します。 59 $decryptedMessage = sodium_crypto_aead_chacha20poly1305_ietf_decrypt( 60 $encryptedMessage, 61 $additionalData, 62 $nonce, 63 $key 64 ); 65 66 if ($decryptedMessage === false) { 67 echo "エラー: メッセージの復号化に失敗しました。データが改ざんされた可能性があります。\n"; 68 } else { 69 echo "復号化されたメッセージ: " . $decryptedMessage . "\n"; 70 if ($decryptedMessage === $originalMessage) { 71 echo "成功: 復号化されたメッセージは元のメッセージと一致します。\n\n"; 72 } else { 73 echo "失敗: 復号化されたメッセージが元のメッセージと一致しません(論理的なエラー)。\n\n"; 74 } 75 } 76 77 echo "--- 改ざんされた場合のデモ ---\n"; 78 79 // 7. 暗号文を改ざんした場合の復号化を試みます。 80 // 認証付き暗号の重要な特性は、わずかな改ざんでも復号化が失敗することです。 81 $tamperedEncryptedMessage = $encryptedMessage; 82 // 暗号文の最後のバイトを反転させて改ざんをシミュレート 83 $tamperedEncryptedMessage[strlen($tamperedEncryptedMessage) - 1] = chr( 84 ord($tamperedEncryptedMessage[strlen($tamperedEncryptedMessage) - 1]) ^ 0xFF 85 ); 86 87 echo "改ざんされた暗号化されたメッセージ (Hex): " . bin2hex($tamperedEncryptedMessage) . "\n\n"; 88 89 $failedDecryption = sodium_crypto_aead_chacha20poly1305_ietf_decrypt( 90 $tamperedEncryptedMessage, 91 $additionalData, 92 $nonce, 93 $key 94 ); 95 96 if ($failedDecryption === false) { 97 echo "成功: 改ざんされたメッセージの復号化は認証失敗として検出されました。\n"; 98 echo "これは、データが途中で改ざんされていないことを保証するAEADの重要な機能です。\n"; 99 } else { 100 echo "エラー: 改ざんが検出されませんでした(これは深刻なセキュリティ上の問題です)。\n"; 101 } 102} 103 104// デモ関数を実行します。 105demonstrateAeadChacha20Poly1305IetfEncryption();
このPHPサンプルコードは、Sodium拡張機能を使ってChacha20-Poly1305 IETF AEADという認証付き暗号化方式の基本的な利用方法を解説しています。まず、秘密のメッセージを準備し、暗号化と復号化に必須の「鍵」と「ナンス」を生成します。SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES定数は、この暗号化方式で鍵に必要とされる32バイトの長さを指定します。同様に、SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES定数は、ナンスに必要とされる12バイトの長さを指定しており、ナンスはセキュリティを確保するため毎回異なる値を使用する必要があります。
次に、メッセージを暗号化するためにsodium_crypto_aead_chacha20poly1305_ietf_encrypt関数を使用します。この関数は、元のメッセージ、改ざんされたくないが公開されてもよい追加認証データ、ナンス、鍵を引数として受け取り、認証タグを含む暗号文を返します。この認証タグにより、データが改ざんされていないかを検証できます。
暗号化されたメッセージを復号するには、sodium_crypto_aead_chacha20poly1305_ietf_decrypt関数を使います。この関数は、暗号文、追加認証データ、ナンス、鍵を引数とし、成功すれば元のメッセージを返します。もし暗号文や追加認証データが改ざんされていた場合、復号は失敗し、この関数はfalseを返してデータの整合性が失われたことを通知します。サンプルコードでは、正常な動作と、改ざんを検出するセキュリティ機能の両方を実演しています。
このサンプルコードはPHP 8でSodium拡張が有効な環境が前提です。最も重要な注意点として、暗号化で使用するナンス(Nonce)は、同じ鍵を使う際には毎回必ず異なる値を生成し、決して再利用しないでください。ナンスの再利用は深刻なセキュリティ脆弱性につながります。また、鍵は極めて機密性の高い情報ですので、安全な方法で生成・保管・管理する必要があります。サンプルコードはデモンストレーションのため都度生成していますが、実運用では鍵管理システムなどの利用を検討してください。復号化関数がfalseを返した場合は、メッセージまたは追加認証データが改ざんされた可能性が高いため、そのデータを信用してはなりません。
sodium_crypto_boxで公開鍵暗号化する
1<?php 2 3/** 4 * Libsodiumライブラリを使った非対称暗号化(公開鍵暗号)の基本的な流れを示します。 5 * このサンプルでは、異なるユーザー間で安全にメッセージをやり取りする方法と、 6 * SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES 定数の関連性について説明します。 7 */ 8function demonstrateAsymmetricEncryption(): void 9{ 10 echo "--- 非対称暗号化のデモンストレーション ---\n\n"; 11 12 // --- 1. 鍵ペアの生成 --- 13 // 送信者(Alice)と受信者(Bob)の鍵ペア(秘密鍵と公開鍵のセット)を生成します。 14 // 秘密鍵は絶対に他人に漏らしてはなりません。公開鍵は共有できます。 15 $aliceKeypair = sodium_crypto_box_keypair(); 16 $bobKeypair = sodium_crypto_box_keypair(); 17 18 // 各鍵ペアから公開鍵と秘密鍵を抽出します。 19 // Libsodium関数は、これらの鍵をバイナリ形式で返します。 20 $alicePublicKey = sodium_crypto_box_publickey_from_secretkey( 21 sodium_crypto_box_secretkey($aliceKeypair) 22 ); 23 $bobPublicKey = sodium_crypto_box_publickey_from_secretkey( 24 sodium_crypto_box_secretkey($bobKeypair) 25 ); 26 27 echo "Aliceの公開鍵 (Hex): " . bin2hex($alicePublicKey) . "\n"; 28 echo "Bobの公開鍵 (Hex): " . bin2hex($bobPublicKey) . "\n\n"; 29 30 // --- 2. 暗号化するメッセージの準備 --- 31 $message = "Hello, this is a secret message from Alice to Bob!"; 32 echo "元のメッセージ: '" . $message . "'\n\n"; 33 34 // --- 3. ナンス (Nonce) の生成 --- 35 // ナンス (Number used once) は、暗号化ごとに一度だけ使用されるランダムな値です。 36 // 同じ鍵で複数のメッセージを暗号化する場合でも、常に異なるナンスを使う必要があります。 37 // これにより、セキュリティが大幅に向上します。 38 // SODIUM_CRYPTO_BOX_NONCEBYTES は、必要なナンスのバイト数を示す定数です。 39 $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES); 40 echo "生成されたナンス (Hex): " . bin2hex($nonce) . "\n\n"; 41 42 // --- 4. メッセージの暗号化 (Alice -> Bob) --- 43 // AliceがBobの公開鍵と自身の秘密鍵を使ってメッセージを暗号化します。 44 // sodium_crypto_box 関数は、X25519 Diffie-Hellman鍵交換とChaCha20-Poly1305 45 // 暗号を組み合わせて安全なメッセージボックスを作成します。 46 $encryptedMessage = sodium_crypto_box( 47 $message, 48 $nonce, 49 $bobPublicKey, 50 sodium_crypto_box_secretkey($aliceKeypair) 51 ); 52 53 echo "暗号化されたメッセージ (Hex): " . bin2hex($encryptedMessage) . "\n"; 54 echo "暗号化メッセージのバイト数: " . strlen($encryptedMessage) . " バイト\n\n"; 55 56 // --- 5. メッセージの復号化 (Bob -> Alice) --- 57 // BobがAliceの公開鍵と自身の秘密鍵、そして同じナンスを使ってメッセージを復号化します。 58 // 復号に成功すると元のメッセージが返され、失敗すると false が返されます。 59 $decryptedMessage = sodium_crypto_box_open( 60 $encryptedMessage, 61 $nonce, 62 $alicePublicKey, 63 sodium_crypto_box_secretkey($bobKeypair) 64 ); 65 66 if ($decryptedMessage === false) { 67 echo "エラー: メッセージの復号化に失敗しました。\n"; 68 } else { 69 echo "復号化されたメッセージ: '" . $decryptedMessage . "'\n"; 70 echo "復号成功: " . ($message === $decryptedMessage ? "はい" : "いいえ") . "\n\n"; 71 } 72 73 // --- 6. SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES 定数の表示 --- 74 // この定数は、ChaCha20-Poly1305 AEAD (Authenticated Encryption with Associated Data) 75 // 暗号化スキームで使用される鍵のバイト数を示します。 76 // sodium_crypto_box は、内部でメッセージの暗号化にChaCha20-Poly1305アルゴリズムを 77 // 利用しているため、この定数はその内部構造と関連があります。 78 echo "--- 関連する暗号化定数情報 ---\n"; 79 echo "SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES: " 80 . SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES . " バイト\n"; 81 echo "(これは、ChaCha20-Poly1305 暗号の鍵の長さを表します。)\n"; 82} 83 84// デモンストレーション関数を実行します。 85// Libsodium拡張が利用可能であることを確認してください。 86if (extension_loaded('sodium')) { 87 demonstrateAsymmetricEncryption(); 88} else { 89 echo "エラー: PHP Libsodium 拡張がロードされていません。\n"; 90 echo "php.ini で 'extension=sodium' を有効にするか、インストールしてください。\n"; 91}
このサンプルコードは、PHPのLibsodium拡張機能を用いた非対称暗号化(公開鍵暗号)の基本的な仕組みをデモンストレーションしています。送信者(Alice)と受信者(Bob)がそれぞれ生成した公開鍵と秘密鍵を利用して、安全にメッセージを暗号化し、復号化する一連の流れが示されています。
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTESは、Libsodiumライブラリで定義されている定数の一つです。この定数は、ChaCha20-Poly1305という認証付き暗号(AEAD)アルゴリズムが内部的に使用する共通鍵のバイト数(長さ)を示します。定数であるため引数を取らず、直接の戻り値もありませんが、PHPスクリプト内でこの暗号方式の鍵の長さを参照する際に利用されます。
サンプルコード中でメッセージの暗号化と復号化に用いられているsodium_crypto_box関数は、X25519 Diffie-Hellman鍵交換とChaCha20-Poly1305アルゴリズムを組み合わせて、安全なメッセージのやり取りを実現しています。したがって、SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES定数は、sodium_crypto_boxがその内部で採用している暗号化方式の鍵の長さを表しており、使用される暗号技術のセキュリティ特性を理解するための重要な情報源となります。このコードは、鍵ペアの生成、ナンスの利用、そしてそれらを用いた暗号化・復号化のプロセスを具体的に示しています。
このサンプルコードを利用する際は、秘密鍵の厳重な管理が最も重要です。秘密鍵が漏洩すると、暗号化された情報がすべて解読されてしまうため、絶対に他人に漏らさないでください。また、nonce(ナンス)は暗号化のたびに必ず異なるランダムな値を生成して使用してください。同じナンスを繰り返し使用すると、セキュリティ上の深刻な脆弱性につながります。SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTESは、ChaCha20-Poly1305暗号の鍵の長さを表す定数であり、直接鍵を生成する用途で使うものではありません。このコードを実行するには、PHP Libsodium拡張が正しくインストールされ、有効になっている必要があります。復号化を行うsodium_crypto_box_open関数の戻り値は必ず確認し、falseが返された場合は復号失敗として適切にエラーを処理してください。