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

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

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

作成日: 更新日:

基本的な使い方

sodium_crypto_box_keypair関数は、公開鍵暗号方式で使用する新しい鍵のペアをランダムに生成する関数です。この鍵ペアは、他者に共有する「公開鍵」と、自分だけが秘密に保管する「秘密鍵」の二つで構成されます。公開鍵で暗号化されたデータは、対になる秘密鍵でしか復号できず、これにより安全な通信が実現されます。この関数を呼び出すと、暗号学的に安全な乱数に基づいて秘密鍵が作成され、その秘密鍵から対応する公開鍵が計算されます。返り値として、秘密鍵と公開鍵が結合された一つの文字列が返されます。この結合された文字列は、後からsodium_crypto_box_publickey関数やsodium_crypto_box_secretkey関数を用いることで、それぞれの鍵に分離して取り出すことができます。生成された鍵ペアは、sodium_crypto_box関数などと組み合わせて使い、二者間での安全なメッセージ交換システムの基盤を構築するために不可欠です。

構文(syntax)

1<?php
2$keypair = sodium_crypto_box_keypair();

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

この関数は、安全な暗号化通信に必要な公開鍵と秘密鍵のペアを生成し、それらを文字列として返します。

サンプルコード

sodium_crypto_box_keypairで鍵ペアを生成する

1<?php
2
3/**
4 * Libsodiumのcrypto_box_keypair関数を使用して、新しい非対称鍵ペアを生成します。
5 *
6 * この関数は、暗号化通信やデジタル署名に使用される公開鍵と秘密鍵のペアを生成します。
7 * 生成された鍵ペアは、秘密鍵と公開鍵が結合されたバイナリ文字列として返されます。
8 *
9 * システムエンジニアを目指す初心者の方へ:
10 * 非対称暗号化では、メッセージを暗号化するための「公開鍵」と、その暗号化されたメッセージを
11 * 復号するための「秘密鍵」のペアを使用します。
12 * 公開鍵は自由に共有できますが、秘密鍵は誰にも知られてはならない重要な鍵です。
13 */
14function generateSodiumKeyPair(): void
15{
16    // sodium_crypto_box_keypair() を呼び出して、新しい鍵ペアを生成します。
17    // この関数は引数を取らず、秘密鍵と公開鍵が結合されたバイナリ文字列を返します。
18    $key_pair = sodium_crypto_box_keypair();
19
20    // 生成された鍵ペアはバイナリデータなので、可読性を高めるために16進数に変換して表示します。
21    echo "--- 生成された鍵ペア ---" . PHP_EOL;
22    echo "結合された秘密鍵と公開鍵 (hex): " . bin2hex($key_pair) . PHP_EOL . PHP_EOL;
23
24    // 鍵ペアから秘密鍵を抽出します。
25    // sodium_crypto_box_secretkey() は、結合された鍵ペアから秘密鍵部分を抽出します。
26    $secret_key = sodium_crypto_box_secretkey($key_pair);
27    echo "秘密鍵 (hex): " . bin2hex($secret_key) . PHP_EOL;
28
29    // 鍵ペアから公開鍵を抽出します。
30    // sodium_crypto_box_publickey() は、結合された鍵ペアから公開鍵部分を抽出します。
31    $public_key = sodium_crypto_box_publickey($key_pair);
32    echo "公開鍵 (hex): " . bin2hex($public_key) . PHP_EOL . PHP_EOL;
33
34    echo "これらの鍵は、他の Libsodium の 'crypto_box' 関連関数 (例: sodium_crypto_box_seal, sodium_crypto_box_open) で、\n";
35    echo "安全なメッセージのやり取りを行うために使用されます。" . PHP_EOL;
36}
37
38// スクリプトを実行して鍵ペアを生成・表示します。
39generateSodiumKeyPair();

PHP 8で利用できるsodium_crypto_box_keypair関数は、Libsodiumライブラリが提供する、非対称暗号化に用いられる新しい鍵ペアを生成するための関数です。この関数は引数を取らず、秘密鍵と公開鍵が結合されたバイナリ形式の文字列を戻り値として返します。非対称暗号化では、メッセージの暗号化に使用する「公開鍵」と、その暗号化されたメッセージを復号するための「秘密鍵」のペアを使用します。公開鍵は広く共有できますが、秘密鍵は厳重に管理し、決して他者に知られてはなりません。

