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

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

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

作成日: 更新日:

基本的な使い方

SODIUM_CRYPTO_SIGN_KEYPAIRBYTES定数は、PHPのSodium拡張機能が提供するデジタル署名において、鍵ペア(公開鍵と秘密鍵の組み合わせ)の合計バイト数を表す定数です。

デジタル署名とは、メッセージの送信元が正当であることを証明し、そのメッセージが改ざんされていないことを保証するための暗号技術です。この技術では、署名を作成するための「秘密鍵」と、署名を検証するための「公開鍵」という一対の鍵が使われます。

SODIUM_CRYPTO_SIGN_KEYPAIRBYTES定数の値は、この秘密鍵と公開鍵を合わせてどれくらいのデータサイズ(バイト数)になるかを示しており、鍵ペアを格納するためのメモリサイズやデータ構造を決定する際に利用されます。開発者はこの定数を使用することで、署名アルゴリズムに依存しない形で、安全かつ正確に鍵のサイズを扱うことができ、堅牢なセキュリティ機能の実装を支援します。例えば、鍵ペアを生成する際に適切なバッファサイズを確保する用途などに活用されます。

構文(syntax)

1<?php
2echo SODIUM_CRYPTO_SIGN_KEYPAIRBYTES;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

この定数は、暗号署名アルゴリズムで使用される公開鍵と秘密鍵のペアの合計バイト数を表す整数値です。

サンプルコード

SODIUM_CRYPTO_SIGN_KEYPAIRBYTES でキーペア長さを確認する

1<?php
2
3/**
4 * SODIUM_CRYPTO_SIGN_KEYPAIRBYTES 定数の使用例と、
5 * sodium_crypto_sign_keypair() 関数で生成されるキーペアの長さを確認するスクリプトです。
6 *
7 * このスクリプトを実行するには、PHPにSodium拡張がインストールされ、有効になっている必要があります。
8 */
9
10// SODIUM_CRYPTO_SIGN_KEYPAIRBYTES 定数の値を取得し、出力します。
11// この定数は、暗号署名のために使用されるキーペア(公開鍵と秘密鍵を含む)のバイト数を示します。
12echo "SODIUM_CRYPTO_SIGN_KEYPAIRBYTES の値: " . SODIUM_CRYPTO_SIGN_KEYPAIRBYTES . " バイト" . PHP_EOL;
13
14// sodium_crypto_sign_keypair() 関数を使用して、新しい署名キーペアを生成します。
15// この関数は、公開鍵と秘密鍵が連結されたバイナリ文字列を返します。
16$keypair = sodium_crypto_sign_keypair();
17
18// 生成されたキーペアの実際のバイト数を確認します。
19// strlen() 関数はバイナリセーフであり、バイト数を正確にカウントします。
20$keypairLength = strlen($keypair);
21echo "生成されたキーペアの実際の長さ: " . $keypairLength . " バイト" . PHP_EOL;
22
23// 生成されたキーペアの長さが、定義された定数の値と一致するかを確認します。
24if ($keypairLength === SODIUM_CRYPTO_SIGN_KEYPAIRBYTES) {
25    echo "確認: 生成されたキーペアの長さは、定数 SODIUM_CRYPTO_SIGN_KEYPAIRBYTES の値と一致します。" . PHP_EOL;
26} else {
27    echo "警告: 生成されたキーペアの長さが、定数 SODIUM_CRYPTO_SIGN_KEYPAIRBYTES の値と一致しません。" . PHP_EOL;
28}
29
30// 注意: $keypair 変数には機密情報(秘密鍵)が含まれています。
31// 実際のアプリケーションでは、この情報を安全に扱い、決してそのまま表示したり、不安全な場所に保存したりしないでください。
32// ここでは、その内容ではなく長さのみを確認するに留めます。
33
34?>

このPHPコードは、Sodium拡張を用いた暗号署名のキーペア(公開鍵と秘密鍵のセット)の基本的な取り扱いを示しています。

SODIUM_CRYPTO_SIGN_KEYPAIRBYTESは、暗号署名に必要なキーペアの標準バイト数を表す定数で、引数はなく整数値(int)を返します。

コードではまずこの定数の値を出力し、次にsodium_crypto_sign_keypair()関数で新しいキーペアを生成しています。この関数も引数は不要で、生成されたバイナリ形式のキーペア文字列を返します。その後、strlen()関数でキーペアの実際の長さを測定し、それがSODIUM_CRYPTO_SIGN_KEYPAIRBYTES定数の値と一致するかを検証しています。

この検証により、Sodium拡張が期待通りに標準的な長さのキーペアを生成していることを確認できます。キーペアには秘密鍵という機密情報が含まれるため、実際のアプリケーションで扱う際は厳重なセキュリティ対策を講じる必要があります。

