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

【PHP8.x】sodium_crypto_aead_aes256gcm_decrypt()関数の使い方

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

作成日: 更新日:

基本的な使い方

sodium_crypto_aead_aes256gcm_decrypt関数は、AES256-GCMという強力な暗号化アルゴリズムを使用して、暗号化されたデータを元の平文に復号する関数です。この関数は、PHPのSodium拡張機能の一部として提供されており、データの機密性だけでなく、改ざんされていないこと(完全性)も同時に検証できる認証付き暗号(AEAD)の機能を提供します。

システムにおいて、ユーザーの個人情報や機密性の高い通信内容などを安全に保護するためには、データの暗号化と復号が不可欠です。この関数は、すでにsodium_crypto_aead_aes256gcm_encrypt関数で暗号化されたデータを、正当な受信者が元の形に戻す際に利用されます。

復号を実行するには、暗号化されたデータ本体(ciphertext)、暗号化時に使用された再利用不可の短い値(nonce)、そして暗号化と復号に共通して使用される秘密の鍵(key)が必要です。また、暗号化時に認証済み追加データ(ad)が与えられていた場合は、復号時にも同じadを提供することで、そのデータも改ざんされていないかを確認できます。

これらの情報がすべて正しく一致し、データが改ざんされていないと確認できた場合、関数は復号された元の平文データを返します。もし、提供された情報が誤っている場合や、暗号化されたデータが途中で改ざんされていた場合は、データが安全でないと判断し、復号に失敗してfalseを返します。したがって、この関数を正しく利用することは、データのセキュリティを確保する上で非常に重要です。特にnonceの再利用は重大なセキュリティリスクを引き起こすため、細心の注意が必要です。

構文(syntax)

1<?php
2$decrypted_message = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);

引数(parameters)

string $ciphertext, string $additional_data, string $nonce, string $key

  • string $ciphertext: 複合化する暗号化されたデータ
  • string $additional_data: 認証に使用される追加データ(平文)
  • string $nonce: 暗号化に使用された一意の番号
  • string $key: 複合化に使用する秘密鍵

戻り値(return)

string|false

指定されたキー、nonce、および追加認証データを使用して、暗号化されたデータを復号化します。復号化が成功した場合は複合化された文字列を返し、失敗した場合は false を返します。

サンプルコード

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

1<?php
2
3// Check if the Sodium extension is loaded. This is crucial for cryptographic operations.
4if (!extension_loaded('sodium')) {
5    die("Error: The Sodium extension is not loaded. Please enable it in your php.ini configuration.\n");
6}
7
8/**
9 * Demonstrates the process of encrypting and decrypting a message using AES256-GCM
10 * with the PHP Sodium extension.
11 *
12 * This function generates a key, a nonce, encrypts a plaintext message with
13 * additional authenticated data, and then decrypts it, verifying the result.
14 */
15function encryptAndDecryptMessageAes256Gcm(): void
16{
17    // --- Setup for Encryption and Decryption ---
18
19    // 1. Generate a cryptographically secure random key for AES256-GCM.
20    // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES provides the correct key length (32 bytes for AES256).
21    $key = sodium_crypto_aead_aes256gcm_keygen();
22    echo "Generated Encryption Key (hex): " . bin2hex($key) . "\n\n";
23
24    // 2. Define the original message (plaintext) to be encrypted.
25    $originalMessage = "Hello, System Engineer! This is a secret test message.";
26    echo "Original Message: " . $originalMessage . "\n";
27
28    // 3. Define Additional Authenticated Data (AAD).
29    // This data is authenticated alongside the ciphertext but is NOT encrypted.
30    // It's used to bind the ciphertext to a specific context (e.g., user ID, file path).
31    // If this data is tampered with or incorrect during decryption, decryption will fail.
32    $additionalData = "document_id_12345_version_1.0";
33    echo "Additional Authenticated Data: " . $additionalData . "\n";
34
35    // 4. Generate a unique cryptographic nonce (Number Used Once).
36    // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES provides the correct nonce length (12 bytes).
37    // IT IS CRUCIAL that a nonce is NEVER reused with the same key for AES-GCM.
38    // Reusing a nonce compromises the security of the encryption.
39    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
40    echo "Generated Nonce (hex): " . bin2hex($nonce) . "\n\n";
41
42    // --- Encryption Process ---
43    echo "--- Encryption Started ---\n";
44
45    // 5. Encrypt the original message using AES256-GCM.
46    // Parameters: message, additional_data, nonce, key
47    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
48        $originalMessage,
49        $additionalData,
50        $nonce,
51        $key
52    );
53
54    if ($ciphertext === false) {
55        die("Error: Encryption failed!\n");
56    }
57
58    echo "Encrypted Ciphertext (hex): " . bin2hex($ciphertext) . "\n\n";
59
60    // --- Decryption Process ---
61    echo "--- Decryption Started ---\n";
62
63    // 6. Decrypt the ciphertext.
64    // The same additional data, nonce, and key used for encryption MUST be used for decryption.
65    // If any of these are incorrect, or if the ciphertext or additional data
66    // has been tampered with, the function will return `false`.
67    // Parameters: ciphertext, additional_data, nonce, key
68    $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt(
69        $ciphertext,
70        $additionalData,
71        $nonce,
72        $key
73    );
74
75    if ($decryptedMessage === false) {
76        echo "Decryption failed! This could be due to incorrect key, nonce, additional data, or tampering.\n";
77    } else {
78        echo "Decrypted Message: " . $decryptedMessage . "\n";
79
80        // 7. Verify that the decrypted message matches the original.
81        if ($decryptedMessage === $originalMessage) {
82            echo "Verification: Decryption successful! The original message was recovered.\n";
83        } else {
84            echo "Verification: Decryption produced a message, but it does NOT match the original. (This indicates an issue).\n";
85        }
86    }
87    echo "--- Decryption Finished ---\n";
88}
89
90// Execute the demonstration function.
91encryptAndDecryptMessageAes256Gcm();

