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

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

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

作成日: 更新日:

基本的な使い方

SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES定数は、暗号化処理に利用されるノンスの推奨バイト数を表す定数です。

「ノンス(Nonce)」とは、「Number once」の略で、暗号化処理において一度だけ使用されるユニークな数値やデータのことです。同じ暗号鍵を使用して複数のデータを暗号化する際、ノンスを毎回異なるものにすることで、暗号化アルゴリズムの安全性を確保し、セキュリティ上の脆弱性(例えば、同じ平文が同じ暗号文になることを避ける)を防ぐ重要な役割を担います。これにより、第三者による分析や攻撃が困難になります。

この定数は、特にPHPのlibsodium拡張機能が提供する認証付き暗号化アルゴリズムの一つである「AES-256 GCM」モードを使用する際に適用されます。AES-256 GCMは、データの機密性(内容が秘密に保たれること)と完全性(データが改ざんされていないこと)の両方を保証する、非常に強力で広く利用されている暗号化方式です。

開発者がAES-256 GCMアルゴリズムを用いてデータを安全に暗号化する際、適切な長さのノンスを提供する必要があります。このSODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES定数を利用することで、開発者はAES-256 GCMアルゴリズムが要求するノンスのバイト数を正確に把握し、誤りなく設定することができます。これにより、セキュアな暗号化実装をより確実に行うことが可能となり、コードの信頼性と保守性が向上します。この定数を使用することで、暗号化処理のセキュリティ要件を確実に満たし、安全なアプリケーション開発に貢献します。

構文(syntax)

1<?php
2
3echo SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES;
4
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP Sodium AES256GCM暗号化・復号例

1<?php
2
3/**
4 * AES256-GCM 暗号化と復号の例 (Sodium拡張を使用)
5 *
6 * このコードは、SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES 定数を使用して、
7 * AES256-GCM 暗号化に必要なノンス(Nonce)のサイズを確保する方法を示します。
8 *
9 * @param string $message 暗号化する平文メッセージ。
10 * @return void
11 */
12function encryptAndDecryptAes256Gcm(string $message): void
13{
14    // Sodium拡張がロードされているかを確認します。
15    if (!extension_loaded('sodium')) {
16        echo "エラー: Sodium拡張がロードされていません。\n";
17        return;
18    }
19
20    // 1. セキュアなランダムキーを生成します。
21    // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES はAES256GCMに必要なキーサイズ(32バイト)を指定します。
22    $key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES);
23    echo "生成されたキー (hex): " . bin2hex($key) . "\n\n";
24
25    // 2. ユニークなノンス(Nonce, Number Used Once)を生成します。
26    // SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES はAES256GCMに必要なノンスサイズ(12バイト)を指定します。
27    // この定数は、ノンスが正しい長さであることを保証するために重要です。
28    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES);
29    echo "生成されたノンス (hex): " . bin2hex($nonce) . "\n";
30    echo "ノンスのサイズ (バイト): " . strlen($nonce) . " (期待値: " . SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES . ")\n\n";
31
32    // 3. オプション: 追加認証データ (AAD: Additional Authenticated Data)。
33    // このデータは暗号化されませんが、改ざん防止のために認証されます。
34    // 復号時にも同じAADを提供する必要があります。
35    $additionalData = 'このデータは認証されますが、暗号化されません。';
36    echo "平文メッセージ: " . $message . "\n";
37    echo "追加認証データ: " . $additionalData . "\n\n";
38
39    // 4. メッセージを暗号化します。
40    // 暗号化された結果には、暗号文と認証タグが含まれます。
41    $encrypted = sodium_crypto_aead_aes256gcm_encrypt(
42        $message,
43        $additionalData,
44        $nonce,
45        $key
46    );
47
48    echo "暗号化されたデータ (hex): " . bin2hex($encrypted) . "\n\n";
49
50    // 5. メッセージを復号します。
51    // 成功するためには、暗号化時と同じノンス、キー、および追加認証データを使用する必要があります。
52    $decrypted = sodium_crypto_aead_aes256gcm_decrypt(
53        $encrypted,
54        $additionalData,
55        $nonce,
56        $key
57    );
58
59    if ($decrypted === false) {
60        echo "復号に失敗しました!\n";
61    } else {
62        echo "復号されたメッセージ: " . $decrypted . "\n\n";
63        if ($decrypted === $message) {
64            echo "暗号化と復号が正常に完了し、元のメッセージと一致しました。\n";
65        } else {
66            echo "エラー: 復号されたメッセージが元のメッセージと一致しません。\n";
67        }
68    }
69}
70
71// --- 使用例 ---
72$originalMessage = "システムエンジニアを目指す皆さんへ、これは機密情報です。";
73encryptAndDecryptAes256Gcm($originalMessage);
74
75?>

このPHPサンプルコードは、Sodium拡張を用いたAES256-GCM方式でのデータ暗号化・復号を示します。特に、安全な暗号化に不可欠な「ノンス(Nonce)」の扱い方を解説します。

SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES定数は、AES256-GCM暗号化に必須なノンスのバイト数を定義します。ノンスは「一度だけ使われる数値」のことで、同じ暗号化キーで複数回暗号化する際に、毎回異なるノンスを用いることで、暗号の安全性を高めます。この定数を使うことで、確実に正しい長さのノンスを生成できます。