このサンプルコードを実行するには、PHPにSodium拡張のインストールと有効化が必須です。SODIUM_CRYPTO_SIGN_KEYPAIRBYTES定数は、暗号署名に使うキーペアの合計バイト数を示し、sodium_crypto_sign_keypair()関数はこのバイト数の公開鍵と秘密鍵が連結されたバイナリ文字列を生成します。最も重要な注意点は、生成されるキーペアには秘密鍵が含まれるため、極めて機密性が高い情報であることです。実際のシステムでは、このキーペアを画面に直接表示したり、安全でない場所に保存したりすることは絶対に避けてください。不正アクセスや情報漏洩を防ぐため、厳重な管理が必要です。strlen()関数はバイナリデータの長さを正確に取得できるため、キーペアの長さを確認する際に適切です。

PHP Sodium拡張:安全なメッセージ交換を学ぶ

1<?php
2
3/**
4 * Libsodium (Sodium拡張) の定数と基本的な暗号化・復号化の例を示します。
5 * システムエンジニアを目指す初心者向けに、SODIUM_CRYPTO_SIGN_KEYPAIRBYTES 定数の意味と、
6 * sodium_crypto_box を使った安全なメッセージ交換の基本を解説します。
7 */
8function demonstrateSodiumConstantsAndCryptoBox(): void
9{
10    echo "--- Libsodium 定数情報 ---\n";
11
12    // SODIUM_CRYPTO_SIGN_KEYPAIRBYTES:
13    // この定数は、PHPのSodium拡張が提供する署名機能 (crypto_sign) で使用される
14    // キーペア(公開鍵と秘密鍵を合わせたもの)のバイト数を示します。
15    // PHP 8 では Ed25519 署名アルゴリズムに基づいています。
16    $signKeypairBytes = SODIUM_CRYPTO_SIGN_KEYPAIRBYTES;
17    echo "署名キーペアのバイト数 (SODIUM_CRYPTO_SIGN_KEYPAIRBYTES): " . $signKeypairBytes . "バイト\n";
18
19    // 実際の署名キーペアを生成し、その長さを確認することで、定数の意味を具体的に示します。
20    // sodium_crypto_sign_keypair() は、この定数で定義されたバイト数のキーペアを生成します。
21    $signKeypair = sodium_crypto_sign_keypair();
22    echo "生成された署名キーペアの実際の長さ: " . strlen($signKeypair) . "バイト\n";
23    if (strlen($signKeypair) === $signKeypairBytes) {
24        echo " -> 定数値と一致します。この長さが署名キーペアの標準サイズです。\n\n";
25    } else {
26        echo " -> 定数値と一致しません。(予期せぬエラー)\n\n";
27    }
28
29    // SODIUM_CRYPTO_BOX_KEYPAIRBYTES:
30    // これは、メッセージの暗号化機能 (crypto_box) で使用されるキーペアのバイト数を示します。
31    // crypto_box は Curve25519 Diffie-Hellman 鍵交換と ChaCha20-Poly1305 認証付き暗号を使用します。
32    $boxKeypairBytes = SODIUM_CRYPTO_BOX_KEYPAIRBYTES;
33    echo "暗号化キーペアのバイト数 (SODIUM_CRYPTO_BOX_KEYPAIRBYTES): " . $boxKeypairBytes . "バイト\n";
34    echo "※署名キーペアと暗号化キーペアは異なる目的とサイズを持つことに注意してください。\n\n";
35
36    // --- sodium_crypto_box を使ったメッセージの暗号化と復号化 ---
37    echo "--- sodium_crypto_box を用いた安全なメッセージ交換の例 ---\n";
38
39    // 通信を行う二者(Alice と Bob)それぞれにキーペアを生成します。
40    // sodium_crypto_box_keypair() は SODIUM_CRYPTO_BOX_KEYPAIRBYTES の長さのキーペアを生成します。
41    $aliceKeypair = sodium_crypto_box_keypair();
42    $bobKeypair = sodium_crypto_box_keypair();
43
44    // 各キーペアから、公開鍵と秘密鍵を抽出します。
45    // 公開鍵は安全でないチャネルで交換できますが、秘密鍵は決して共有してはいけません。
46    $alicePublicKey = sodium_crypto_box_publickey($aliceKeypair);
47    $aliceSecretKey = sodium_crypto_box_secretkey($aliceKeypair);
48    $bobPublicKey = sodium_crypto_box_publickey($bobKeypair);
49    $bobSecretKey = sodium_crypto_box_secretkey($bobKeypair);
50
51    echo "Aliceの公開鍵の長さ: " . strlen($alicePublicKey) . "バイト\n";
52    echo "Bobの公開鍵の長さ: " . strlen($bobPublicKey) . "バイト\n\n";
53
54    // 送信したい平文メッセージ
55    $message = "こんにちは、これは秘密のメッセージです!PHPのSodium拡張はすごいですね。";
56    echo "元のメッセージ: '" . $message . "'\n";
57
58    // 暗号化のためのnonce(ナンス)を生成します。
59    // nonceは、同じキーペアを使って暗号化するたびに、必ず一意で予測不可能なものを使用する必要があります。
60    // sodium_crypto_box_noncebytes() は nonce に必要なバイト数を返します。
61    $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
62
63    // AliceからBobへメッセージを暗号化します。
64    // 暗号化には、送信者(Alice)の秘密鍵と受信者(Bob)の公開鍵を使用します。
65    $encryptedMessage = sodium_crypto_box(
66        $message,
67        $nonce,
68        $bobPublicKey,   // 受信者 Bob の公開鍵
69        $aliceSecretKey  // 送信者 Alice の秘密鍵
70    );
71    echo "暗号化されたメッセージ (Base64エンコード): " . base64_encode($encryptedMessage) . "\n";
72
73    // BobがAliceからのメッセージを復号化します。
74    // 復号化には、受信者(Bob)の秘密鍵と送信者(Alice)の公開鍵を使用します。
75    $decryptedMessage = sodium_crypto_box_open(
76        $encryptedMessage,
77        $nonce,
78        $alicePublicKey, // 送信者 Alice の公開鍵
79        $bobSecretKey    // 受信者 Bob の秘密鍵
80    );
81
82    if ($decryptedMessage !== false) {
83        echo "復号化されたメッセージ: '" . $decryptedMessage . "'\n";
84        if ($decryptedMessage === $message) {
85            echo " -> 復号化成功。メッセージは元の通りです。\n";
86        } else {
87            echo " -> 復号化されたメッセージが元のメッセージと異なります。(エラー)\n";
88        }
89    } else {
90        echo "メッセージの復号化に失敗しました。鍵、nonce、またはメッセージが間違っている可能性があります。\n";
91    }
92
93    // セキュリティに関する重要な注意事項:
94    // nonceの再利用は絶対に避けてください。同じキーペアで同じnonceを再利用すると、
95    // 深刻なセキュリティ脆弱性(情報漏洩や改ざんの可能性)を引き起こします。
96}
97
98// スクリプトを実行します。
99demonstrateSodiumConstantsAndCryptoBox();
100

