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

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

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

作成日: 更新日:

基本的な使い方

sodium_crypto_sign_ed25519_pk_to_curve25519関数は、Ed25519デジタル署名スキームで利用される公開鍵を、Curve25519楕円曲線ベースのDiffie-Hellman鍵共有スキームで使用される公開鍵に変換する関数です。この関数は、PHPのLibsodium拡張機能の一部として提供されており、高度な暗号処理を安全に扱うために用いられます。

Ed25519は、メッセージの正当性を確認し、内容が改ざんされていないことを保証するためのデジタル署名に特化した暗号アルゴリズムです。一方、Curve25519 Diffie-Hellmanは、二者間で安全に共通の秘密鍵を生成するための鍵共有プロトコルであり、主にセキュアな通信路の確立に利用されます。

この関数の主な目的は、異なる暗号プロトコル間での鍵の互換性を持たせることです。具体的には、Ed25519で署名に利用していた公開鍵を、鍵共有のためのCurve25519の公開鍵としても再利用できるように変換します。これにより、鍵の管理が簡素化され、システム設計の柔軟性が向上します。例えば、あるエンティティがデジタル署名によって自身を認証しつつ、同時にその公開鍵を使って安全な通信のための共有鍵を確立したい場合などに非常に有効です。この関数は、入力としてEd25519公開鍵のバイナリ文字列を受け取り、対応するCurve25519公開鍵のバイナリ文字列を返します。

構文(syntax)

1<?php
2
3$ed25519_keypair = sodium_crypto_sign_keypair();
4$ed25519_pk = sodium_crypto_sign_publickey($ed25519_keypair);
5
6$curve25519_pk = sodium_crypto_sign_ed25519_pk_to_curve25519($ed25519_pk);
7
8// $curve25519_pk holds the converted Curve25519 public key
9
10?>

引数(parameters)

string $ed25519_pk

  • string $ed25519_pk: Ed25519公開鍵をCurve25519公開鍵に変換するための、Base64エンコードされたEd25519公開鍵文字列

戻り値(return)

string

Ed25519公開鍵をCurve25519公開鍵に変換したバイナリ形式の文字列を返します。

サンプルコード

Ed25519公開鍵をCurve25519に変換する

1<?php
2
3/**
4 * このスクリプトは、PHPのSodium拡張が有効になっている環境で動作します。
5 * Sodium拡張は、最新の暗号化機能を提供するライブラリ「libsodium」のPHP実装です。
6 */
7
8/**
9 * Ed25519 署名公開鍵を Curve25519 鍵交換公開鍵に変換するサンプル。
10 *
11 * Ed25519 (デジタル署名用) と Curve25519 (鍵交換用) は異なる目的を持ちますが、
12 * 内部的には同じ楕円曲線を利用しているため、この関数を使って公開鍵を相互に変換できます。
13 * これにより、既存のEd25519公開鍵を、例えばX25519鍵交換プロトコルで利用できるようになります。
14 */
15function convertEd25519PublicKeyToCurve25519Example(): void
16{
17    echo "--- Ed25519 公開鍵を Curve25519 公開鍵に変換するデモンストレーション ---\n\n";
18
19    // 1. Ed25519 鍵ペアを生成します。
20    // デジタル署名に使用するEd25519形式の秘密鍵と公開鍵のペアを作成します。
21    // sodium_crypto_sign_keypair() は秘密鍵と公開鍵を含むバイナリ文字列を返します。
22    $ed25519_keypair = sodium_crypto_sign_keypair();
23
24    // 秘密鍵部分を抽出します。
25    $ed25519_secret_key = sodium_crypto_sign_secretkey($ed25519_keypair);
26
27    // 抽出した秘密鍵からEd25519公開鍵を導出します。
28    // これは `crypto_sign_ed25519_sk_to_pk` キーワードに関連する操作であり、
29    // 既に鍵ペアから公開鍵を抽出済みの場合(sodium_crypto_sign_publickey() を使用した場合)でも、
30    // この関数は秘密鍵から直接公開鍵を計算できます。
31    $ed25519_public_key = sodium_crypto_sign_sk_to_pk($ed25519_secret_key);
32
33    echo "生成された Ed25519 公開鍵 (16進数): " . bin2hex($ed25519_public_key) . "\n";
34    echo "Ed25519 公開鍵のバイト長: " . strlen($ed25519_public_key) . " バイト\n\n";
35
36    // 2. Ed25519 公開鍵を Curve25519 公開鍵に変換します。
37    // sodium_crypto_sign_ed25519_pk_to_curve25519 関数は、
38    // Ed25519形式の公開鍵をCurve25519形式の公開鍵に変換します。
39    $curve25519_public_key = sodium_crypto_sign_ed25519_pk_to_curve25519($ed25519_public_key);
40
41    echo "変換された Curve25519 公開鍵 (16進数): " . bin2hex($curve25519_public_key) . "\n";
42    echo "Curve25519 公開鍵のバイト長: " . strlen($curve25519_public_key) . " バイト\n\n";
43
44    echo "この Curve25519 公開鍵は、X25519 などの鍵交換プロトコルで使用できます。\n";
45    echo "例えば、Diffie-Hellman鍵交換を行う際に、この鍵を使用することができます。\n";
46}
47
48// 上記のサンプル関数を実行します。
49convertEd25519PublicKeyToCurve25519Example();
50
51?>

