【PHP8.x】sodium_crypto_sign_publickey_from_secretkey()関数の使い方
sodium_crypto_sign_publickey_from_secretkey関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
sodium_crypto_sign_publickey_from_secretkey関数は、デジタル署名に用いられる秘密鍵から対応する公開鍵を生成する関数です。この関数は、PHPのSodium拡張機能の一部として提供されており、セキュアな暗号処理を可能にします。
デジタル署名システムでは、情報の送信者が秘密鍵を用いてデータに署名し、その署名を検証する側が公開鍵を用いて署名が正当であるかを確認します。このプロセスにおいて、公開鍵は秘密鍵とペアになるものであり、特定の秘密鍵からのみ導き出される性質を持っています。
具体的には、sodium_crypto_sign_publickey_from_secretkey関数は、完全な秘密鍵を引数として受け取ります。そして、その秘密鍵の情報を基に、対応する公開鍵をバイナリ形式の文字列として返します。生成された公開鍵は、データを署名する能力は持たず、もっぱら署名の検証と、署名が特定の秘密鍵によって作成されたことの証明に利用されます。
この関数の利用により、開発者は安全なデジタル署名システムを構築する際に、秘密鍵から公開鍵を安全かつ確実に生成することができます。公開鍵は広く配布してもセキュリティ上の問題はありませんが、秘密鍵は厳重に管理する必要がある点に注意が必要です。これにより、通信の信頼性とデータの完全性を保証します。
構文(syntax)
1<?php 2$secretKey = random_bytes(SODIUM_CRYPTO_SIGN_SECRETKEYBYTES); 3$publicKey = sodium_crypto_sign_publickey_from_secretkey($secretKey);
引数(parameters)
string $secret_key
- string $secret_key: 署名生成に使用する秘密鍵。
sodium_crypto_sign_keypair()で生成された秘密鍵を指定します。
戻り値(return)
string
指定された秘密鍵から、対応する公開鍵をバイナリ形式の文字列で返します。
サンプルコード
PHP Sodiumで秘密鍵から公開鍵を導出する
1<?php 2 3/** 4 * Sodium拡張の `sodium_crypto_sign_publickey_from_secretkey` 関数を使用して、 5 * 署名秘密鍵から公開鍵を導出するサンプルです。 6 */ 7function demonstratePublicKeyDerivation(): void 8{ 9 // Sodium拡張がロードされているか確認します。 10 // Sodiumは暗号化機能を提供するPHPの拡張モジュールです。 11 if (!extension_loaded('sodium')) { 12 echo "エラー: 'sodium' 拡張がロードされていません。php.iniで有効にしてください。\n"; 13 return; 14 } 15 16 echo "--- 署名公開鍵の導出デモンストレーション ---\n\n"; 17 18 // 1. 署名用の鍵ペアを生成します。 19 // この鍵ペアはメッセージの署名と署名検証に使用されます。 20 $keyPair = sodium_crypto_sign_keypair(); 21 echo "1. 署名鍵ペアを生成しました。\n"; 22 23 // 2. 生成された鍵ペアから秘密鍵を抽出します。 24 // 秘密鍵は厳重に管理し、決して公開してはいけません。 25 $secretKey = sodium_crypto_sign_secretkey($keyPair); 26 echo "2. 秘密鍵を抽出しました。\n"; 27 28 // 3. 抽出した秘密鍵から公開鍵を導出します。 29 // これが `sodium_crypto_sign_publickey_from_secretkey` 関数の利用例です。 30 // 秘密鍵があれば、いつでも対応する公開鍵を再生成できます。 31 $derivedPublicKey = sodium_crypto_sign_publickey_from_secretkey($secretKey); 32 echo "3. 秘密鍵から公開鍵を導出しました。\n"; 33 34 // 4. 元の鍵ペアから直接公開鍵を抽出します。 35 // これは導出された公開鍵と比較するために使用します。 36 $originalPublicKey = sodium_crypto_sign_publickey($keyPair); 37 echo "4. 元の鍵ペアから公開鍵を抽出しました。\n"; 38 39 // 5. 導出された公開鍵と元の鍵ペアから抽出した公開鍵が一致するか確認します。 40 // これらが一致すれば、関数が正しく動作していることを意味します。 41 if ($derivedPublicKey === $originalPublicKey) { 42 echo "5. 結果: 導出された公開鍵と元の公開鍵は一致しました。関数は正しく動作しています。\n"; 43 } else { 44 echo "5. エラー: 導出された公開鍵と元の公開鍵が一致しませんでした。\n"; 45 } 46 47 echo "\n--- 処理完了 ---\n"; 48} 49 50// デモンストレーションを実行します。 51demonstratePublicKeyDerivation();
このPHPのサンプルコードは、PHP 8で導入されたSodium拡張機能に含まれるsodium_crypto_sign_publickey_from_secretkey関数を利用し、署名用の秘密鍵から対応する公開鍵を導出する方法を示しています。
sodium_crypto_sign_publickey_from_secretkey関数は、暗号学的署名に用いられる公開鍵暗号方式において、特定の秘密鍵に紐づく公開鍵を計算して生成する役割を持ちます。引数$secret_keyには、署名生成に使用される秘密鍵の文字列を渡します。この関数は、その秘密鍵から導出された公開鍵を文字列として戻り値で返します。
コードでは、最初にsodium_crypto_sign_keypair()関数で署名用の鍵ペア(秘密鍵と公開鍵の組み合わせ)を生成しています。その後、生成された鍵ペアからsodium_crypto_sign_secretkey()関数を用いて秘密鍵だけを抽出し、この抽出した秘密鍵をsodium_crypto_sign_publickey_from_secretkey関数に渡して公開鍵を導出しています。最終的に、この方法で導出された公開鍵が、元の鍵ペアから直接取得した公開鍵と一致することを確認することで、関数が正しく動作していることを検証しています。これは、秘密鍵が手元にあれば、いつでも対応する公開鍵を安全に再生成できるという重要な特性を示しています。
この関数を利用するには、PHPのSodium拡張がサーバーにインストールされ、有効になっている必要があります。特に、引数に渡す秘密鍵は厳重に管理し、絶対に外部に漏洩させないでください。秘密鍵が漏洩すると、署名の偽造などセキュリティ上の重大な脆弱性につながります。本関数はメッセージの署名検証に用いる公開鍵を、対応する秘密鍵から導出するためのものです。sodium_crypto_boxなどのメッセージ暗号化を行う関数とは目的が異なるため、用途を混同しないように注意が必要です。公開鍵は秘密鍵からいつでも安全に再生成できるため、公開しても問題ありませんが、鍵ペアの生成には常にsodium_crypto_sign_keypair()のような安全な関数を使用してください。
秘密鍵から公開鍵を導出する
1<?php 2 3/** 4 * libsodium 拡張機能を使用して秘密鍵から公開鍵を導出するサンプル関数。 5 * 6 * システムエンジニアを目指す初心者向けに、 7 * `sodium_crypto_sign_publickey_from_secretkey` 関数の基本的な使い方を示します。 8 */ 9function demonstrateSodiumPublicKeyDerivation(): void 10{ 11 // libsodium 拡張機能が有効か確認します。 12 // 無効な場合、このスクリプトは致命的なエラーになります。 13 if (!extension_loaded('sodium')) { 14 echo "エラー: PHP の libsodium 拡張機能が有効になっていません。\n"; 15 echo "php.ini で 'extension=sodium' を有効にするか、PHP を '--with-sodium' でコンパイルしてください。\n"; 16 return; 17 } 18 19 echo "libsodium 秘密鍵から公開鍵を導出するデモンストレーションを開始します。\n\n"; 20 21 // 1. 新しいキーペア (秘密鍵と公開鍵のペア) を生成します。 22 // `sodium_crypto_sign_keypair()` は、署名と検証に必要な両方の鍵を生成します。 23 $keyPair = sodium_crypto_sign_keypair(); 24 25 // 2. 生成されたキーペアから秘密鍵と公開鍵を抽出します。 26 $secretKey = sodium_crypto_sign_secretkey($keyPair); 27 $publicKeyFromKeyPair = sodium_crypto_sign_publickey($keyPair); 28 29 echo "生成された秘密鍵 (Hex): " . bin2hex($secretKey) . "\n"; 30 echo "キーペアから直接得られた公開鍵 (Hex): " . bin2hex($publicKeyFromKeyPair) . "\n\n"; 31 32 // 3. 抽出した秘密鍵から公開鍵を導出します。 33 // `sodium_crypto_sign_publickey_from_secretkey()` は、秘密鍵のみから公開鍵を計算します。 34 $derivedPublicKey = sodium_crypto_sign_publickey_from_secretkey($secretKey); 35 36 echo "秘密鍵から導出された公開鍵 (Hex): " . bin2hex($derivedPublicKey) . "\n\n"; 37 38 // 4. 導出された公開鍵と、キーペアから直接得られた公開鍵が一致するか検証します。 39 if ($derivedPublicKey === $publicKeyFromKeyPair) { 40 echo "検証成功: 秘密鍵から導出された公開鍵は、キーペアから直接得られた公開鍵と一致します。\n"; 41 echo "これは、`sodium_crypto_sign_publickey_from_secretkey` 関数が正しく動作していることを示します。\n"; 42 } else { 43 echo "検証失敗: 公開鍵が一致しません。\n"; 44 } 45 46 echo "\nlibsodium 秘密鍵から公開鍵を導出するデモンストレーションを終了します。\n"; 47} 48 49// 関数を実行します。 50demonstrateSodiumPublicKeyDerivation();
PHP 8のsodium拡張機能に含まれるsodium_crypto_sign_publickey_from_secretkey関数は、デジタル署名に利用される秘密鍵から対応する公開鍵を安全に導出するために使用されます。この関数は、既存の秘密鍵から公開鍵を再計算したり、秘密鍵のみを保管している状態から公開鍵を生成したい場合に大変有用です。
引数には、署名に用いる完全な秘密鍵を文字列(string $secret_key)として渡します。この秘密鍵は、通常sodium_crypto_sign_keypair()で生成されたキーペアからsodium_crypto_sign_secretkey()を用いて抽出されるものです。関数は、指定された秘密鍵に対応する公開鍵を文字列(string)として返します。
サンプルコードでは、まずsodium_crypto_sign_keypair()で新しい秘密鍵と公開鍵のペアを生成し、そこから秘密鍵を抽出します。次に、この抽出した秘密鍵をsodium_crypto_sign_publickey_from_secretkey()関数に渡し、公開鍵を導出しています。最後に、生成時に得られた公開鍵と、秘密鍵から導出された公開鍵が一致するかを検証することで、関数が正しく動作し、秘密鍵から常に正しい公開鍵を得られることを示しています。この機能を利用するには、事前にPHPのsodium拡張機能が有効になっている必要があります。
この関数を利用するには、PHPのsodium拡張機能が有効になっているか必ず確認してください。有効でない場合、スクリプトは動作しません。
sodium_crypto_sign_publickey_from_secretkeyは、既存の秘密鍵からその公開鍵を導出する機能です。鍵ペア自体を生成するものではなく、鍵ペアの生成にはsodium_crypto_sign_keypair()などを使用します。
秘密鍵は非常に機密性の高い情報であり、その管理には最大の注意を払う必要があります。公開鍵は公開できますが、秘密鍵が漏洩すると署名システムの安全性が失われます。
関数の戻り値はバイナリ形式の公開鍵文字列ですので、内容を確認したり表示したりする際は、bin2hex()関数などを使って16進数に変換すると分かりやすいでしょう。