【PHP8.x】SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数の使い方
SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数は、PHPのSodium拡張機能が提供する、AES256GCMという認証付き暗号化方式で使用される秘密鍵の長さをバイト単位で表す定数です。AES256GCMは、Advanced Encryption Standard (AES) の256ビット鍵長とGalois/Counter Mode (GCM) を組み合わせた、非常に強力で広く利用されている暗号化アルゴリズムです。この方式は、単にデータを暗号化して内容を秘密に保つだけでなく、データが途中で改ざんされていないことを保証する認証機能も併せ持つため、データの機密性と完全性の両方を高いレベルで保護できます。
この定数が示す値は、AES256GCM方式で利用する鍵が何バイトの長さであるべきかを示しており、開発者がこのアルゴリズムを使ってデータを安全に保護する際に非常に重要です。例えば、新しい暗号化鍵を生成する関数や、既に存在する鍵を検証する関数に、この定数の値を引数として渡すことで、常に正しい長さの鍵を扱うことができます。これにより、プログラムの誤動作やセキュリティ上の脆弱性を防ぎ、堅牢な暗号化通信やデータの安全な保存を実現するための基盤となります。
構文(syntax)
1<?php 2echo SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES;
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
この定数は、AES-256-GCM暗号化アルゴリズムで使用される鍵のバイト長を示します。整数値で返されます。
サンプルコード
sodium_crypto_aead_aes256gcm_encrypt 例
1<?php 2 3/** 4 * libsodiumのAES256-GCMモードを使用した暗号化と復号化の例を示します。 5 * SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES 定数を使用して鍵を生成します。 6 * この関数は単体で動作し、初心者でも理解しやすいように簡潔に記述されています。 7 */ 8function runAes256GcmEncryptionExample(): void 9{ 10 // 1. 鍵の生成 11 // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES 定数で指定されたバイト数(32バイト)で、 12 // 安全な暗号鍵を生成します。 13 $key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES); 14 if ($key === false) { 15 echo "エラー: 鍵の生成に失敗しました。" . PHP_EOL; 16 return; 17 } 18 echo "鍵を生成しました (" . SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES . "バイト)。" . PHP_EOL; 19 20 // 2. ナンス (Nonce: Number used once) の生成 21 // ナンスは、同じ鍵で複数のメッセージを暗号化する際に、毎回異なる値を使用する必要があります。 22 // SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTES 定数で指定されたバイト数(12バイト)を使用します。 23 $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTES); 24 if ($nonce === false) { 25 echo "エラー: ナンスの生成に失敗しました。" . PHP_EOL; 26 return; 27 } 28 echo "ナンスを生成しました (" . SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTES . "バイト)。" . PHP_EOL; 29 30 // 3. 平文メッセージと追加認証データ (AAD) の準備 31 // AADは暗号化されませんが、改ざん防止の認証対象となります。 32 $message = 'Hello, System Engineer! This is a secret message.'; 33 $additionalData = 'order_id_12345'; // このデータは暗号化されず、認証のために使用されます 34 35 echo PHP_EOL . "--- 暗号化 ---" . PHP_EOL; 36 echo "元のメッセージ: " . $message . PHP_EOL; 37 echo "追加認証データ (AAD): " . $additionalData . PHP_EOL; 38 39 // 4. メッセージの暗号化 40 // sodium_crypto_aead_aes256gcm_encrypt 関数を使用してメッセージを暗号化します。 41 // 戻り値は、暗号文と認証タグが結合されたバイナリデータです。 42 $ciphertext = sodium_crypto_aead_aes256gcm_encrypt( 43 $message, // 暗号化する平文 44 $additionalData, // 追加認証データ 45 $nonce, // ナンス 46 $key // 暗号鍵 47 ); 48 49 if ($ciphertext === false) { 50 echo "エラー: 暗号化に失敗しました!" . PHP_EOL; 51 return; 52 } 53 echo "暗号文 (Base64エンコード): " . base64_encode($ciphertext) . PHP_EOL; 54 55 echo PHP_EOL . "--- 復号化 ---" . PHP_EOL; 56 57 // 5. 暗号文の復号化 58 // sodium_crypto_aead_aes256gcm_decrypt 関数を使用して暗号文を復号化します。 59 // 復号化に成功すると平文が返されます。 60 // 改ざんされたり、誤った鍵/ナンス/AADが使用された場合は false が返されます。 61 $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt( 62 $ciphertext, // 復号化する暗号文 63 $additionalData, // 暗号化時と同じAADを提供する必要があります 64 $nonce, // 暗号化時と同じナンスを提供する必要があります 65 $key // 暗号化時と同じ鍵を提供する必要があります 66 ); 67 68 if ($decryptedMessage === false) { 69 echo "復号化に失敗しました!メッセージが改ざんされたか、誤った鍵/ナンス/AADが使用された可能性があります。" . PHP_EOL; 70 } else { 71 echo "復号化されたメッセージ: " . $decryptedMessage . PHP_EOL; 72 73 // 6. 検証 74 // 復号化されたメッセージが元のメッセージと一致するか確認します。 75 if ($message === $decryptedMessage) { 76 echo "検証成功: 元のメッセージと復号化されたメッセージは一致します。" . PHP_EOL; 77 } else { 78 echo "検証失敗: 元のメッセージと復号化されたメッセージは一致しません。" . PHP_EOL; 79 } 80 } 81} 82 83// サンプル関数を実行 84runAes256GcmEncryptionExample(); 85 86?>
このサンプルコードは、PHPのlibsodium拡張機能を利用したAES256-GCMモードでのデータ暗号化と復号化の基本的な流れを示しています。SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数は、AES256-GCM暗号方式で推奨される鍵のバイト数を定義しており、通常32バイトの値が設定されています。この定数は、セキュアな暗号鍵を生成する際に、鍵の適切な長さを指定するために利用されます。
コードでは、まずSODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数を使ってrandom_bytes関数により暗号鍵を生成します。次に、SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTES定数で指定されたバイト数でナンス(Nonce:一度だけ使う乱数)を生成します。ナンスは、同じ鍵で複数のメッセージを暗号化する際に必ず異なる値を用いる必要があります。その後、暗号化したい平文メッセージと、暗号化はされないもののメッセージの改ざん防止に役立つ追加認証データ(AAD)を準備します。
メッセージの暗号化にはsodium_crypto_aead_aes256gcm_encrypt関数を使用します。この関数は、平文、AAD、ナンス、鍵を引数にとり、暗号文と認証タグを結合したバイナリデータを戻り値として返します。復号化にはsodium_crypto_aead_aes256gcm_decrypt関数を使います。この関数は、暗号文、暗号化時と同じAAD、ナンス、鍵を引数にとり、復号に成功すれば元の平文を、失敗した場合はfalseを戻り値として返します。復号化が成功すると、元のメッセージが安全に再現されることを確認できます。この一連の処理は、データの機密性と完全性を確保するための重要な手段です。
このサンプルコードは、鍵の生成にSODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES定数を用いて正しい鍵長を保証しています。本番環境で利用する鍵は、安全に生成し、厳重に管理して外部に漏洩させないことが最も重要です。また、ナンス(Nonce)は、同じ鍵で複数のメッセージを暗号化する際に、必ず毎回異なる値を生成して使用してください。ナンスの再利用はセキュリティを著しく低下させるため、絶対に避けるべきです。追加認証データ(AAD)は、暗号化時と復号化時で全く同じ値を提供しないと復号に失敗します。暗号化および復号化の各関数は失敗時にfalseを返しますので、必ずその戻り値をチェックし、適切にエラー処理を行ってください。
PHP Sodium: AES256-GCM 暗号化と復号
1<?php 2 3/** 4 * AES256-GCM認証付き暗号化と復号のデモンストレーションを行います。 5 * 6 * SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES は、AES256-GCM暗号化に必要なキーの長さを定義します。 7 * sodium_crypto_aead_aes256gcm_encrypt は、このキーとノンスを使用してメッセージを暗号化します。 8 * 9 * @param string $originalMessage 暗号化する元のメッセージ。 10 * @param string $associatedData 認証する関連データ(暗号化はされない)。 11 * @return void 12 */ 13function demonstrateAes256GcmEncryption(string $originalMessage, string $associatedData = ''): void 14{ 15 echo "--- AES256-GCM 暗号化と復号のデモンストレーション ---" . PHP_EOL; 16 echo "元のメッセージ: " . $originalMessage . PHP_EOL; 17 echo "関連データ (AD): " . $associatedData . PHP_EOL . PHP_EOL; 18 19 // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES 定数を使用して、 20 // AES256-GCM に必要なサイズの暗号学的に安全なランダムキーを生成します。 21 $key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES); 22 echo "生成されたキーの長さ: " . strlen($key) . " バイト (期待値: " . SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES . " バイト)" . PHP_EOL; 23 echo "キー (Hex): " . bin2hex($key) . PHP_EOL; 24 25 // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES 定数を使用して、 26 // ノンス(Number Used Once)を生成します。 27 // 同じキーで暗号化するたびに、ノンスは一意でなければなりません。 28 $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); 29 echo "生成されたノンスの長さ: " . strlen($nonce) . " バイト (期待値: " . SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES . " バイト)" . PHP_EOL; 30 echo "ノンス (Hex): " . bin2hex($nonce) . PHP_EOL . PHP_EOL; 31 32 // --- 暗号化 --- 33 // sodium_crypto_aead_aes256gcm_encrypt 関数を使用してメッセージを暗号化します。 34 // 関連データ (AD) は認証されますが、暗号化はされません。 35 $ciphertext = sodium_crypto_aead_aes256gcm_encrypt( 36 $originalMessage, 37 $associatedData, 38 $nonce, 39 $key 40 ); 41 42 echo "暗号化されたデータ (Ciphertext) (Hex): " . bin2hex($ciphertext) . PHP_EOL . PHP_EOL; 43 44 // --- 復号 --- 45 // 暗号化されたデータを復号します。 46 // 関連データや暗号文が改ざんされた場合、またはキーやノンスが正しくない場合、 47 // 復号は失敗し、falseを返します。 48 $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt( 49 $ciphertext, 50 $associatedData, 51 $nonce, 52 $key 53 ); 54 55 if ($decryptedMessage === false) { 56 echo "復号に失敗しました!データが改ざんされたか、認証情報が正しくありません。" . PHP_EOL; 57 } else { 58 echo "復号されたメッセージ: " . $decryptedMessage . PHP_EOL; 59 if ($decryptedMessage === $originalMessage) { 60 echo "検証: 復号されたメッセージは元のメッセージと一致します。" . PHP_EOL; 61 } else { 62 echo "検証: エラー!復号されたメッセージは元のメッセージと一致しません。" . PHP_EOL; 63 } 64 } 65 echo PHP_EOL; 66} 67 68// サンプルコードの実行 69demonstrateAes256GcmEncryption( 70 'これはAES256-GCMで保護されるべき秘密のメッセージです。', 71 'ユーザーID: 1001, トランザクションID: TXN-5678' 72); 73 74demonstrateAes256GcmEncryption( 75 '短いメッセージ。', 76 '追加情報' 77);
PHPのSodium拡張機能は、高度な暗号化機能を提供し、このサンプルコードではAES256-GCM認証付き暗号化の利用方法を示しています。
SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTESは、AES256-GCM暗号化に必要な共通鍵のバイト数を定義する定数です。この定数を利用することで、適切な長さの暗号鍵を安全に生成できます。
sodium_crypto_aead_aes256gcm_encrypt関数は、メッセージを暗号化するために使用されます。引数として、$originalMessage(暗号化する元のデータ)、$associatedData(暗号化はされないが、データの認証に利用される追加情報)、$nonce(Number Used Once、各暗号化操作で一意である必要のある値)、そして$key(共通鍵)を受け取ります。この関数は暗号文($ciphertext)を戻り値として返します。特に$nonceは、同じ鍵で複数回暗号化する際に必ず異なる値を使用する必要があり、セキュリティ上非常に重要です。
暗号化されたデータは、sodium_crypto_aead_aes256gcm_decrypt関数によって復号されます。この関数も同様に、$ciphertext、$associatedData、$nonce、$keyを引数に取ります。データが改ざんされていなかったり、認証情報が正しければ元のメッセージを返し、改ざんや認証情報の不一致があった場合はfalseを返して復号の失敗を知らせます。これにより、データの機密性だけでなく完全性も同時に保護できるのが認証付き暗号化の強みです。
このサンプルコードで暗号化を行う際、キーはSODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTESで指定された長さでrandom_bytes関数を使って生成し、厳重に管理することが最も重要です。また、ノンスはSODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTESで指定された長さで生成し、同じキーで暗号化するたびに必ず異なる値を使用しなければなりません。ノンスを使い回すとセキュリティ上の深刻な脆弱性につながりますので特に注意が必要です。関連データは暗号化されませんが、データの改ざん検知のために認証対象となります。復号処理は、データが改ざんされたり認証情報が正しくない場合にfalseを返しますので、その戻り値を必ず確認してエラーハンドリングを行うようにしてください。この機能を利用するには、PHPにLibsodium拡張がインストールされている必要があります。