SODIUM_CRYPTO_SIGN_KEYPAIRBYTESは、PHPのSodium拡張が提供する署名機能で使われるキーペア(公開鍵と秘密鍵)の合計バイト数を示す定数です。この定数の戻り値はint型で、例えばEd25519アルゴリズムに基づく署名キーペアの標準的なサイズを表します。sodium_crypto_sign_keypair()関数でキーペアを生成する際、この定数で示されるバイト数のデータが生成され、生成されるキーペアのサイズを事前に知ることができます。

一方、sodium_crypto_boxは、Curve25519 Diffie-Hellman鍵交換とChaCha20-Poly1305認証付き暗号を利用し、安全なメッセージの暗号化と復号化を行うための関数です。メッセージを暗号化するには、送信者の秘密鍵、受信者の公開鍵、そして一意のナンス(nonce)が必要です。ナンスは、同じキーペアで暗号化するたびに異なる値を用いる必要があり、セキュリティ確保に極めて重要です。この関数は暗号化されたメッセージをバイナリ文字列として返します。

復号化の際は、sodium_crypto_box_open関数に暗号化されたメッセージ、使用したナンス、送信者の公開鍵、受信者の秘密鍵を渡します。成功すると元の平文メッセージが返され、失敗した場合はfalseが返されます。これにより、二者間での機密性と完全性が保証されたメッセージ交換が実現できます。

このサンプルコードを利用するにあたり、いくつかの重要な注意点があります。まず、暗号化と署名で使われるキーペアはそれぞれ異なる目的とサイズを持ちますので、混同しないよう注意が必要です。特に秘密鍵は厳重に管理し、決して外部に漏らさないでください。公開鍵と秘密鍵の役割を正しく理解し、暗号化・復号化時に適切な組み合わせで使用することが不可欠です。

最も重要な点として、sodium_crypto_box関数でメッセージを暗号化する際に使用するnonce(ナンス)は、毎回必ず新しく、予測不可能なものとして生成してください。同じキーペアで同じnonceを再利用すると、深刻なセキュリティ上の脆弱性(情報漏洩や改ざんの可能性)が発生しますので、このルールは絶対に守る必要があります。

関連コンテンツ

関連IT用語

関連プログラミング言語