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

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

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

作成日: 更新日:

基本的な使い方

SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES定数は、PHPのSodium拡張機能が提供する暗号化処理の一つである、AES-256-GCM認証付き暗号化方式で使用されるNonce(ナンス)の推奨バイト長を表す定数です。

Sodium拡張機能は、アプリケーションで安全な暗号化および復号化の機能を手軽に利用できるようにするための強力なツールを提供しています。その中でもAES-256-GCMは、現代の標準的な暗号化アルゴリズムであり、データの機密性を保護するだけでなく、そのデータが改ざんされていないことを保証する認証機能も兼ね備えています。

この定数が示すNonceは、「Number used once(一度だけ使われる数値)」の略で、暗号化操作ごとに必ず異なるユニークな値を生成して使用することが求められます。Nonceが繰り返し使われると、暗号文から情報が漏洩したり、悪意のある第三者によってデータが容易に改ざんされたりする重大なセキュリティ上の脆弱性が生じるため、その一意性は極めて重要です。

SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES定数には、このAES-256-GCM方式において、Nonceとして安全かつ適切に機能するために必要なバイト数(長さ)が数値として格納されています。開発者は、sodium_crypto_aead_aes256gcm_encryptのような関連関数を使ってデータを暗号化する際に、この定数の値に従って正しい長さのNonceを生成し、利用する必要があります。これにより、堅牢なセキュリティを維持したデータ保護が実現されます。

構文(syntax)

1<?php
2$nonceBytes = SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES は、AES-256-GCM 認証付き暗号化アルゴリズムで使用される nonce(使い捨て乱数)のバイト長を表す整数定数です。

サンプルコード

AES256-GCM暗号化・復号化デモ

1<?php
2
3/**
4 * AES256-GCMアルゴリズムを使用してデータを暗号化・復号化する例です。
5 *
6 * この関数は、システムエンジニアを目指す初心者の方にもAES256-GCMによる対称鍵暗号化の基本的な流れを理解してもらうことを目的としています。
7 * SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES 定数を使って、安全なnonce(ノンス)を生成する方法を示します。
8 * Libsodium拡張機能が有効になっているPHP 8環境で実行可能です。
9 */
10function demonstrateAes256GcmEncryption(): void
11{
12    // PHPのLibsodium拡張機能が利用可能か確認
13    if (!extension_loaded('sodium')) {
14        echo "エラー: Libsodium拡張機能がインストールされていないか、有効になっていません。" . PHP_EOL;
15        echo "PHPの環境設定を確認してください。" . PHP_EOL;
16        return;
17    }
18
19    echo "--- AES256-GCM 暗号化・復号化デモンストレーション ---" . PHP_EOL;
20
21    // 1. 秘密鍵の生成
22    // AES256-GCM暗号化には、専用の秘密鍵が必要です。
23    // sodium_crypto_aead_aes256gcm_keygen() を使用して、暗号学的に安全な秘密鍵を生成します。
24    // この鍵は、暗号化と復号化の両方に使用されます。
25    $key = sodium_crypto_aead_aes256gcm_keygen();
26    echo "1. 秘密鍵を生成しました。" . PHP_EOL;
27
28    // 2. 平文(暗号化したいメッセージ)の準備
29    $plaintext = "これは非常に重要な秘密メッセージです。誰にも読まれないように暗号化します。";
30    echo "2. 元の平文: " . $plaintext . PHP_EOL;
31
32    // 3. 追加認証データ(オプション)の準備
33    // 追加認証データ (AD) は、暗号文自体には含まれませんが、復号時に提供されることで、
34    // メッセージの完全性と認証を強化するために使用されます。
35    // 例えば、送信者IDやタイムスタンプなど、暗号化されていないが検証したい情報を含めることができます。
36    $additionalData = "message_id:XYZ789, recipient:admin";
37    echo "3. 追加認証データ: " . $additionalData . PHP_EOL;
38
39    // 4. ノンス(Nonce)の生成
40    // ノンスは "number used once" の略で、暗号化ごとに異なるランダムな値である必要があります。
41    // 同じ鍵で同じノンスを2回使用すると、セキュリティ上の深刻な脆弱性が発生するため、
42    // 毎回新しい、予測不可能なノンスを生成することが非常に重要です。
43    // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES は、AES256-GCMで必要とされるノンスの正確なバイト数(PHP 8の場合12バイト)を示します。
44    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
45    echo "4. ノンスを生成しました (必要なバイト数: " . SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES . "バイト)" . PHP_EOL;
46
47    // 5. データの暗号化
48    // sodium_crypto_aead_aes256gcm_encrypt 関数を使用して、平文を暗号化します。
49    // 引数: 平文, 追加認証データ, ノンス, 秘密鍵
50    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
51        $plaintext,
52        $additionalData,
53        $nonce,
54        $key
55    );
56    echo "5. 暗号化が完了しました。" . PHP_EOL;
57    // 暗号文はバイナリデータなので、表示のためにBase64エンコードします。
58    echo "   暗号文 (Base64エンコード): " . base64_encode($ciphertext) . PHP_EOL;
59
60    // 6. データの復号化
61    // 暗号文を復号化するには、暗号化時と同じ秘密鍵、ノンス、および追加認証データが全て揃っている必要があります。
62    // 1つでも異なる場合、復号は失敗するか、不正なデータとして拒否されます。
63    // 復号が成功すると元の平文が返され、失敗した場合は false を返します。
64    $decryptedText = sodium_crypto_aead_aes256gcm_decrypt(
65        $ciphertext,
66        $additionalData,
67        $nonce,
68        $key
69    );
70
71    echo "6. 復号化を試行します..." . PHP_EOL;
72    if ($decryptedText === false) {
73        echo "   エラー: 復号に失敗しました。鍵、ノンス、または追加認証データが正しくない可能性があります。" . PHP_EOL;
74    } else {
75        echo "   復号が完了しました。" . PHP_EOL;
76        echo "   復号された平文: " . $decryptedText . PHP_EOL;
77
78        // 7. 結果の検証
79        if ($plaintext === $decryptedText) {
80            echo "7. 結果: 平文と復号されたテキストは完全に一致します。暗号化・復号化は成功しました。" . PHP_EOL;
81        } else {
82            echo "7. 結果: エラー!平文と復号されたテキストが一致しませんでした。" . PHP_EOL;
83        }
84    }
85    echo "---------------------------------------------------" . PHP_EOL;
86}
87
88// 関数を実行し、デモンストレーションを開始
89demonstrateAes256GcmEncryption();

