KARTz.RU
кушаешь морковь – встанет вновь и вновь

Несиметричное шифрование в PHP

Ноябрь 13th, 2012

Учитывая отсутствие внятной документации и кучу примеров с генерированием непонятных сертификатов, пишу эту заметку с рабочим примером в первую очередь сам для себя.

Шаг первый. Генерируем ключи.


$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);


Filed under: Без рубрики | Метки: ,
Ноябрь 13th, 2012 04:19:25

Похожие посты:
no comments
Leave a Reply