このPHPスクリプトは、PHPのSodium拡張が提供する暗号化機能の一つであるsodium_crypto_sign_ed25519_pk_to_curve25519関数の利用方法を具体的に示しています。この関数は、Ed25519形式のデジタル署名用公開鍵を、Curve25519形式の鍵交換用公開鍵に変換するために使用されます。Ed25519とCurve25519はそれぞれ異なる暗号化の目的(署名と鍵交換)を持ちますが、内部的には同じ楕円曲線を利用しているため、この関数で公開鍵を相互に変換することが可能です。

サンプルコードでは、まずsodium_crypto_sign_keypair()関数を用いてEd25519形式の鍵ペアを生成します。その後、sodium_crypto_sign_sk_to_pk()関数(キーワードcrypto_sign_ed25519_sk_to_pkに関連する操作)で、生成した秘密鍵からEd25519公開鍵を導出しています。 次に、この導出したEd25519公開鍵を、本関数の引数である$ed25519_pkとしてsodium_crypto_sign_ed25519_pk_to_curve25519に渡します。 この関数は、与えられたEd25519公開鍵をCurve25519形式の公開鍵に変換し、その結果をバイナリ文字列(戻り値string)として返します。 変換されたCurve25519公開鍵は、X25519などのDiffie-Hellman鍵交換プロトコルにおいて、安全な通信を確立するために利用できます。この機能は、既存の鍵を異なる暗号化用途に柔軟に活用したい場合に役立ちます。

sodium_crypto_sign_ed25519_pk_to_curve25519関数は、Ed25519デジタル署名用の公開鍵をCurve25519鍵交換用の公開鍵に変換します。これにより、Ed25519で管理していた公開鍵をX25519などの鍵交換プロトコルで再利用できるようになります。サンプルコードを試す際は、事前にPHPのSodium拡張が有効になっているかを確認してください。暗号化関連の処理は、鍵の目的(署名と鍵交換)を明確に理解して利用することが重要です。また、この関数が扱う鍵はバイナリデータであるため、内容確認にはbin2hex関数などを用いて16進数で表示しています。実際のシステム運用では、秘密鍵の厳重な管理を徹底し、公開鍵も安全な経路で扱うように心がけてください。

Ed25519公開鍵をCurve25519に変換する