このサンプルコードは、PHP 8でLibsodium拡張機能を用いてAES256-GCMアルゴリズムによるデータの暗号化と復号化を行う基本的な手順を示しています。システムエンジニアを目指す初心者の方向けに、暗号化の安全性確保に不可欠なノンス(Nonce)の生成方法と対称鍵暗号の仕組みを理解することを目的としています。

SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTESは、AES256-GCM暗号化で必要とされるノンスのバイト数を示す定数で、整数型(int)の値を返します。この定数を利用することで、常に適切な長さのノンスを確実に生成できます。ノンスは「number used once」の略であり、同じ秘密鍵で複数のデータを暗号化する際、毎回異なるランダムな値を使用しなければなりません。ノンスの再利用はセキュリティ上の深刻な脆弱性を引き起こすため、予測不可能な新しいノンスを生成することが非常に重要です。

コードではまず、sodium_crypto_aead_aes256gcm_keygen()で秘密鍵を生成し、次に暗号化する平文と、メッセージ認証を強化するための追加認証データを準備します。そして、random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES)で指定されたバイト数の安全なノンスを生成します。

データの暗号化はsodium_crypto_aead_aes256gcm_encrypt関数で行われます。この関数は平文、追加認証データ、ノンス、秘密鍵を引数に取り、暗号文を返します。復号化にはsodium_crypto_aead_aes256gcm_decrypt関数を使用し、暗号文、追加認証データ、ノンス、秘密鍵を引数として渡すことで、元の平文が戻り値として得られます。もし引数のいずれか一つでも異なる場合は復号が失敗し、falseが返されるため、データの完全性と認証性が保証されます。このコードは、セキュアなデータ処理の基礎を実践的に学ぶのに役立ちます。

このサンプルコードを利用する際は、PHPにLibsodium拡張機能がインストールされ、有効になっていることが必須です。暗号化に用いる秘密鍵は最も重要な情報ですので、厳重に管理し、決して漏洩させないよう細心の注意を払ってください。特にSODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTESが示すバイト数で生成するノンスは「一度きりの値」であり、同じ鍵で同じノンスの組み合わせを二度と使用してはいけません。ノンスを再利用すると暗号の安全性が著しく損なわれるため、毎回必ず新しい予測不可能な値を生成することが非常に重要です。また、復号化には暗号化時と全く同じ秘密鍵、ノンス、そして追加認証データが全て必要であり、一つでも異なると復号は失敗しますので、復号失敗時の適切なエラーハンドリングを行うことが求められます。

PHP Sodium AES256-GCMで暗号化・復号化する

