【PHP8.x】openssl_private_encrypt関数の使い方

作成日: 更新日:

openssl_private_encrypt関数は、指定されたデータ(平文)を秘密鍵を使用して暗号化する処理を実行する関数です。この関数は、主に情報の「発信元を証明する」デジタル署名の作成において重要な役割を果たします。具体的には、あるメッセージのハッシュ値(メッセージの指紋のようなもの)を送信者の秘密鍵で暗号化し、その暗号化されたハッシュ値がデジタル署名として利用されます。これにより、受信者は対応する公開鍵で署名を復号し、元のハッシュ値と比較することで、メッセージが正規の送信者から送られ、途中で改ざんされていないことを検証できます。

この関数は、暗号化したい元のデータ、暗号化された結果を格納するための参照渡し変数、暗号化に用いる秘密鍵、そして適切なパディング方式を指定して呼び出します。パディング方式は、暗号化処理を安全に行うための詰め物のようなもので、OPENSSL_PKCS1_PADDINGなどが一般的です。処理が正常に完了した場合はtrueを、何らかの理由で失敗した場合はfalseを返します。失敗時にはopenssl_error_string()関数を使用することで、より詳細なエラー情報を取得することができます。データの真正性を保証する上で不可欠なセキュリティ機能を提供します。

基本的な使い方

構文(syntax)

<?php
// 暗号化したい元のデータ
$original_data = "This is a secret message to encrypt.";

// 暗号化されたデータが格納される変数(参照渡しのため、初期化しておきます)
$encrypted_data = '';

// 秘密鍵リソースまたは文字列
// 実際には、openssl_pkey_get_private() などで取得した OpenSSLAsymmetricKey オブジェクト、
// または秘密鍵の内容(文字列)、または秘密鍵ファイルへのパス(例: 'file:///path/to/private.key')を指定します。
// ここではファイルから秘密鍵を読み込む一般的な例を示します。
// 'path/to/your/private.key' は実際の秘密鍵ファイルへのパスに置き換えてください。
$private_key_contents = file_get_contents('path/to/your/private.key');
$private_key_resource = openssl_pkey_get_private($private_key_contents);

// openssl_private_encrypt 関数を呼び出してデータを秘密鍵で暗号化します。
// 成功した場合、$encrypted_data に暗号化されたデータが格納され、trueが返されます。
// 失敗した場合は false が返されます。
$success = openssl_private_encrypt($original_data, $encrypted_data, $private_key_resource, OPENSSL_PKCS1_PADDING);
?>

引数(parameters)

string $data, string & $encrypted_data, mixed $private_key, int $padding = OPENSSL_PKCS1_PADDING

  • string $data: 暗号化したいデータ。
  • string & $encrypted_data: 暗号化されたデータが格納される変数。参照渡し。
  • mixed $private_key: 使用する秘密鍵。
  • int $padding = OPENSSL_PKCS1_PADDING: パディング方式を指定する整数。デフォルトは OPENSSL_PKCS1_PADDING。

戻り値(return)

bool

openssl_private_encrypt関数は、秘密鍵を使用してデータを暗号化できるかを成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP OpenSSL プライベートキー暗号化の例

<?php

/**
 * OpenSSLのopenssl_private_encrypt関数を使ったデータの暗号化と復号のサンプルです。
 *
 * openssl_private_encryptは、プライベートキーでデータを暗号化し、
 * 対応する公開キーで復号する用途で使われます。
 * これは主に送信者の身元を証明するデジタル署名や、特定の認証プロトコルで使用される方式です。
 * 一般的な公開鍵暗号(受信者の公開鍵で暗号化し、受信者の秘密鍵で復号する)とは目的が異なります。
 *
 * @param string $dataToEncrypt 暗号化する元のデータ
 * @return bool 処理が成功した場合はtrue、失敗した場合はfalseを返します。
 */
