Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES定数の使い方

SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES定数は、PHPのSodium拡張機能が提供するAES-256 GCM認証付き暗号化において、認証タグのバイト数を表す定数です。PHPのSodium拡張は、安全で高性能な暗号化機能を利用するためのインターフェースを提供しており、AES-256 GCMはその中核となる認証付き暗号化モードの一つです。

認証付き暗号化とは、データを単に秘密にするだけでなく、そのデータが途中で改ざんされていないことを保証するための技術です。AES-256 GCMモードでは、データを暗号化する際に「認証タグ」と呼ばれる短いデータが生成され、元のデータに付加されます。この認証タグは、データが復号される際に、そのデータが正しく、かつ途中で変更されていないかを検証するために使用されます。もしデータや認証タグが少しでも変更されていた場合、復号は失敗し、改ざんが検出される仕組みです。

このSODIUM_CRYPTO_AEAD_AES256GCM_ABYTES定数は、AES-256 GCMで生成されるこの認証タグが、標準的に何バイトの長さであるかを示す数値を保持しています。開発者が暗号化・復号処理を行う際に、認証タグのサイズを正確に扱うことはセキュリティ上非常に重要です。この定数を利用することで、プログラムの可読性が向上し、また、将来的に認証タグの推奨サイズが変更された場合でも、定数の値だけを更新すれば良いため、コードの保守性も高まります。システムエンジニアを目指す方にとって、安全なデータ処理を実装する上で、このような定数の利用は標準的なプラクティスとなります。

構文(syntax)

1<?php
2echo SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

AES256-GCMでメッセージを暗号化・復号する

1<?php
2
3/**
4 * AES256-GCM を用いたメッセージの暗号化と復号化の例を示します。
5 *
6 * SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES 定数は、
7 * AES256-GCM暗号化で使用される認証タグのバイト数(Advanced Bytes)を示します。
8 * 暗号化後の出力には、メッセージとこの認証タグが含まれます。
9 * この定数自体を関数に直接渡すことはありませんが、暗号化データの構造を理解する上で重要です。
10 * また、認証付き暗号の機能により、データが改ざんされていないことを確認できます。
11 */
12function encryptAndDecryptAes256GcmMessage(): void
13{
14    // 1. 秘密鍵の生成
15    // AES256-GCMには、SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTESで定義された長さの鍵が必要です。
16    // この鍵は秘密にしておく必要があり、送信者と受信者で共有されます。
17    $key = sodium_crypto_aead_aes256gcm_keygen();
18
19    // 2. ナンス(Nonce)の生成
20    // ナンスは使い捨ての数値(Number used once)で、同じ鍵で同じナンスを二度使ってはいけません。
21    // SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTESで定義された長さが必要です。
22    // ナンスは秘密にする必要はなく、暗号文と一緒に送信できます。
23    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NONCEBYTES);
24
25    // 3. 暗号化する平文メッセージ
26    $originalMessage = "これはAES256-GCMで安全に送信したい秘密のメッセージです。";
27
28    // 4. 追加認証データ (Additional Data: AD) の準備
29    // このデータは暗号化されませんが、認証プロセスに含まれるため、
30    // メッセージが改ざんされていないことの確認に役立ちます。
31    // (例: 通信プロトコルのヘッダー、タイムスタンプなど)
32    $additionalData = "ユーザーID:12345, 有効期限:2024-12-31";
33
34    echo "--- 暗号化処理 ---" . PHP_EOL;
35    echo "元のメッセージ: " . $originalMessage . PHP_EOL;
36    echo "追加認証データ: " . $additionalData . PHP_EOL;
37
38    // 5. メッセージの暗号化
39    // sodium_crypto_aead_aes256gcm_encrypt 関数は、メッセージ、追加データ、ナンス、鍵を用いて暗号化します。
40    // 返される暗号文には、暗号化されたメッセージと認証タグ(SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES分の長さ)が含まれます。
41    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
42        $originalMessage,
43        $additionalData,
44        $nonce,
45        $key
46    );
47
48    echo "暗号文 (バイナリ表現の一部): " . bin2hex(substr($ciphertext, 0, 32)) . "..." . PHP_EOL;
49    echo "暗号文の全体の長さ: " . strlen($ciphertext) . " バイト" . PHP_EOL;
50    echo "認証タグの長さ (SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES): " . SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES . " バイト" . PHP_EOL;
51    echo "暗号文中のメッセージ部分の長さ: " . (strlen($ciphertext) - SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES) . " バイト" . PHP_EOL;
52
53    echo PHP_EOL . "--- 復号処理 ---" . PHP_EOL;
54
55    // 6. メッセージの復号化
56    // 復号時には、暗号化時と全く同じ暗号文、追加認証データ、ナンス、鍵が必要です。
57    // これらのいずれか一つでも異なると、復号に失敗し、false が返されます。
58    // これは、データが改ざんされたことを示す強力なセキュリティ機能です。
59    $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt(
60        $ciphertext,
61        $additionalData, // 暗号化時と同じ追加認証データ
62        $nonce,          // 暗号化時と同じナンス
63        $key             // 暗号化時と同じ鍵
64    );
65
66    if ($decryptedMessage === false) {
67        echo "復号に失敗しました。認証タグが無効か、データが改ざんされています。" . PHP_EOL;
68    } else {
69        echo "復号されたメッセージ: " . $decryptedMessage . PHP_EOL;
70        if ($decryptedMessage === $originalMessage) {
71            echo "元のメッセージと復号されたメッセージが一致しました。通信は成功です。" . PHP_EOL;
72        } else {
73            echo "エラー: メッセージが一致しませんでした。" . PHP_EOL;
74        }
75    }
76
77    echo PHP_EOL . "--- 復号失敗の例(追加認証データを変更) ---" . PHP_EOL;
78    // 故意に異なる追加認証データを使って復号を試みます。
79    $modifiedAdditionalData = "異なるユーザーID:99999";
80    $failedDecryption = sodium_crypto_aead_aes256gcm_decrypt(
81        $ciphertext,
82        $modifiedAdditionalData, // 変更されたADで復号を試みる
83        $nonce,
84        $key
85    );
86
87    if ($failedDecryption === false) {
88        echo "追加認証データが一致しないため、復号に失敗しました。これは期待される動作です(認証失敗)。" . PHP_EOL;
89    } else {
90        echo "予期せぬ復号成功: " . $failedDecryption . PHP_EOL;
91    }
92}
93
94// 関数を実行してサンプルコードの動作を確認します。
95encryptAndDecryptAes256GcmMessage();

