Несиметричное шифрование в PHP
Учитывая отсутствие внятной документации и кучу примеров с генерированием непонятных сертификатов, пишу эту заметку с рабочим примером в первую очередь сам для себя.
Шаг первый. Генерируем ключи.
$privateKey = openssl_pkey_new(array(
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
openssl_pkey_export($privateKey, $privstr);
$keyDetails = openssl_pkey_get_details($privateKey);
$pubstr=$keyDetails['key'];
Теперь имеем переменные $pubstr и $privstr с публичным и секретным ключами соответственно. Значения этих переменных надо как-то сохранить, исключив несанкционированное чтение секретного ключа. Больше этот код запускать не нужно: ключи уже сгенерированы. Теперь используем готовые ключи в примерно таком виде:
$privstr='-----BEGIN RSA PRIVATE KEY-----
тру-ля-ля=
-----END RSA PRIVATE KEY-----
';
$pubstr='-----BEGIN PUBLIC KEY-----
парам-пам-рам
-----END PUBLIC KEY-----
';
Шаг второй шифруемся и дешифруемся:
openssl_public_encrypt($sensitiveData, $encryptedData, $pubstr);
openssl_private_decrypt($encryptedData, $decrypted, $privstr);
Как мы видим, для шифрования используется публичный ключ, а для дешифровки – секретный.
Шаг три. Подписываем и проверяем подпись. Тут всё чуточку сложнее – надо подготовить ключи.
$pkeyid = openssl_get_privatekey($privstr);
openssl_sign($data, $signature, $pkeyid);
$pubkeyid = openssl_get_publickey($pubstr);
$ok = openssl_verify($data, $signature, $pubkeyid);