1<?php
2
3// このコードはPHP 8以降のSodium拡張機能が有効になっている環境で動作します。
4
5/**
6 * Ed25519署名公開鍵をCurve25519暗号化公開鍵に変換し、
7 * その鍵を用いてメッセージを安全に暗号化・復号化するデモンストレーション。
8 *
9 * システムエンジニアを目指す初心者の方へ:
10 * この関数は、Ed25519という署名に使われる鍵を、Curve25519という公開鍵暗号(Box暗号化)に
11 * 使われる鍵に変換する方法(`sodium_crypto_sign_ed25519_pk_to_curve25519`)を示します。
12 * これにより、同じ秘密鍵から派生した鍵ペアを異なる目的(署名と暗号化)で利用できる柔軟性が生まれます。
13 * `sodium_crypto_box`は、公開鍵暗号方式でメッセージを安全にやり取りするためのPHPの関数です。
14 */
15function demonstrateEd25519ToCurve25519Encryption()
16{
17    // PHP Sodium拡張が利用可能かチェック
18    if (!extension_loaded('sodium')) {
19        echo "エラー: Sodium拡張機能が有効になっていません。\n";
20        return;
21    }
22
23    echo "--- Ed25519からCurve25519への鍵変換とメッセージ暗号化/復号化のデモンストレーション ---\n\n";
24
25    // 1. AliceのEd25519署名鍵ペアを生成
26    // この鍵ペアは主にデジタル署名に使用されますが、ここから暗号化用の鍵を導出します。
27    $alice_ed25519_keypair = sodium_crypto_sign_keypair();
28    $alice_ed25519_pk = sodium_crypto_sign_publickey($alice_ed25519_keypair);
29    $alice_ed25519_sk = sodium_crypto_sign_secretkey($alice_ed25519_keypair);
30
31    echo "AliceのEd25519公開鍵 (Base64エンコード): " . base64_encode($alice_ed25519_pk) . "\n";
32
33    // 2. AliceのEd25519公開鍵をCurve25519公開鍵に変換
34    // これが今回のメイン関数 `sodium_crypto_sign_ed25519_pk_to_curve25519` の利用例です。
35    // Ed25519署名用の公開鍵を、Curve25519ベースの非対称暗号化(sodium_crypto_box)で
36    // 使える形式(公開鍵)に変換します。
37    $alice_curve25519_pk = sodium_crypto_sign_ed25519_pk_to_curve25519($alice_ed25519_pk);
38    echo "AliceのEd25519公開鍵から変換されたCurve25519公開鍵 (Base64エンコード): " . base64_encode($alice_curve25519_pk) . "\n";
39
40    // 3. AliceのEd25519秘密鍵をCurve25519秘密鍵に変換
41    // 暗号化・復号化を行うためには、対応する秘密鍵もCurve25519形式に変換する必要があります。
42    $alice_curve25519_sk = sodium_crypto_sign_ed25519_sk_to_curve25519($alice_ed25519_sk);
43    echo "AliceのEd25519秘密鍵から変換されたCurve25519秘密鍵 (Base64エンコード): " . base64_encode($alice_curve25519_sk) . "\n\n";
44
45    // 4. BobのCurve25519暗号化鍵ペアを生成
46    // Bobは直接Curve25519の鍵ペアを使用します。
47    $bob_curve25519_keypair = sodium_crypto_box_keypair();
48    $bob_curve25519_pk = sodium_crypto_box_publickey($bob_curve25519_keypair);
49    $bob_curve25519_sk = sodium_crypto_box_secretkey($bob_curve25519_keypair);
50
51    echo "BobのCurve25519公開鍵 (Base64エンコード): " . base64_encode($bob_curve25519_pk) . "\n";
52    echo "BobのCurve25519秘密鍵 (Base64エンコード): " . base64_encode($bob_curve25519_sk) . "\n\n";
53
54    // 5. AliceがBob宛のメッセージを暗号化
55    $message = "Hello, Bob! This is a secret message from Alice.";
56    // ノンス(nonce)は一度だけ使用されるランダムな値で、暗号化のセキュリティを確保します。
57    $nonce = sodium_crypto_box_randomnonce();
58
59    echo "元のメッセージ: " . $message . "\n";
60
61    // Aliceは自分のCurve25519秘密鍵とBobのCurve25519公開鍵を使ってメッセージを暗号化します。
62    // `sodium_crypto_box_keypair_from_secretkey_and_publickey`で共有のBox鍵ペアを作成します。
63    $encrypted_message = sodium_crypto_box(
64        $message,
65        $nonce,
66        sodium_crypto_box_keypair_from_secretkey_and_publickey($alice_curve25519_sk, $bob_curve25519_pk)
67    );
68
69    echo "暗号化されたメッセージ (Base64エンコード): " . base64_encode($encrypted_message) . "\n";
70    echo "使用されたノンス (Base64エンコード): " . base64_encode($nonce) . "\n\n";
71
72    // 6. BobがAliceからのメッセージを復号化
73    // Bobは自分のCurve25519秘密鍵とAliceのCurve25519公開鍵を使ってメッセージを復号化します。
74    $decrypted_message = sodium_crypto_box_open(
75        $encrypted_message,
76        $nonce,
77        sodium_crypto_box_keypair_from_secretkey_and_publickey($bob_curve25519_sk, $alice_curve25519_pk)
78    );
79
80    if ($decrypted_message !== false) {
81        echo "復号化されたメッセージ: " . $decrypted_message . "\n";
82        if ($decrypted_message === $message) {
83            echo "-> メッセージは正常に復号化されました。\n";
84        } else {
85            echo "-> エラー: 復号化されたメッセージが元のメッセージと一致しません。\n";
86        }
87    } else {
88        echo "エラー: メッセージの復号化に失敗しました。\n";
89    }
90
91    echo "\n--------------------------------------------------------------------------------\n";
92    echo "まとめ:\n";
93    echo "このデモでは、Ed25519署名鍵(Alice)からCurve25519暗号化鍵を導出し、\n";
94    echo "その鍵を使用して(BobのCurve25519鍵と組み合わせて)メッセージを安全にやり取りできることを示しました。\n";
95    echo "`sodium_crypto_sign_ed25519_pk_to_curve25519`は、異なる用途の暗号システム間で\n";
96    echo "鍵の互換性を持たせるために重要な役割を果たします。\n";
97}
98
99// デモンストレーション関数を実行
100demonstrateEd25519ToCurve25519Encryption();
101
102?>