サンプルコードでは、sodium_crypto_box_keypair()を呼び出して新しい鍵ペアを生成しています。生成される鍵ペアはバイナリデータであるため、bin2hex関数を使って16進数形式に変換し、その内容を確認しやすくしています。さらに、生成された結合済みの鍵ペアから、sodium_crypto_box_secretkey()関数で秘密鍵を、sodium_crypto_box_publickey()関数で公開鍵をそれぞれ抽出し、表示しています。これらの抽出された鍵は、Libsodiumのsodium_crypto_box_sealsodium_crypto_box_openといった関連関数と組み合わせて使用することで、安全なメッセージの暗号化と復号を行うための基盤となります。

sodium_crypto_box_keypair関数は、秘密鍵と公開鍵が結合されたバイナリ文字列を返します。この戻り値は生のバイナリデータのため、表示やログ出力の際にはbin2hex関数などで16進数に変換すると内容が確認しやすくなりますが、実際の利用では変換せずにそのまま使用することが一般的です。特に重要な注意点として、生成された秘密鍵は絶対に他者に漏洩させてはならない情報です。サンプルコードでは表示していますが、実際のシステムでは厳重なアクセス制限や安全なストレージへの保存など、徹底した管理が必要となります。公開鍵は共有できますが、秘密鍵の漏洩はセキュリティ上の致命的な問題を引き起こすため、その取り扱いには細心の注意を払ってください。これらの鍵は安全なデータ通信の基盤となります。

PHP Sodiumによる鍵ペア生成と暗号化

1<?php
2
3/**
4 * Libsodiumのsodium_crypto_box_keypair関数を使用して鍵ペアを生成し、
5 * その鍵ペアから秘密鍵と公開鍵を抽出し、それらを用いてメッセージを
6 * 暗号化および復号化する一連のプロセスをデモンストレーションします。
7 *
8 * この例は、キーワード「sodium_crypto_box_keypair_from_secretkey_and_publickey」が
9 * 示唆する「秘密鍵と公開鍵を組み合わせた鍵ペアの利用」を具体的に示します。
10 */
11function demonstrateSodiumCryptoBoxKeyPairUsage(): void
12{
13    // 1. sodium_crypto_box_keypair() を使用して、送信者用の鍵ペアを生成します。
14    // この関数は、秘密鍵と公開鍵の両方を含む単一の文字列(バイナリデータ)を返します。
15    echo "--- 鍵ペア生成と分解のデモンストレーション ---\n";
16    $senderKeyPair = sodium_crypto_box_keypair();
17    echo "送信者用の鍵ペアが生成されました。\n";
18    echo "鍵ペアのバイト長: " . strlen($senderKeyPair) . " バイト\n";
19
20    // 2. 生成された鍵ペアから秘密鍵を抽出します。
21    $senderSecretKey = sodium_crypto_box_secretkey($senderKeyPair);
22    echo "送信者の秘密鍵が抽出されました。\n";
23    echo "秘密鍵のバイト長: " . strlen($senderSecretKey) . " バイト\n";
24
25    // 3. 生成された鍵ペアから公開鍵を抽出します。
26    $senderPublicKey = sodium_crypto_box_publickey($senderKeyPair);
27    echo "送信者の公開鍵が抽出されました。\n";
28    echo "公開鍵のバイト長: " . strlen($senderPublicKey) . " バイト\n";
29
30    // --- ここから、別のユーザー(受信者)の鍵ペアを準備し、暗号化・復号化のフローを示します ---
31
32    // 受信者用の鍵ペアも生成します。実際には、送信者と受信者はそれぞれ自身の鍵ペアを持ちます。
33    $recipientKeyPair = sodium_crypto_box_keypair();
34    $recipientSecretKey = sodium_crypto_box_secretkey($recipientKeyPair);
35    $recipientPublicKey = sodium_crypto_box_publickey($recipientKeyPair);
36    echo "\n受信者用の鍵ペアも生成されました。\n";
37
38    $originalMessage = "これはLibrePHP Sodium拡張による秘密のメッセージです。";
39    echo "\n--- メッセージの暗号化と復号化 ---\n";
40    echo "元のメッセージ: '" . $originalMessage . "'\n";
41
42    // 暗号化には「nonce(ノンス)」と呼ばれるワンタイム値が必要です。
43    // これは推測困難なランダムな値で、メッセージごとに異なるものを使用することが非常に重要です。
44    $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
45    echo "nonceが生成されました。\n";
46
47    // 4. メッセージを暗号化します。
48    // 暗号化には、送信者の秘密鍵と受信者の公開鍵を使用します。
49    $encryptedMessage = sodium_crypto_box($originalMessage, $nonce, $recipientPublicKey, $senderSecretKey);
50
51    if ($encryptedMessage === false) {
52        echo "メッセージの暗号化に失敗しました。\n";
53        return;
54    }
55    echo "メッセージが暗号化されました。暗号文のバイト長: " . strlen($encryptedMessage) . " バイト\n";
56    // 注意: 暗号文はバイナリデータなので、直接表示すると文字化けすることがあります。
57    // 例えば base64_encode(encryptedMessage) のようにエンコードして表示することもできますが、
58    // 初心者向けには省略します。
59
60    // 5. メッセージを復号化します。
61    // 復号化には、受信者の秘密鍵と送信者の公開鍵、そして暗号化時に使用した同じnonceを使用します。
62    $decryptedMessage = sodium_crypto_box_open($encryptedMessage, $nonce, $senderPublicKey, $recipientSecretKey);
63
64    if ($decryptedMessage === false) {
65        echo "メッセージの復号化に失敗しました。鍵が間違っているか、メッセージが改ざんされた可能性があります。\n";
66    } else {
67        echo "メッセージが復号化されました。\n";
68        echo "復号化されたメッセージ: '" . $decryptedMessage . "'\n";
69
70        // 元のメッセージと復号化されたメッセージが一致するか確認
71        if ($originalMessage === $decryptedMessage) {
72            echo "結果: 元のメッセージと復号化されたメッセージは一致します。暗号化と復号化は成功しました。\n";
73        } else {
74            echo "エラー: 元のメッセージと復号化されたメッセージが一致しません。\n";
75        }
76    }
77}
78
79// 関数を実行して、デモンストレーションを開始します。
80demonstrateSodiumCryptoBoxKeyPairUsage();