コードはまず、キーとこの定数で定義されたノンスを生成します。メッセージと追加認証データをsodium_crypto_aead_aes256gcm_encryptで暗号化し、sodium_crypto_aead_aes256gcm_decryptで復号します。追加認証データは暗号化されず、データの改ざん防止に利用されます。

encryptAndDecryptAes256Gcm関数は、暗号化したい文字列$messageを引数に取ります。戻り値はvoidで、実行結果や成否のメッセージを画面に出力します。

このコードでは、SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES定数を用いてノンスのサイズを正確に確保しています。最も重要な注意点は、ノンスを暗号化ごとに必ず異なる値で生成することです。同じノンスを複数回使うとセキュリティ上の脆弱性につながります。キーとノンスは機密情報として厳重に管理してください。追加認証データ(AAD)は、復号時に同じ値を提供しないと認証が失敗するため、データの改ざん検出に役立ちます。また、sodium拡張がロードされているか確認し、復号関数の戻り値で成功を必ず検証することが、安全な暗号化処理の基本です。

PHP8 Sodium AES256-GCM 暗号化・復号化の例

1<?php
2
3/**
4 * AES256-GCM暗号化と復号化のデモンストレーション関数。
5 *
6 * SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES 定数を使ってNonceの長さを指定し、
7 * メッセージを安全に暗号化・復号化する例を示します。
8 *
9 * @param string $message 暗号化する平文メッセージ。
10 * @param string $additionalData 認証のみ対象の追加データ(オプション)。
11 */
12function demonstrateAes256GcmEncryption(string $message, string $additionalData = ''): void
13{
14    // AES256-GCM暗号化に使用する秘密鍵を生成します。
15    // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES は鍵の必要なバイト長です。
16    $key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES);
17
18    // ノンス(Number Used Once)を生成します。
19    // SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES は、この暗号化方式で必要なノンスのバイト長です。
20    // 同じ鍵とノンスのペアは絶対に二度使用してはいけません。
21    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES);
22
23    echo "--- AES256-GCM 暗号化と復号化 ---\n";
24    echo "元のメッセージ: " . $message . "\n";
25    if ($additionalData) {
26        echo "追加データ (AD): " . $additionalData . "\n";
27    }
28
29    // メッセージを暗号化します。
30    // sodium_crypto_aead_aes256gcm_encrypt は、認証付き暗号化を実行します。
31    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
32        $message,
33        $additionalData,
34        $nonce,
35        $key
36    );
37
38    echo "暗号文 (Base64エンコード): " . base64_encode($ciphertext) . "\n\n";
39
40    // 暗号文を復号化します。
41    // 復号化に失敗した場合(例: 暗号文、鍵、ノンス、ADが改ざんされた場合)、falseを返します。
42    $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt(
43        $ciphertext,
44        $additionalData,
45        $nonce,
46        $key
47    );
48
49    if ($decryptedMessage !== false) {
50        echo "復号化されたメッセージ: " . $decryptedMessage . "\n";
51        echo "復号化成功: " . ($message === $decryptedMessage ? "はい" : "いいえ") . "\n";
52    } else {
53        echo "復号化に失敗しました。データが改ざんされた可能性があります。\n";
54    }
55    echo "-------------------------------------\n\n";
56}
57
58// サンプル実行
59demonstrateAes256GcmEncryption("秘密の情報を保護しましょう!", "このデータは顧客ID 12345 に関連します。");
60demonstrateAes256GcmEncryption("Hello, PHP 8!", "");

SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTESは、PHPのSodium拡張機能が提供する定数で、AES256-GCMという認証付き暗号化方式において、ノンス(Nonce: Number Used Once)に必要なバイト長を示します。ノンスは、同じ鍵で複数のデータを暗号化する際に各メッセージごとに一度だけ使用されるランダムな値であり、高いセキュリティを保つために極めて重要です。

この定数自体は引数や戻り値を持たず、特定の整数値(バイト長)を保持しています。サンプルコードでは、random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES)のように、この定数を使ってAES256-GCM方式に適した長さのノンスを生成しています。

生成されたノンスは、sodium_crypto_aead_aes256gcm_encrypt関数に、暗号化するメッセージ、追加データ、秘密鍵とともに引数として渡されます。sodium_crypto_aead_aes256gcm_encrypt関数は、これらを用いてメッセージを安全に暗号化し、認証タグを含む暗号文を生成します。復号化にはsodium_crypto_aead_aes256gcm_decrypt関数が使用され、暗号文と関連情報が改ざんされていないことを検証し、元のメッセージを復元します。セキュリティ上、同じ鍵とノンスのペアを複数回使用してはならないため、この定数で正しいノンス長を指定することが不可欠です。

このサンプルコードで利用するNonce(ノンス)は、SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTESによって定義される長さを持ちます。最も重要な注意点として、同じ鍵とNonceのペアを二度と使用してはいけません。Nonceの使い回しは、深刻なセキュリティ上の脆弱性につながるため、必ず毎回新しいNonceを生成してください。また、暗号鍵も安全な方法で生成し、誰にも知られないよう厳重に管理することが不可欠です。この暗号化方式は認証付き暗号であるため、復号化関数がfalseを返した場合は、データが改ざんされている可能性が非常に高いと判断し、適切なエラーハンドリングを行う必要があります。正しく理解し利用することで、データの機密性と完全性を保護できます。

関連コンテンツ

関連プログラミング言語