1<?php
2
3/**
4 * libsodium拡張のAES256-GCMアルゴリズムを使用して、データの暗号化と復号化を行います。
5 * SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES 定数を使用し、Nonceの正しいバイト長を確保します。
6 *
7 * @return void
8 */
9function encryptAndDecryptAes256GcmExample(): void
10{
11    // libsodium拡張が利用可能かチェック
12    if (!extension_loaded('sodium')) {
13        echo "Error: The 'sodium' extension is not loaded. Please enable it in php.ini.\n";
14        return;
15    }
16
17    // 1. 暗号化に使用する秘密鍵を生成します。
18    // AES256-GCMの鍵は32バイト長です。
19    $key = sodium_crypto_aead_aes256gcm_keygen();
20    echo "Generated Key (hex): " . bin2hex($key) . "\n";
21
22    // 2. 暗号化する平文データを用意します。
23    $plaintext = 'これは秘密の情報であり、AES256-GCMで暗号化されます。';
24    echo "Original Plaintext: " . $plaintext . "\n";
25
26    // 3. ナンス(Nonce - Number used once)を生成します。
27    // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES は、AES256-GCMのNonceに必要なバイト長を示します。
28    // Nonceは、同じ鍵で同じ平文を暗号化する際にも毎回異なる値を使うことで、セキュリティを向上させます。
29    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
30    echo "Generated Nonce Length: " . strlen($nonce) . " bytes (expected: " . SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES . ")\n";
31    echo "Generated Nonce (hex): " . bin2hex($nonce) . "\n";
32
33    // 4. オプションで関連データ(Associated Data)を用意します。
34    // 関連データは暗号化されませんが、復号化時に改ざんされていないことを検証するために使用されます。
35    // 例えば、データが属するユーザーIDなどを設定できます。
36    $additionalData = 'ユーザーID: 12345';
37    echo "Additional Data: " . $additionalData . "\n";
38
39    // 5. データを暗号化します。
40    // sodium_crypto_aead_aes256gcm_encrypt 関数は、平文、Nonce、関連データ、鍵を引数にとり、暗号文を返します。
41    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt($plaintext, $additionalData, $nonce, $key);
42    echo "Ciphertext (hex): " . bin2hex($ciphertext) . "\n";
43
44    // 6. 暗号文を復号化します。
45    // sodium_crypto_aead_aes256gcm_decrypt 関数は、暗号文、関連データ、Nonce、鍵を引数にとり、平文を返します。
46    // 復号化に失敗した場合(例えば、暗号文や関連データが改ざんされていた場合)、falseを返します。
47    $decryptedPlaintext = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additionalData, $nonce, $key);
48
49    // 7. 復号化の結果を確認します。
50    if ($decryptedPlaintext === false) {
51        echo "Decryption failed! Data might have been tampered with or incorrect key/nonce was used.\n";
52    } else {
53        echo "Decrypted Plaintext: " . $decryptedPlaintext . "\n";
54        if ($decryptedPlaintext === $plaintext) {
55            echo "Decryption successful and matches original plaintext.\n";
56        } else {
57            echo "Decryption successful but plaintext does not match original (this should not happen normally).\n";
58        }
59    }
60}
61
62// サンプル関数を実行します
63encryptAndDecryptAes256GcmExample();

PHPのSODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES定数は、PHPのsodium拡張が提供する重要な定数の一つです。この定数は、AES256-GCMという強力な暗号化アルゴリズムにおいて、暗号化処理の安全性を確保するために必要となるNonce(ナンス:一度だけ使用される数値)の正確なバイト長を整数値で示します。Nonceは、同じ鍵で複数のデータを暗号化する際にも毎回異なる値を使うことで、セキュリティを向上させる役割があります。

このサンプルコードでは、SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES定数を用いて、random_bytes()関数でAES256-GCMアルゴリズムに適合する正しいバイト長のNonceを生成しています。そして、生成した秘密鍵、平文、Nonce、オプションの関連データを用いてsodium_crypto_aead_aes256gcm_encrypt()関数でデータを暗号化します。この関数は、これらの引数から暗号文を戻り値として返します。

次に、暗号化されたデータを復号化するためにsodium_crypto_aead_aes256gcm_decrypt()関数を使用します。この関数は、暗号文、元の関連データ、Nonce、秘密鍵を引数として受け取り、復号化に成功した場合は元の平文を、失敗した場合はfalseを戻り値として返します。このように、この定数はAES256-GCM暗号化において、正しいNonceの長さを保証し、安全なデータ保護を実現するために不可欠な要素です。

このコードは、libsodium拡張のAES256-GCMアルゴリズムを用いてデータを暗号化・復号化する例です。SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES定数は、暗号化に必要なNonce(ナンス)の正しいバイト長を示しています。Nonceは同じ鍵で暗号化する場合でも、毎回必ず異なる値をrandom_bytesなどで生成して使用してください。同じNonceを繰り返し使用すると、セキュリティが著しく低下しますので厳禁です。

また、sodium_crypto_aead_aes256gcm_keygenで生成した秘密鍵は、安全な場所に保管し、決して漏洩させないよう厳重に管理する必要があります。関連データ(Additional Data)は暗号化されませんが、復号時にデータが改ざんされていないか検証するために用いられます。暗号化時と復号時で常に同じ関連データを渡してください。

sodium_crypto_aead_aes256gcm_decryptfalseを返した場合、暗号文、鍵、Nonce、または関連データのいずれかが間違っているか、データが改ざんされた可能性がありますので、必ずエラー処理を実装してください。sodium拡張がPHPにロードされているかも事前に確認が必要です。

関連コンテンツ

関連IT用語

関連プログラミング言語