sodium_crypto_sign_ed25519_pk_to_curve25519関数は、PHPのSodium拡張機能によって提供される暗号学的な関数です。この関数は、Ed25519というデジタル署名に利用される公開鍵を、Curve25519という公開鍵暗号(別名Box暗号化)で使用される形式の公開鍵に変換します。引数$ed25519_pkには変換したいEd25519公開鍵(バイナリ文字列)を指定し、成功すると対応するCurve25519公開鍵(バイナリ文字列)を返します。

このサンプルコードは、Ed25519署名鍵ペアを持つAliceが、その公開鍵をsodium_crypto_sign_ed25519_pk_to_curve25519関数を用いてCurve25519公開鍵に変換し、さらに対応する秘密鍵も変換して、Bobとの間でsodium_crypto_box関数を使った安全なメッセージの暗号化と復号化を行うデモンストレーションです。具体的には、AliceがEd25519署名鍵から導出したCurve25519鍵と、Bobが生成したCurve25519鍵を組み合わせてメッセージを暗号化し、Bobがそれを復号化する一連のプロセスを示しています。

この関数を利用することで、Ed25519署名鍵からCurve25519暗号化鍵を派生させ、同じ鍵の基盤で異なる暗号用途(署名と暗号化)を実現する柔軟性が得られます。システムエンジニアにとって、これは複数の暗号システム間での鍵の互換性確保や、既存の鍵資産の有効活用に役立つ重要な機能となります。

このコードを実行するには、PHPのSodium拡張機能が有効になっていることを確認してください。sodium_crypto_sign_ed25519_pk_to_curve25519関数は、Ed25519署名用の公開鍵をCurve25519暗号化用の公開鍵に変換する際に使用します。暗号化処理全体を機能させるためには、対応するEd25519秘密鍵もsodium_crypto_sign_ed25519_sk_to_curve25519でCurve25519形式に変換する必要があります。

sodium_crypto_boxでメッセージを暗号化する際は、ノンスと呼ばれる値を毎回異なるランダムなものにしてください。同じノンスを繰り返し使用するとセキュリティが著しく低下します。また、秘密鍵はシステム上で最も重要な情報の一つであり、絶対に公開したり漏洩させたりしないよう、厳重な管理を徹底してください。暗号化や復号化の関数の戻り値は、処理が成功したか失敗したかを示すため、必ず確認して適切なエラーハンドリングを行うようにしてください。

関連コンテンツ

関連IT用語

関連プログラミング言語