Решил так.
Файлы ключей генерирую командами:
openssl genrsa -des3 -out private_rsa.pem 2048
openssl rsa -in private_rsa.pem -outform PEM -pubout -out public_rsa.pem
Код для работы получился вот такой:
class SomeClass
{
#region PROPERTIES
protected static $public_key;
protected static $private_key;
const KEY_PASSPHRASE = 'key_passphrase';
#endregion
#region PUBLIC METHODS
public function __construct()
{
$keys_dir = dirname(__FILE__) . '/../keys/encrypt/';
$public_key_path = realpath($keys_dir . 'public_rsa.pem');
$private_key_path = realpath($keys_dir . 'private_rsa.pem');
self::$public_key = file_get_contents($public_key_path);
self::$private_key = file_get_contents($private_key_path);
}
public function encode($data)
{
if (is_numeric($data) === false || is_string($data) === false) {
$data = JSON::encode($data);
}
$encrypted = null;
if (openssl_public_encrypt($data, $encrypted, self::$public_key)) {
$encrypted = base64_encode($encrypted);
} else {
throw new Exception('Не удалось зашифровать данные. ' . openssl_error_string());
}
return $encrypted;
}
public function decode($data)
{
$decrypted = null;
openssl_private_decrypt(base64_decode($data), $decrypted, openssl_pkey_get_private(self::$private_key, self::KEY_PASSPHRASE));
return $decrypted;
}
#endregion
}