SODIUM_CRYPTO_AEAD_AES256GCM_ABYTESは、PHPのSodium拡張機能が提供する定数で、AES256-GCMという認証付き共通鍵暗号方式でメッセージを暗号化する際に生成される「認証タグ」のバイト数を示します。認証タグは、暗号化されたデータが通信中に改ざんされていないかを検証するために付加される重要な情報です。この定数自体が関数に直接渡されることはありませんが、sodium_crypto_aead_aes256gcm_encrypt関数によって生成される暗号文の内部構造を理解する上で役立ちます。具体的には、この関数は元のメッセージと認証タグを結合したバイト列を戻り値として返します。

サンプルコードでは、まずsodium_crypto_aead_aes256gcm_keygenで秘密鍵を生成し、random_bytesで使い捨てのナンス(Nonce)を用意します。次に、暗号化したい元のメッセージと、認証プロセスに含める追加認証データを指定し、sodium_crypto_aead_aes256gcm_encrypt関数を使ってこれらを暗号化します。この関数の戻り値である暗号文の全体の長さから、SODIUM_CRYPTO_AEAD_AES256GCM_ABYTESを引くことで、元のメッセージ部分の長さを把握できます。

復号化の際には、暗号文、鍵、ナンス、そして暗号化時に使用した追加認証データを、sodium_crypto_aead_aes256gcm_decrypt関数に渡します。この関数は、認証タグが有効でデータが改ざんされていなければ、元のメッセージを戻り値として返します。しかし、認証タグや追加認証データに不一致があればfalseを返し、データの不正を検出します。これにより、暗号化された情報の機密性と完全性が保証される仕組みがこのサンプルコードで示されています。

このコードはAES256-GCM暗号化の利用例です。暗号鍵は秘密に厳重管理し、送信者と受信者で安全に共有してください。ナンスは一度しか使えず、同じ鍵とナンスの組み合わせは二度と使用してはいけません。ナンスは秘密にする必要はなく、暗号文と共に送れます。SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES定数は、暗号文に含まれる認証タグの長さを表し、データの改ざん検知に役立ちます。復号時には、鍵、ナンス、追加認証データが暗号化時と完全に一致する必要があります。もし一つでも異なると、復号関数はfalseを返し、これはデータ改ざんや入力情報の誤りを示す重要なセキュリティ機能です。この失敗を適切に処理してください。

PHP SodiumでAES256-GCM暗号化する

