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

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

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

作成日: 更新日:

基本的な使い方

SODIUM_CRYPTO_BOX_MACBYTES定数は、PHPのSodium拡張機能が提供する crypto_box 関数群において、メッセージ認証コード(MAC)のバイトサイズを表す定数です。この定数は、crypto_box を用いた認証付き暗号化処理によって生成される、メッセージの完全性と認証を保証するための追加データ(MAC)が、具体的に何バイトであるかを示します。

crypto_box 関数群は、公開鍵暗号方式を利用して、安全にデータを暗号化し、かつそのデータが通信中に改ざんされていないことを検証するための仕組みを提供します。このプロセスにおいて、暗号化されたデータと一緒に付加されるメッセージ認証コードは、受信側がデータの正当性を確認するために不可欠です。

開発者が crypto_box 関連の機能を実装する際、このSODIUM_CRYPTO_BOX_MACBYTES定数を利用することで、メッセージ認証コードに必要な正確なメモリ領域を確保したり、暗号化されたメッセージの正確なデータ構造を解析したりすることが可能になります。これにより、安全かつ堅牢な暗号化処理を、定数によって定義された正しいサイズに基づいて実装できるようになります。この値は、Sodiumライブラリの内部仕様に厳密に基づいて定められており、暗号システムの安全性と互換性を保つ上で重要な役割を果たします。

構文(syntax)

1<?php
2echo SODIUM_CRYPTO_BOX_MACBYTES;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

SODIUM_CRYPTO_BOX_MACBYTES は、暗号化されたボックスメッセージの認証タグ(MAC)のバイト数を表す整数定数です。

サンプルコード

PHP Sodium: crypto_box で暗号化・復号化する

1<?php
2
3/**
4 * PHP Sodium拡張を用いた公開鍵暗号(crypto_box)の基本的なデモンストレーションです。
5 * SODIUM_CRYPTO_BOX_MACBYTES定数の意味についても説明します。
6 *
7 * システムエンジニアを目指す初心者向けに、暗号化と復号化の流れを簡潔に示します。
8 *
9 * @param string $message 暗号化する平文メッセージ
10 */
11function demonstrateSodiumCryptoBox(string $message): void
12{
13    // Sodium拡張がロードされているか確認します。
14    if (!extension_loaded('sodium')) {
15        echo "エラー: PHP Sodium拡張がロードされていません。";
16        echo "PHPを --with-sodium オプション付きでコンパイルするか、ext-sodiumをインストールしてください。\n";
17        return;
18    }
19
20    echo "--- PHP Sodium Crypto Box デモンストレーション ---\n\n";
21
22    // SODIUM_CRYPTO_BOX_MACBYTES 定数の値を出力します。
23    // この定数は、`sodium_crypto_box` 関数によって生成される暗号文に付加される
24    // 認証タグ(MAC: Message Authentication Code)のバイト数を示します。
25    // 暗号文は、元のメッセージにこのMACバイト数が追加されたものになります。
26    echo "SODIUM_CRYPTO_BOX_MACBYTES: " . SODIUM_CRYPTO_BOX_MACBYTES . " バイト\n\n";
27
28    // 1. 送信者(アリス)と受信者(ボブ)それぞれの鍵ペアを生成します。
29    // 各鍵ペアは、秘密鍵と公開鍵を含みます。
30    $aliceKeypair = sodium_crypto_box_keypair();
31    $aliceSecretKey = sodium_crypto_box_secretkey($aliceKeypair);
32    $alicePublicKey = sodium_crypto_box_publickey($aliceKeypair);
33
34    $bobKeypair = sodium_crypto_box_keypair();
35    $bobSecretKey = sodium_crypto_box_secretkey($bobKeypair);
36    $bobPublicKey = sodium_crypto_box_publickey($bobKeypair);
37
38    echo "アリスとボブの鍵ペアを生成しました。\n\n";
39
40    // 2. ノンス(Nonce)を生成します。
41    // ノンスは "number used once" の略で、各暗号化操作で一度だけ使用される一意の値です。
42    // 同じ鍵とノンスの組み合わせで2度暗号化してはいけません。
43    $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
44    echo "ノンスを生成しました (サイズ: " . SODIUM_CRYPTO_BOX_NONCEBYTES . " バイト)。\n\n";
45
46    // 3. アリスがボブにメッセージを暗号化して送信します。
47    // アリスの秘密鍵とボブの公開鍵を使ってメッセージを暗号化します。
48    // `sodium_crypto_box_keypair_from_secretkey_and_publickey` は、
49    // 送信者の秘密鍵と受信者の公開鍵から、一時的な共有鍵を生成します。
50    $encryptedMessage = sodium_crypto_box(
51        $message,
52        $nonce,
53        sodium_crypto_box_keypair_from_secretkey_and_publickey($aliceSecretKey, $bobPublicKey)
54    );
55
56    echo "元のメッセージ: '" . $message . "' (長さ: " . strlen($message) . " バイト)\n";
57    echo "暗号化済みメッセージの長さ: " . strlen($encryptedMessage) . " バイト\n";
58    echo "  (内訳: 元のメッセージ " . strlen($message) . " バイト + MAC " . SODIUM_CRYPTO_BOX_MACBYTES . " バイト)\n\n";
59
60    // 4. ボブがアリスからのメッセージを復号化します。
61    // ボブの秘密鍵とアリスの公開鍵、そして暗号化時に使用したノンスを使って復号化します。
62    // 復号化に失敗した場合(例: メッセージが改ざんされた場合)、`false` を返します。
63    $decryptedMessage = sodium_crypto_box_open(
64        $encryptedMessage,
65        $nonce,
66        sodium_crypto_box_keypair_from_secretkey_and_publickey($bobSecretKey, $alicePublicKey)
67    );
68
69    if ($decryptedMessage === false) {
70        echo "メッセージの復号化に失敗しました。メッセージが改ざんされたか、鍵またはノンスが誤っています。\n";
71    } else {
72        echo "復号化されたメッセージ: '" . $decryptedMessage . "'\n";
73        echo "元のメッセージと復号化されたメッセージは一致します: " . ($decryptedMessage === $message ? "はい" : "いいえ") . "\n";
74    }
75
76    echo "\n--- デモンストレーション終了 ---\n";
77}
78
79// デモンストレーション用のメッセージ
80$sampleMessage = "こんにちは、PHP Sodiumは安全な暗号化機能を提供します。";
81
82// 関数を実行してデモンストレーションを開始
83demonstrateSodiumCryptoBox($sampleMessage);