sodium_crypto_aead_aes256gcm_decrypt関数は、PHPのSodium拡張機能が提供する、AES256-GCMアルゴリズムで暗号化されたデータを安全に復号するための関数です。この関数は、メッセージの機密性(内容が漏れないこと)、認証性(送り主が正しいこと)、完全性(内容が改ざんされていないこと)を同時に保証します。

引数には、暗号化されたデータである$ciphertext、暗号化時に指定した追加認証データ$additional_data、一度だけ使用されるランダムな値である$nonce、そして暗号化に用いた秘密鍵$keyを渡します。これらの引数はすべて、暗号化時と同じ値であることが不可欠です。

復号に成功すると、元の平文データが文字列として返されます。しかし、渡された$ciphertext$additional_data$nonce$keyのいずれかが誤っている場合や、データが改ざんされていた場合には、セキュリティ上の理由からfalseが返され、復号は失敗します。特に$nonceは、同じ鍵で二度と使用してはいけない「使い捨ての番号」であり、その再利用は暗号の安全性を著しく損なうため、厳重な管理が必要です。

サンプルコードでは、sodium_crypto_aead_aes256gcm_encryptで暗号化した後、その$ciphertext$additional_data$nonce$keyを正確にsodium_crypto_aead_aes256gcm_decryptに渡して復号し、元のメッセージが安全に取得できることを示しています。復号が成功したかどうかの確認も重要で、falseが返された場合は、エラー処理を行う必要があります。

このコードは、PHPのSodium拡張機能を用いたAES256-GCM暗号化・復号のデモンストレーションです。まず、利用にはSodium拡張機能が有効になっているか必ず確認してください。最も重要な注意点は、暗号化に使う鍵とノンce(nonce)の管理です。鍵は絶対に漏洩させないよう厳重に保管し、ノンceはセキュリティを維持するため、同じ鍵で二度と使用してはいけません。また、暗号化時と復号時では、鍵、ノンce、追加認証データのすべてが完全に一致している必要があります。一つでも異なると復号は失敗し、関数はfalseを返します。これはデータが改ざんされた可能性も示唆するため、必ず戻り値を確認し、適切にエラーを処理するようにしてください。

sodium_crypto_aead_aes256gcm_decryptで復号する

