PHPで公開鍵・秘密鍵それぞれで、暗号化・復号化することがあったのでその時のメモ。

基本的には openssl_get_privatekey()openssl_get_publickey() で秘密鍵・公開鍵のオブジェクトを作成し、openssl_private_encrypt()openssl_private_decrypt() (公開鍵では openssl_public_***() メソッド) を使った暗号化・復号化すればいいだけ。

秘密鍵で暗号化し、公開鍵で復号化

function getPrivateKey($file, $passphrase = null) {
    $f = fopen($file, "r");
    $c = fread($f, filesize($file));
    return openssl_get_privatekey($c, $passphrase);
}

function getPublicKey($file) {
    $f = fopen($file, "r");
    $c = fread($f, filesize($file));
    return openssl_get_publickey($c);
}

$data = "Test data to be encrypted";
$privateKeyFile = __DIR__ . "/test_key";
$pubilcKeyFile = __DIR__ . "/test_key.pub";

// 秘密鍵で暗号化
$privatekey = getPrivateKey($privateKeyFile);
$encdata;
openssl_private_encrypt($data, $encdata, $privatekey);

// 暗号化されたデータ
var_dump($encdata);

// 公開鍵で復号化
$publickey = getPublicKey($pubilcKeyFile);
$decdata;
openssl_public_decrypt($encdata, $decdata, $publickey);

// 復号化されたデータ
var_dump($decdata);

公開鍵で暗号化、秘密鍵で復号化

// getPrivateKey(), getPublicKey()、その他共通部は上記参照

// 公開鍵で暗号化
$publickey = getPublicKey($pubilcKeyFile);
$encdata;
openssl_public_encrypt($data, $encdata, $publickey);

// 暗号化されたデータ
var_dump($encdata);

// 秘密鍵で復号化
$privatekey = getPrivateKey($privateKeyFile);
$decdata;
openssl_private_decrypt($encdata, $decdata, $privatekey);

// 復号化されたデータ
var_dump($decdata);

秘密鍵にパスフレーズをつけた場合

秘密鍵にパスフレーズをつけた場合は、openssl_get_privatekey() にパスフレーズを渡せば良い。