PHP Sodium拡張は、安全な暗号化機能を提供する「libsodium」ライブラリをPHPで利用可能にするものです。このサンプルコードは、PHP 8のSodium拡張を用いた公開鍵暗号(crypto_box)の基本的な利用方法を、システムエンジニアを目指す初心者向けに分かりやすく解説しています。

コードの中心となる定数SODIUM_CRYPTO_BOX_MACBYTESは、sodium_crypto_box関数によって生成される暗号文に付加される認証タグ(MAC: Message Authentication Code)のバイト数を示します。この定数は引数を取らず、整数値(int)を返します。暗号文の最終的なサイズは、元のメッセージのバイト数にこのSODIUM_CRYPTO_BOX_MACBYTESの値を加えたものになります。この認証タグは、メッセージが途中で改ざんされていないか、また正当な送信者によって送信されたかを検証するために非常に重要です。

サンプルコードでは、まず送信者と受信者の鍵ペアをそれぞれ生成し、次に各暗号化操作で一度だけ使用される一意のノンスを準備します。そして、送信者の秘密鍵と受信者の公開鍵を用いてメッセージを暗号化し、その暗号文の長さがSODIUM_CRYPTO_BOX_MACBYTES分増加していることを示します。最後に、受信者が自身の秘密鍵と送信者の公開鍵、使用したノンスを用いて暗号文を正しく復号化できることをデモンストレーションしています。これにより、SODIUM_CRYPTO_BOX_MACBYTESが暗号化プロセスにおけるメッセージの完全性と認証にどのように貢献するかを具体的に理解できます。

PHP Sodium拡張を利用する際は、まず拡張が正しくロードされていることを確認してください。SODIUM_CRYPTO_BOX_MACBYTES定数は、暗号文に付加される認証タグ(MAC)のサイズを示します。このMACはメッセージの改ざんを検知するために不可欠であり、暗号化されたメッセージの長さは「元のメッセージ長にMACバイト数」を加えたものになることを理解してください。

