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() にパスフレーズを渡せば良い。