(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
openssl_pkey_new — Genera una nueva clave privada
openssl_pkey_new() genera una nueva clave privada. Cómo obtener el componente público de la clave se demuestra en un ejemplo a continuación.
Nota: Necesita tener instalado un openssl.cnf válido para que esta función opere correctamente. Vea las notas sobre la sección de instalación para más información.
options
Es posible afinar la generación de claves (por ejemplo, especificando
el número de bits o los parámetros) mediante el argumento options
.
Estas opciones pueden ser parámetros específicos del algoritmo utilizados para la
generación de claves, u opciones genéricas también utilizadas para la generación
de CSR si no se especifican.
Consulte openssl_csr_new() para obtener más información
sobre el uso de options
para un CSR.
Entre estas opciones, solo private_key_bits
,
private_key_type
, curve_name
,
y config
se utilizan para la generación de claves.
Las opciones específicas de un algoritmo se utilizan si el array asociativo incluye
una de las claves específicas.
"rsa"
para definir los parámetros RSA.
options | type | format | requis | description |
---|---|---|---|---|
"n" |
string | número binario | sí | módulo |
"e" |
string | número binario | no | exponente público |
"d" |
string | número binario | sí | exponente privado |
"p" |
string | número binario | no | primer 1 |
"q" |
string | número binario | no | primer 2 |
"dmp1" |
string | número binario | no | exponent1, d mod (p-1) |
"dmq1" |
string | número binario | no | exponent2, d mod (q-1) |
"iqmp" |
string | número binario | no | coeficiente, (inverso de q) mod p |
"dsa"
para definir los parámetros DSA.
options | type | format | requis | description |
---|---|---|---|---|
"p" |
string | número binario | no | número primo (público) |
"q" |
string | número binario | no | 160 bits sub-prime, q | p-1 (público) |
"g" |
string | número binario | no | generador del subgrupo (público) |
"priv_key" |
string | clave PEM | no | clave privada x |
"pub_key" |
string | clave PEM | no | clave pública y = g^x |
"dh"
para los parámetros DH (intercambio de claves Diffie–Hellman).
Options | Tipo | Format | Requis | Descripción |
---|---|---|---|---|
"p" |
string | número binario | no | número primo (compartido) |
"g" |
string | número binario | no | generador de Z_p (compartido) |
"priv_key" |
string | clave PEM | no | valor DH privado x |
"pub_key" |
string | clave PEM | no | valor DH público g^x |
"ec"
para los parámetros de curva elíptica
Options | Tipo | Format | Requis | Descripción |
---|---|---|---|---|
"curve_name" |
string | nombre | no | nombre de la curva, ver openssl_get_curve_names() |
"p" |
string | número binario | no | número primo del campo para la curva sobre Fp |
"a" |
string | número binario | no | coeficiente a de la curva para Fp : y^2 mod p = x^3 + ax + b mod p |
"b" |
string | número binario | no | coeficiente b de la curva para Fp : y^2 mod p = x^3 + ax + b mod p |
"seed" |
string | número binario | no | número aleatorio opcional utilizado para generar el coeficiente b |
"generator" |
string | punto codificado en binario | no | punto generador de la curva |
"g_x" |
string | número binario | no | coordenada x del punto generador de la curva |
"g_y" |
string | número binario | no | coordenada y del punto generador de la curva |
"cofactor" |
string | número binario | no | cofactor de la curva |
"order" |
string | número binario | no | orden de la curva |
"x" |
string | número binario | no | coordenada x (pública) |
"y" |
string | número binario | no | coordenada y (pública) |
"d" |
string | número binario | no | clave privada |
"x25519"
, "x448"
,
"ed25519"
, "ed448"
para
los parámetros Curve25519 y Curve448.
Options | Tipo | Format | Requis | Descripción |
---|---|---|---|---|
"priv_key" |
string | clave PEM | no | clave privada |
"pub_key" |
string | clave PEM | no | clave pública |
Devuelve una instancia de OpenSSLAsymmetricKey en caso de éxito, false
en caso de error.
Versión | Descripción |
---|---|
8.4.0 |
Se añadió el soporte para claves basadas en Curve25519 y Curve448 con la introducción de
los campos x25519 , ed25519 , x448 ,
y ed448 .
|
8.3.0 |
Se añadió el soporte para la generación de claves EC con parámetros EC personalizados.
Más específicamente, con la introducción de las opciones EC:
p , a , b , seed ,
generator , g_x , g_y ,
cofactor , y order .
|
8.0.0 |
En caso de éxito, esta función devuelve ahora una instancia de
OpenSSLAsymmetricKey;
anteriormente, se devolvía un recurso de tipo OpenSSL key .
|
7.1.0 |
Se añadió la opción curve_name
para permitir la creación de claves EC.
|
Ejemplo #1 Obtener la clave pública a partir de una clave privada
<?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);
?>
El resultado del ejemplo sería algo similar a:
// Resultado antes de PHP 8.0.0; note que la función devuelve un recurso -----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) // Resultado a partir de PHP 8.0.0; note que la función devuelve un objeto -----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) { }
Ejemplo #2 Generación de una clave RSA a partir de parámetros
<?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);
?>