1<?php
2
3/**
4 * AES256-GCM 暗号化と復号のデモンストレーション。
5 *
6 * この関数は、PHP の Sodium 拡張機能を使用してデータを安全に暗号化し、
7 * そして復号する方法を示します。
8 *
9 * SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES は、暗号文に付加される
10 * 認証タグのバイト数 (16バイト) を定義する定数です。
11 * これは、暗号化されたデータの整合性を検証するために使用されます。
12 *
13 * @param string $plaintext 暗号化する平文データ。
14 * @param string $associatedData 任意で、暗号文とともに認証されるが、
15 *                               暗号化はされない追加データ。
16 * @return void
17 */
18function demonstrateAes256GcmEncryption(string $plaintext, string $associatedData = ''): void
19{
20    // 1. AES256-GCM 用の安全なランダムキーを生成します。
21    // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES は必要なキーサイズ (32バイト) を定義します。
22    $key = sodium_crypto_aead_aes256gcm_keygen();
23
24    // 2. ユニークなナンス (Number Used Once) を生成します。
25    // 同じキーで暗号化するたびに、このナンスは必ずユニークである必要があります。
26    // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES は必要なナンスサイズ (12バイト) を定義します。
27    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
28
29    echo "--- 暗号化プロセス ---\n";
30    echo "平文: '" . $plaintext . "'\n";
31    echo "関連データ: '" . $associatedData . "'\n";
32    // キーやナンスはデバッグ目的以外で表示すべきではありませんが、理解のために表示。
33    // echo "キー (hex): " . bin2hex($key) . "\n";
34    // echo "ナンス (hex): " . bin2hex($nonce) . "\n";
35
36    // 3. 平文を暗号化します。
37    // 出力は、暗号文と認証タグが連結されたものです。
38    // 認証タグの長さは SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES で定義されます (16バイト)。
39    $ciphertextWithTag = sodium_crypto_aead_aes256gcm_encrypt(
40        $plaintext,
41        $associatedData,
42        $nonce,
43        $key
44    );
45
46    echo "暗号文と認証タグ (hex): " . bin2hex($ciphertextWithTag) . "\n";
47    echo "暗号文と認証タグの合計長: " . strlen($ciphertextWithTag) . " バイト\n";
48
49    // 認証タグの長さを明確に示す
50    $authenticationTagLength = SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES;
51    echo "認証タグの長さ (SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES): " . $authenticationTagLength . " バイト\n";
52
53
54    echo "\n--- 復号プロセス ---\n";
55
56    // 4. 暗号文を復号します。
57    // データが改ざんされている、またはキー/ナンス/関連データが間違っている場合、
58    // この関数は false を返すか、例外をスローします。
59    $decryptedPlaintext = sodium_crypto_aead_aes256gcm_decrypt(
60        $ciphertextWithTag,
61        $associatedData,
62        $nonce,
63        $key
64    );
65
66    if ($decryptedPlaintext === false) {
67        echo "復号に失敗しました!データが改ざんされたか、間違ったパラメータが使用された可能性があります。\n";
68    } else {
69        echo "復号された平文: '" . $decryptedPlaintext . "'\n";
70
71        // 5. 復号された平文が元の平文と一致するか検証します。
72        if ($decryptedPlaintext === $plaintext) {
73            echo "復号に成功し、検証されました!\n";
74        } else {
75            echo "復号に成功しましたが、平文の不一致が発生しました(通常は発生しません)。\n";
76        }
77    }
78
79    // 重要なデータ(キーなど)は、不要になったら必ずメモリからクリアします。
80    sodium_memzero($key);
81}
82
83// この関数を実行するには、PHP の Sodium 拡張機能が有効になっている必要があります。
84
85// 例1: 基本的な暗号化と復号
86demonstrateAes256GcmEncryption("こんにちは、安全な世界!");
87echo "\n---\n\n";
88
89// 例2: 関連データを含んだ暗号化と復号
90demonstrateAes256GcmEncryption("機密の財務記録。", "ユーザーID: 12345");
91

PHP 8で提供されるSodium拡張機能の一部であるSODIUM_CRYPTO_AEAD_AES256GCM_ABYTESは、AES256-GCMという高度な暗号化アルゴリズムを用いる際に使用される定数です。この定数は、暗号文に付加される「認証タグ」のバイト数を示しており、具体的には16バイトという値を持っています。認証タグとは、暗号化されたデータが第三者によって不正に改ざんされていないか、その整合性を検証するために生成される情報のことです。

sodium_crypto_aead_aes256gcm_encrypt関数を用いてデータを暗号化すると、元のデータ(平文)が暗号化された結果(暗号文)とともに、この定数で定義される長さの認証タグが連結されて出力されます。復号処理では、入力された暗号文から認証タグを抽出し、それを用いてデータの整合性を確認します。もしデータが暗号化後に変更されていた場合、復号処理は失敗し、安全ではないデータが誤って利用されることを防ぎます。この定数を知ることで、暗号化されたデータの安全性がどのように保証されているかを理解する助けとなります。

PHPで安全な暗号化を行うには、まずSodium拡張機能を有効にする必要があります。サンプルコードで使われているSODIUM_CRYPTO_AEAD_AES256GCM_ABYTESは、暗号文に付加される認証タグのバイト数(16バイト)を定義する定数です。この認証タグにより、暗号文の改ざん検知が可能となります。暗号化キーは厳重に管理し、ナンスは同じキーで暗号化するたびに必ずユニークなものを生成してください。これらを誤るとセキュリティが脆弱になります。また、$associatedDataは暗号化されませんが認証の対象となるため、データの整合性向上に役立ちます。復号に失敗した場合はデータが改ざんされたか、パラメータに誤りがあるため、適切なエラー処理を実装することが重要です。使用後のキーはsodium_memzero()でメモリから消去しましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語