(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
openssl_pkey_new — Gera uma nova chave privada
openssl_pkey_new() gera uma nova chave privada. Como obter o componente público da chave é mostrado no exemplo abaixo.
Nota: É preciso ter um arquivo openssl.cnf válido instalado para que esta função funcione corretamente. Consulte as notas na seção de instalação para obter mais informações.
options
É possível fazer ajuste fino na geração de chaves (como especificar o número de
bits ou parâmetros) usando options
.
Estas opções podem ser parâmetro específicos do algoritmo usado para geração da chave
ou opções genéricas usadas também na geração de CSR se não especificadas.
Consulte openssl_csr_new() para obter mais informações sobre
como usar o parâmetro options
para um CSR.
Entre estas opções, somente private_key_bits
,
private_key_type
, curve_name
,
e config
são usadas para geração de chaves.
Opções específicas de algoritmos são usadas se o array associativo incluir uma das chaves específicas.
"rsa"
para definir os parâmetros RSA.
Opções | Tipo | Formato | Obrigatória | Descrição |
---|---|---|---|---|
"n" |
string | número binário | sim | resto |
"e" |
string | número binário | não | expoente público |
"d" |
string | número binário | sim | expoente privado |
"p" |
string | número binário | não | primo 1 |
"q" |
string | número binário | não | primo 2 |
"dmp1" |
string | número binário | não | expoente 1, d mod (p-1) |
"dmq1" |
string | número binário | não | expoente 2, d mod (q-1) |
"iqmp" |
string | número binário | não | coeficiente, (inverso de q) mod p |
"dsa"
para definir parâmetros DSA.
Opções | Tipo | Formato | Obrigatória | description |
---|---|---|---|---|
"p" |
string | número binário | não | número primo (público) |
"q" |
string | número binário | não | subprimo de 160 bits, q | p-1 (público) |
"g" |
string | número binário | não | gerador de subgrupo (público) |
"priv_key" |
string | chave PEM | não | chave privada x |
"pub_key" |
string | chave PEM | não | chave pública y = g^x |
"dh"
para parâmetros DH (troca de chaves Diffie–Hellman).
Opções | Tipo | Formato | Obrigatória | Descrição |
---|---|---|---|---|
"p" |
string | número binário | não | número primo (compartilhado) |
"g" |
string | número binário | não | gerador de Z_p (compartilhado) |
"priv_key" |
string | chave PEM | não | valor x do DH privado |
"pub_key" |
string | chave PEM | não | valor g^x do DH público |
"ec"
para parâmetros de curva elíptica
Opções | Tipo | Formato | Obrigatória | Descrição |
---|---|---|---|---|
"curve_name" |
string | Nome | não | Nome da curva, consulte openssl_get_curve_names() |
"p" |
string | número binário | não | primo do campo para a curva sobre Fp |
"a" |
string | número binário | não | coeficiente da curva para Fp: y^2 mod p = x^3 + ax + b mod p |
"b" |
string | número binário | não | coeficiente da curva para Fp: y^2 mod p = x^3 + ax + b mod p |
"seed" |
string | número binário | não | semente de número aleatório opcional usada para gerar o coeficiente b |
"generator" |
string | ponto codificado em binário | não | ponto de geração da curva |
"g_x" |
string | número binário | não | coordenada x do ponto de geração da curva |
"g_y" |
string | número binário | não | coordenada y do ponto de geração da curva |
"cofactor" |
string | número binário | não | co-fator da curva |
"order" |
string | número binário | não | ordem da curva |
"x" |
string | número binário | não | coordenada x (pública) |
"y" |
string | número binário | não | coordenada y (pública) |
"d" |
string | número binário | não | chave privada |
"x25519"
, "x448"
,
"ed25519"
e "ed448"
para
parâmetros Curve25519 e Curve448.
Opções | Tipo | Formato | Obrigatória | Descrição |
---|---|---|---|---|
"priv_key" |
string | chave PEM | não | chave privada |
"pub_key" |
string | chave PEM | não | chave pública |
Retorna uma instância de OpenSSLAsymmetricKey para
a chave privada em caso de sucesso ou false
em caso de erro.
Versão | Descrição |
---|---|
8.4.0 |
Adicionado suporte para chaves baseadas em Curve25519 e Curve448 com a instrodução dos
campos x25519 , ed25519 , x448
e ed448 .
|
8.3.0 |
Adicionado suporte para geração de chaves EC com parâmetros EC customizados.
Especificamente, com a introdução das opções EC:
p , a , b , seed ,
generator , g_x , g_y ,
cofactor e order .
|
8.0.0 |
Em caso de sucesso, esta função retorna uma instância OpenSSLAsymmetricKey agora;
anteriormente, retornava um resource do tipo OpenSSL key .
|
7.1.0 |
A chave curve_name do parâmetro options foi
adicionada para tornar possível a criação de chaves EC com base nos algoritmos de Curva Elíptica.
|
Exemplo #1 Obtendo a chave pública de uma chave 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);
?>
O exemplo acima produzirá algo semelhante a:
// Saída anterior ao PHP 8.0.0; observe que a função retorna um 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) // Saída a partir do PHP 8.0.0; observe que a função retorna um 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) { }
Exemplo #2 Gerando chave 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);
?>