sodium_crypto_box_keypair関数は、PHP 8で利用可能なLibrePHP Sodium拡張に含まれる、暗号化のための鍵ペアを生成する重要な関数です。この関数は引数を取らずに呼び出すことができ、秘密鍵と公開鍵の両方が含まれた単一のバイナリ文字列を戻り値として返します。

生成された鍵ペアは、sodium_crypto_box_secretkey関数で「秘密鍵」を、sodium_crypto_box_publickey関数で「公開鍵」をそれぞれ抽出できます。秘密鍵は誰にも知られてはならない個人専用の鍵であり、公開鍵はメッセージの送信相手などに安全に共有できる鍵です。

サンプルコードでは、この鍵ペアを利用してメッセージを安全に暗号化し、復号化する過程が具体的に示されています。メッセージを暗号化する際には、送信者の秘密鍵と受信者の公開鍵、そしてメッセージごとに異なるランダムな「nonce」と呼ばれる一時的な値を使用します。これにより、sodium_crypto_box関数によってメッセージが暗号化されます。復号化の際には、受信者の秘密鍵と送信者の公開鍵、そして暗号化時と同じnonceを用いてsodium_crypto_box_open関数を実行することで、元のメッセージを安全に読み取ることが可能です。

このように、sodium_crypto_box_keypair関数は、秘密鍵と公開鍵の組み合わせによる安全なメッセージ通信の基盤を提供します。

sodium_crypto_box_keypair関数は秘密鍵と公開鍵の両方を含む鍵ペアを生成します。これを直接利用するのではなく、別途関数で秘密鍵と公開鍵を抽出して使います。暗号化や復号化では、メッセージごとに異なる予測困難なNonce(ノンス)を必ず使用してください。Nonceの使い回しはセキュリティ上の重大な問題を引き起こします。暗号化には送信者の秘密鍵と受信者の公開鍵を、復号化には受信者の秘密鍵と送信者の公開鍵を用いるのが原則です。また、関数が失敗するとfalseを返すため、常に戻り値を確認しエラーチェックを行うことが重要です。生成される鍵や暗号文はバイナリデータですので、表示や保存の際はBase64エンコードなどを検討してください。

関連コンテンツ

関連プログラミング言語