(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
openssl_pkey_new — Генерирует новый закрытый ключ
Функция openssl_pkey_new() создаёт новый закрытый ключ. Пример на этой странице показывает, как получить открытую часть ключа.
Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.
options
Можно точно настроить генерацию ключей (например, указав количество бит или параметров)
с помощью параметра options.
Параметры могут быть либо специфическими для алгоритма, используемыми для генерации ключей,
либо общими параметрами, используемыми также при генерации CSR,
если не указано иное.
Посмотрите документацию функции openssl_csr_new() для получения дополнительной
информации о том, как использовать параметр options для CSR.
Среди этих опций для генерации ключей используются только private_key_bits, private_key_type,
curve_name и config.
Опции, специфичные для алгоритма, используются,
если ассоциативный массив содержит один из специфических ключей.
"rsa" для настройки параметров RSA.
| Опции | Тип | Формат | Обязательность | Описание |
|---|---|---|---|---|
"n" |
string | двоичное число | да | modulus |
"e" |
string | двоичное число | нет | public exponent |
"d" |
string | двоичное число | да | private exponent |
"p" |
string | двоичное число | нет | prime 1 |
"q" |
string | двоичное число | нет | prime 2 |
"dmp1" |
string | двоичное число | нет | exponent1, d mod (p-1) |
"dmq1" |
string | двоичное число | нет | exponent2, d mod (q-1) |
"iqmp" |
string | двоичное число | нет | coefficient, (inverse of q) mod p |
"dsa" для настройки параметров DSA.
| Опции | Тип | Формат | Обязательность | Описание |
|---|---|---|---|---|
"p" |
string | двоичное число | нет | prime number (public) |
"q" |
string | двоичное число | нет | 160-bit subprime, q | p-1 (public) |
"g" |
string | двоичное число | нет | generator of subgroup (public) |
"priv_key" |
string | Ключ PEM | нет | private key x |
"pub_key" |
string | Ключ PEM | нет | public key y = g^x |
"dh" для настройки параметров DH (Diffie–Hellman key exchange).
| Опции | Тип | Формат | Обязательность | Описание |
|---|---|---|---|---|
"p" |
string | двоичное число | нет | prime number (shared) |
"g" |
string | двоичное число | нет | generator of Z_p (shared) |
"priv_key" |
string | Ключ PEM | нет | private DH value x |
"pub_key" |
string | Ключ PEM | нет | public DH value g^x |
"ec" для настройки параметров Elliptic curve.
| Опции | Тип | Формат | Обязательность | Описание |
|---|---|---|---|---|
"curve_name" |
string | name | нет | name of curve, see openssl_get_curve_names() |
"p" |
string | двоичное число | нет | prime of the field for curve over Fp |
"a" |
string | двоичное число | нет | coofecient a of the curve for Fp: y^2 mod p = x^3 + ax + b mod p |
"b" |
string | двоичное число | нет | coofecient b of the curve for Fp: y^2 mod p = x^3 + ax + b mod p |
"seed" |
string | двоичное число | нет | optional random number seed used to generate coefficient b |
"generator" |
string | binary encoded point | нет | curve generator point |
"g_x" |
string | двоичное число | нет | curver generator point x coordinat |
"g_y" |
string | двоичное число | нет | curver generator point y coordinat |
"cofactor" |
string | двоичное число | нет | curve cofactor |
"order" |
string | двоичное число | нет | curve order |
"x" |
string | двоичное число | нет | x coordinate (public) |
"y" |
string | двоичное число | нет | y coordinate (public) |
"d" |
string | двоичное число | нет | private key |
"x25519", "x448",
"ed25519", "ed448"
для настройки параметров Curve25519 и Curve448.
| Опции | Тип | Формат | Обязательность | Описание |
|---|---|---|---|---|
"priv_key" |
string | Ключ PEM | нет | Закрытый ключ |
"pub_key" |
string | Ключ PEM | нет | Открытый ключ |
При успешном выполнении функция возвращает экземпляр класса OpenSSLAsymmetricKey
для закрытого ключа или false, если возникла ошибка.
| Версия | Описание |
|---|---|
| 8.4.0 |
Добавлена поддержка ключей на основе Curve25519 и Curve448 с добавлением полей
x25519, ed25519, x448
и ed448.
|
| 8.3.0 |
Добавлена поддержка создания ключей EC с настраиваемыми параметрами EC.
В частности, с введением опций EC:
p, a, b, seed,
generator, g_x, g_y,
cofactor и order.
|
| 8.0.0 |
В случае успешного выполнения функция возвращает экземпляр OpenSSLAsymmetricKey;
раньше возвращался ресурс (resource) типа OpenSSL key.
|
| 7.1.0 |
Для параметра options добавили ключ curve_name,
чтобы создавать EC-ключи на основе алгоритмов эллиптических кривых.
|
Пример #1 Пример получения открытой части ключа из закрытого ключа
<?php
$private_key = openssl_pkey_new();
$public_key_pem = openssl_pkey_get_details($private_key)['key'];
echo $public_key_pem, PHP_EOL;
$public_key = openssl_pkey_get_public($public_key_pem);
var_dump($public_key);
?>Вывод приведённого примера будет похож на:
// Вывод до PHP 8.0.0; обратите внимание, функция возвращает ресурс
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknBFEherZe74BiRjTFA
hqwZ1SK7brwq7C/afnLXKhRR7jnrpfM0ypC46q8xz5UZswenZakJ7kd5fls+r4Bv
3P8XsKYLTh2m1GiWQhV1g77cNIN4qNWh70PiDO3fB2446o1LBgToQYuRZS5YQRfJ
rVD0ysgtVcCU9tjaey28HlgApOpYFTaaKPj2MBmEYpMC+kG2HhL12GfpHUi2eiXI
dXT2WskWHWvUrmQ7fJIfI92JlDokV62DH/q1oiedLs9OPNb0rL1aAmYdzaVN6XNH
x/o4Lh125v2vAPV9E3fZCDc/HDEUaahpjanMiCQEgEDp5Hr+CRkvERT5/ydN+p08
5wIDAQAB
-----END PUBLIC KEY-----
resource(6) of type (OpenSSL key)
// Вывод с PHP 8.0.0; обратите внимание, функция возвращает объект
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknBFEherZe74BiRjTFA
hqwZ1SK7brwq7C/afnLXKhRR7jnrpfM0ypC46q8xz5UZswenZakJ7kd5fls+r4Bv
3P8XsKYLTh2m1GiWQhV1g77cNIN4qNWh70PiDO3fB2446o1LBgToQYuRZS5YQRfJ
rVD0ysgtVcCU9tjaey28HlgApOpYFTaaKPj2MBmEYpMC+kG2HhL12GfpHUi2eiXI
dXT2WskWHWvUrmQ7fJIfI92JlDokV62DH/q1oiedLs9OPNb0rL1aAmYdzaVN6XNH
x/o4Lh125v2vAPV9E3fZCDc/HDEUaahpjanMiCQEgEDp5Hr+CRkvERT5/ydN+p08
5wIDAQAB
-----END PUBLIC KEY-----
object(OpenSSLAsymmetricKey)#2 (0) {
}
Пример #2 Создание ключа RSA из параметров
<?php
$nhex = "BBF82F090682CE9C2338AC2B9DA871F7368D07EED41043A440D6B6F07454F51F" .
"B8DFBAAF035C02AB61EA48CEEB6FCD4876ED520D60E1EC4619719D8A5B8B807F" .
"AFB8E0A3DFC737723EE6B4B7D93A2584EE6A649D060953748834B2454598394E" .
"E0AAB12D7B61A51F527A9A41F6C1687FE2537298CA2A8F5946F8E5FD091DBDCB";
$ehex = "11";
$dhex = "A5DAFC5341FAF289C4B988DB30C1CDF83F31251E0668B42784813801579641B2" .
"9410B3C7998D6BC465745E5C392669D6870DA2C082A939E37FDCB82EC93EDAC9" .
"7FF3AD5950ACCFBC111C76F1A9529444E56AAF68C56C092CD38DC3BEF5D20A93" .
"9926ED4F74A13EDDFBE1A1CECC4894AF9428C2B7B8883FE4463A4BC85B1CB3C1";
$phex = "EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632" .
"124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599";
$qhex = "C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D86" .
"9840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503";
$dphex = "11";
$dqhex = "11";
$qinvhex = "b06c4fdabb6301198d265bdbae9423b380f271f73453885093077fcd39e2119f" .
"c98632154f5883b167a967bf402b4e9e2e0f9656e698ea3666edfb25798039f7";
$rsa= openssl_pkey_new([
'rsa' => [
'n' => hex2bin($nhex),
'e' => hex2bin($ehex),
'd' => hex2bin($dhex),
'p' => hex2bin($phex),
'q' => hex2bin($qhex),
'dmp1' => hex2bin($dphex),
'dmq1' => hex2bin($dqhex),
'iqmp' => hex2bin($qinvhex),
],
]);
$details = openssl_pkey_get_details($rsa);
var_dump($details);
?>