最も重要な注意点として、ノンス(Nonce)は各暗号化操作で必ず一度だけ使用し、決して使い回してはいけません。同じ鍵ペアとノンスの組み合わせを再利用すると、セキュリティ上の深刻な脆弱性を引き起こす可能性があります。また、生成される秘密鍵は厳重に管理し、外部に漏洩させないよう細心の注意を払う必要があります。sodium_crypto_box_open関数がfalseを返した場合、メッセージが改ざんされたか、鍵またはノンスが誤っていることを意味するため、適切なエラーハンドリングを行うようにしてください。

PHP Sodium crypto_box の使い方

1<?php
2
3/**
4 * SODIUM_CRYPTO_BOX_MACBYTES 定数と
5 * PHP Sodium拡張機能のcrypto_box関数の基本的な使い方を示すサンプル。
6 *
7 * この関数は、システムエンジニアを目指す初心者向けに、
8 * 公開鍵暗号(非対称暗号)によるメッセージの暗号化と復号化のプロセスを簡潔に示します。
9 * SODIUM_CRYPTO_BOX_MACBYTES は、メッセージ認証コード (MAC) のバイト数を示し、
10 * 暗号化されたデータの全体サイズに影響します。
11 *
12 * @return void
13 */
14function demonstrateSodiumCryptoBoxUsage(): void
15{
16    echo "--- PHP Sodium crypto_box の使い方デモンストレーション ---\n\n";
17
18    // SODIUM_CRYPTO_BOX_MACBYTES 定数の値を出力します。
19    // これは、crypto_box 関数によって生成されるメッセージ認証コード (MAC) のバイト数を示します。
20    // MACはメッセージの改ざんを検出するために使用される重要なセキュリティ要素です。
21    echo "SODIUM_CRYPTO_BOX_MACBYTES: " . SODIUM_CRYPTO_BOX_MACBYTES . " バイト\n";
22    echo "これは、暗号化データに追加されるメッセージ認証コードのサイズです。\n\n";
23
24    // 1. 鍵ペアの生成
25    // 送信者(アリス)と受信者(ボブ)それぞれが秘密鍵と公開鍵のペアを生成します。
26    // 秘密鍵は厳重に保管し、誰にも知られてはいけません。公開鍵は共有しても安全です。
27    $aliceKeyPair = sodium_crypto_box_keypair(); // 送信者 (アリス) の鍵ペア
28    $bobKeyPair = sodium_crypto_box_keypair();   // 受信者 (ボブ) の鍵ペア
29
30    // 各鍵ペアから秘密鍵と公開鍵を抽出します。
31    $aliceSecretKey = sodium_crypto_box_secretkey($aliceKeyPair);
32    $alicePublicKey = sodium_crypto_box_publickey($aliceKeyPair);
33
34    $bobSecretKey = sodium_crypto_box_secretkey($bobKeyPair);
35    $bobPublicKey = sodium_crypto_box_publickey($bobKeyPair);
36
37    echo "鍵ペアが生成されました。\n";
38    echo "  アリスの公開鍵 (一部): " . substr(bin2hex($alicePublicKey), 0, 16) . "...\n";
39    echo "  ボブの公開鍵 (一部): " . substr(bin2hex($bobPublicKey), 0, 16) . "...\n\n";
40
41    // 2. 暗号化する元のメッセージ
42    $originalMessage = "こんにちは、これは秘密のメッセージです!";
43    echo "元のメッセージ: \"" . $originalMessage . "\"\n\n";
44
45    // 3. ナンス (Nonce) の生成
46    // ナンスは、同じ鍵ペアで複数回暗号化を行う際に、毎回異なる値を使用する必要があります。
47    // これは、セキュリティを確保するために非常に重要です。
48    $nonce = sodium_crypto_box_nonce_gen();
49    echo "ナンスが生成されました。\n";
50    echo "  ナンス (一部): " . substr(bin2hex($nonce), 0, 16) . "...\n\n";
51
52    // 4. メッセージの暗号化 (アリスがボブへメッセージを送る場合)
53    // アリスは自分の秘密鍵とボブの公開鍵を使ってメッセージを暗号化します。
54    // ナンスも暗号化の入力として使われますが、暗号文の一部ではありません。
55    // 暗号文と一緒に受信者に送る必要があります。
56    $encryptedMessage = sodium_crypto_box(
57        $originalMessage,  // 暗号化したいメッセージ
58        $nonce,            // ナンス
59        $bobPublicKey,     // 受信者(ボブ)の公開鍵
60        $aliceSecretKey    // 送信者(アリス)の秘密鍵
61    );
62    echo "メッセージが暗号化されました。\n";
63    echo "  暗号化されたメッセージの長さ: " . strlen($encryptedMessage) . " バイト\n";
64    echo "  (この長さは、元のメッセージの長さ (" . strlen($originalMessage) . " バイト) に\n";
65    echo "  MACの長さ (" . SODIUM_CRYPTO_BOX_MACBYTES . " バイト) を加えたものです。)\n";
66    echo "  暗号文 (一部): " . substr(bin2hex($encryptedMessage), 0, 32) . "...\n\n";
67
68    // 5. メッセージの復号化 (ボブがアリスからのメッセージを受け取る場合)
69    // ボブは自分の秘密鍵とアリスの公開鍵、そして受信したナンスを使ってメッセージを復号化します。
70    $decryptedMessage = sodium_crypto_box_open(
71        $encryptedMessage, // 受信した暗号文
72        $nonce,            // 受信したナンス
73        $alicePublicKey,   // 送信者(アリス)の公開鍵
74        $bobSecretKey      // 受信者(ボブ)の秘密鍵
75    );
76
77    if ($decryptedMessage === false) {
78        // 復号化に失敗した場合、メッセージが改ざんされたか、鍵やナンスが正しくない可能性があります。
79        echo "エラー: メッセージの復号化に失敗しました。\n";
80    } else {
81        echo "メッセージが復号化されました。\n";
82        echo "復号化されたメッセージ: \"" . $decryptedMessage . "\"\n\n";
83
84        // 元のメッセージと復号化されたメッセージが一致するか確認します。
85        if ($originalMessage === $decryptedMessage) {
86            echo "--- 成功: 元のメッセージと復号化されたメッセージが一致しました。---\n";
87        } else {
88            echo "--- 失敗: 元のメッセージと復号化されたメッセージが一致しませんでした。---\n";
89        }
90    }
91}
92
93// 上記で定義した関数を実行し、デモンストレーションを開始します。
94demonstrateSodiumCryptoBoxUsage();