function demonstrateOpenSSLPrivateEncrypt(string $dataToEncrypt): bool
{
    // 1. RSAキーペアの生成 (テスト目的で一時的に生成)
    // 実際の本番環境では、事前に生成されたキーペアを使用し、安全に管理してください。
    $config = [
        "digest_alg" => "sha512",           // ハッシュアルゴリズム
        "private_key_bits" => 2048,        // プライベートキーのビット数 (推奨されるサイズ)
        "private_key_type" => OPENSSL_KEYTYPE_RSA, // キータイプ (RSAを使用)
    ];

    // 新しいキーペア (プライベートキーと公開キー) を生成
    $keyResource = openssl_pkey_new($config);

    if (!$keyResource) {
        echo "エラー: キーペアの生成に失敗しました。\n";
        echo "詳細: " . openssl_error_string() . "\n";
        return false;
    }

    // 生成したプライベートキーをPEM形式でエクスポート
    openssl_pkey_export($keyResource, $privateKeyPem);

    // 生成した公開キーをPEM形式で取得
    $publicKeyDetails = openssl_pkey_get_details($keyResource);
    $publicKeyPem = $publicKeyDetails['key'];

    echo "--- OpenSSL プライベートキー暗号化のデモンストレーション ---\n";
    echo "元のデータ: " . $dataToEncrypt . "\n";
    echo "生成されたプライベートキー (抜粋):\n" . substr($privateKeyPem, 0, 100) . "...\n";
    echo "生成された公開キー (抜粋):\n" . substr($publicKeyPem, 0, 100) . "...\n";

    // 2. プライベートキーを使用してデータを暗号化 (openssl_private_encrypt)
    $encryptedData = ''; // 暗号化されたデータが格納される変数を初期化
    $encryptionSuccess = openssl_private_encrypt(
        $dataToEncrypt,
        $encryptedData,
        $privateKeyPem,
        OPENSSL_PKCS1_PADDING // パディング方式 (デフォルトでPKCS#1)
    );

    if ($encryptionSuccess) {
        echo "\nデータの暗号化に成功しました。\n";
        // 暗号化されたデータはバイナリ形式なので、表示のためにBase64エンコードします。
        echo "暗号化されたデータ (Base64エンコード): " . base64_encode($encryptedData) . "\n";

        // 3. 対応する公開キーを使用してデータを復号 (openssl_public_decrypt)
        // openssl_private_encryptで暗号化されたデータは、openssl_public_decryptで復号されます。
        $decryptedData = ''; // 復号されたデータが格納される変数を初期化
        $decryptionSuccess = openssl_public_decrypt(
            $encryptedData,
            $decryptedData,
            $publicKeyPem,
            OPENSSL_PKCS1_PADDING // 暗号化時と同じパディング方式を指定
        );

        if ($decryptionSuccess) {
            echo "\nデータの復号に成功しました。\n";
            echo "復号されたデータ: " . $decryptedData . "\n";

            // 4. 元のデータと復号されたデータの比較
            if ($dataToEncrypt === $decryptedData) {
                echo "\n結果: 元のデータと復号されたデータは一致します。処理成功。\n";
                return true;
            } else {
                echo "\nエラー: 元のデータと復号されたデータが一致しません。\n";
                return false;
            }
        } else {
            echo "\nエラー: データの復号に失敗しました。\n";
            echo "詳細: " . openssl_error_string() . "\n";
            return false;
        }
    } else {
        echo "\nエラー: データの暗号化に失敗しました。\n";
        echo "詳細: " . openssl_error_string() . "\n";
        return false;
    }
}

// サンプル関数の実行
demonstrateOpenSSLPrivateEncrypt("システムエンジニアを目指す初心者のための、PHP OpenSSLプライベートキー暗号化のサンプルです。");

?>

PHPのopenssl_private_encrypt関数は、指定されたデータをプライベートキーで暗号化するために使用されます。この関数は、主に送信者の身元を証明するデジタル署名などの特定の認証プロトコルで利用され、暗号化したデータは対応する公開キーを用いてopenssl_public_decrypt関数で復号できます。一般的な公開鍵暗号(受信者の公開鍵で暗号化し、受信者の秘密鍵で復号する)とは目的が異なりますのでご注意ください。

引数について説明します。$dataには暗号化したい元の文字列データを指定します。&$encrypted_dataは暗号化された結果が格納される参照引数で、この変数に暗号文が書き込まれます。$private_keyには暗号化に使用するプライベートキーを、ファイルパス、PEM形式の文字列、またはOpenSSLリソースとして渡します。$paddingはパディング方式を指定するオプション引数で、通常はOPENSSL_PKCS1_PADDINGを使用します。関数は処理が成功した場合はtrue、失敗した場合はfalseをブール値として返します。

提供されたサンプルコードでは、まず一時的なRSAキーペアを生成し、そのプライベートキーを使ってデータを暗号化しています。その後、生成された公開キーでデータを復号し、元のデータと一致するかを確認することで、この関数の一連の動作とデジタル署名的な用途を示しています。実際には、キーペアの安全な管理が非常に重要である点も留意してください。

openssl_private_encrypt関数は、一般的な公開鍵暗号とは異なり、主にデジタル署名や認証のために、送信者のプライベートキーでデータを暗号化し、対応する公開キーで復号する用途で使われます。本番環境では、サンプルコードのように一時的にキーを生成せず、事前に生成し安全に管理されたキーペアを使用してください。プライベートキーの漏洩は重大なセキュリティリスクとなります。暗号化と復号の際には、必ず同じパディング方式を指定する必要があります。また、暗号化されたデータはバイナリ形式のため、表示や転送の際はBase64エンコードなどでテキスト形式に変換して扱ってください。関数の実行結果は戻り値で確認し、失敗時にはopenssl_error_string()でエラー詳細を確認し、適切に処理を中断することが大切です。

【PHP8.x】openssl_private_encrypt関数の使い方 | いっしー@Webエンジニア