1<?php
2
3/**
4 * sodium_crypto_aead_aes256gcm_decrypt 関数の使用例を示します。
5 *
6 * この関数は、AES256-GCM暗号化(Authenticated Encryption with Associated Data)の
7 * 復号処理を初心者向けに簡潔に示します。
8 * 暗号化されていないと復号はできないため、まず暗号化のステップを含んでいます。
9 *
10 * 手順:
11 * 1. AES256-GCM用の新しい鍵を生成します。
12 * 2. 平文メッセージと関連データを定義します。
13 * 3. 一意のノンス(Number Used Once)を生成します。
14 * 4. 平文を暗号化します。
15 * 5. 暗号文、関連データ、ノンス、鍵を使用して復号します。
16 * 6. 復号の結果を出力し、元の平文と一致するか検証します。
17 *
18 * 実行にはPHPのSodium拡張機能が有効になっている必要があります。
19 */
20function demonstrateAes256GcmDecryption(): void
21{
22    // Sodium拡張機能がロードされているか確認
23    if (!extension_loaded('sodium')) {
24        echo "エラー: 'sodium' 拡張機能がロードされていません。php.ini で有効にしてください。\n";
25        return;
26    }
27
28    echo "--- AES256-GCM 暗号化と復号のデモンストレーション ---\n\n";
29
30    // 1. 暗号化用の鍵を生成
31    // SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES はAES256GCMの鍵長(32バイト)を定義します。
32    $key = sodium_crypto_aead_aes256gcm_keygen();
33    echo "生成された鍵 (hex): " . bin2hex($key) . "\n\n";
34
35    // 2. 暗号化する平文メッセージと関連データを定義
36    $plaintext = "これは、暗号化されるべき秘密のメッセージです。";
37    // 関連データは暗号化されませんが、認証(改ざん検知)の対象となります。
38    $additionalData = "これは認証されるが暗号化されない追加情報です。";
39
40    echo "元の平文: " . $plaintext . "\n";
41    echo "関連データ: " . $additionalData . "\n\n";
42
43    // 3. 一意のノンス(Number Used Once)を生成
44    // SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES はAES256GCMのノンス長(12バイト)を定義します。
45    // 同じ鍵で暗号化するすべてのメッセージに対して、ノンスは必ず一意である必要があります。
46    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
47    echo "生成されたノンス (hex): " . bin2hex($nonce) . "\n\n";
48
49    // 4. 平文を暗号化
50    // sodium_crypto_aead_aes256gcm_encrypt は、認証タグが追加された暗号文を返します。
51    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
52        $plaintext,
53        $additionalData,
54        $nonce,
55        $key
56    );
57
58    if ($ciphertext === false) {
59        echo "エラー: 暗号化に失敗しました。\n";
60        return;
61    }
62
63    echo "暗号化された暗号文 (hex): " . bin2hex($ciphertext) . "\n\n";
64
65    // 5. 暗号文を復号
66    // 復号には、暗号化時と全く同じ鍵、ノンス、関連データを使用する必要があります。
67    // これらが一つでも異なると、復号は失敗し、falseを返します(認証エラー)。
68    $decryptedMessage = sodium_crypto_aead_aes256gcm_decrypt(
69        $ciphertext,
70        $additionalData, // 暗号化時と同じ関連データ
71        $nonce,          // 暗号化時と同じノンス
72        $key             // 暗号化時と同じ鍵
73    );
74
75    // 6. 復号の結果を確認
76    if ($decryptedMessage === false) {
77        echo "復号に失敗しました!\n";
78        echo "データが改ざんされたか、または鍵/ノンス/関連データのいずれかが間違っている可能性があります。\n";
79    } else {
80        echo "復号に成功しました!\n";
81        echo "復号されたメッセージ: " . $decryptedMessage . "\n";
82
83        // 復号されたメッセージが元の平文と一致するか検証
84        if ($decryptedMessage === $plaintext) {
85            echo "検証: 復号されたメッセージは元の平文と一致します。\n";
86        } else {
87            echo "検証: 復号されたメッセージが元の平文と一致しません。これは、正しい復号では発生しないはずです。\n";
88        }
89    }
90}
91
92// デモンストレーション関数を実行
93demonstrateAes256GcmDecryption();
94
95?>

sodium_crypto_aead_aes256gcm_decrypt関数は、PHPのSodium拡張機能を利用し、AES256-GCM方式で暗号化されたデータを復号する際に使用されます。この関数は「認証付き暗号」として機能し、データの機密性(内容が漏れないこと)を解除するだけでなく、そのデータが改ざんされていないか、正当な情報であるかを同時に検証します。

復号には、暗号文である$ciphertext、認証に使用された付加情報$additional_data、暗号化時に使われた一意のノンス$nonce、そして暗号化に用いた秘密鍵$keyの四つの引数が必要です。これらの値は全て、暗号化時と寸分違わず同じである必要があります。もし一つでも異なると、正しく復号できません。

処理が成功すると、関数は復号された平文を文字列で返します。一方、暗号文や認証情報に不整合があったり、鍵やノンスが一致しなかったりすると、認証に失敗してfalseを返します。このfalseの戻り値はセキュリティ上の異常を示唆するため、システムエンジニアは必ずこれを適切に処理し、データ保護の安全性を確保すべきです。

sodium_crypto_aead_aes256gcm_decrypt関数は、AES256-GCM暗号方式で暗号化されたデータを復号するために利用します。この関数を使うには、PHPのSodium拡張機能が有効になっている必要があります。復号時には、暗号化に使用した鍵、ノンス(Nonce)、関連データの全てが完全に一致していることが重要です。特に、ノンスは同じ鍵で暗号化する全てのメッセージに対して、必ず一意なものを使用しなければなりません。ノンスの再利用は重大なセキュリティ上の脆弱性につながるため、絶対に行ってはいけません。復号に失敗した場合、この関数はfalseを返しますので、必ず戻り値をチェックし、データが改ざんされていないか、またはパラメータが正しいかを確認してください。鍵は秘密裏に安全に管理することが必須です。

関連コンテンツ

関連IT用語

関連プログラミング言語