このPHPサンプルコードは、Sodium拡張機能を用いた公開鍵暗号(非対称暗号)によるメッセージの暗号化と復号化のプロセスを示しています。まず、SODIUM_CRYPTO_BOX_MACBYTES定数は、暗号化されたメッセージに付加されるメッセージ認証コード(MAC)のバイト数を表す整数値です。MACはメッセージが改ざんされていないことを検証するために不可欠なセキュリティ要素であり、この定数の値は暗号文の全体サイズに影響します。

コードでは、まず送信者と受信者のそれぞれが秘密鍵と公開鍵のペアを生成します。その後、一意の使い捨て番号であるナンスを生成し、これを暗号化と復号化の両方に利用します。メッセージの暗号化にはsodium_crypto_box関数を使用します。この関数は、元のメッセージ、ナンス、受信者の公開鍵、送信者の秘密鍵を引数に取り、MACが付加された暗号文(文字列)を返します。暗号文の長さは、元のメッセージの長さにSODIUM_CRYPTO_BOX_MACBYTESの値を加えたものとなります。

復号化にはsodium_crypto_box_open関数を用います。この関数は、暗号文、ナンス、送信者の公開鍵、受信者の秘密鍵を引数として受け取ります。復号に成功した場合、元のメッセージ(文字列)を返し、メッセージが改ざんされたり鍵やナンスが誤っている場合はfalseを返します。ナンスは毎回異なる値を用いる必要があり、セキュリティ確保に非常に重要です。この一連の処理を通じて、安全なメッセージの送受信が実現されます。

PHPのSodium拡張機能を利用する際は、秘密鍵の厳重な管理が最も重要です。秘密鍵が漏洩すると暗号化された情報がすべて解読されてしまいますので、絶対に外部に公開しないでください。また、暗号化時に使用するナンスは、同じ鍵ペアであっても毎回異なる値を生成し、使い回さないでください。同じナンスの再利用は重大なセキュリティ脆弱性につながります。SODIUM_CRYPTO_BOX_MACBYTESはメッセージ認証コードのバイト数を示し、暗号文の長さは元のメッセージにこのMACのバイト数が加算されることを理解してください。sodium_crypto_box_open関数がfalseを返した場合は、メッセージの改ざんや鍵、ナンスの不一致が考えられますので、必ず戻り値を確認し適切にエラー処理を行う必要があります。これらの注意点を守り、安全に暗号通信を実装してください。

関連コンテンツ

関連IT用語

関連プログラミング言語