PHP.mk документација

openssl_pkey_new

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.openssl-pkey-new.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.openssl-pkey-new.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
openssl_pkey_new

Референца за `function.openssl-pkey-new.php` со подобрена типографија и навигација.

function.openssl-pkey-new.php

openssl_pkey_new

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_newГенерира нов приватен клуч

= NULL

openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|false

openssl_pkey_new() генерира нов приватен клуч. Како да се добие јавната компонента на клучот е прикажано во примерот подолу.

Забелешка: Треба да имате валиден openssl.cnf инсталиран за оваа функција да работи правилно. Погледнете ги белешките под делот за инсталација Користење на PHP од командната линија

Параметри

options

Можно е да се фино подеси генерирањето на клучот (на пр. специфицирање на бројот на битови или параметри) користејќи го options параметар. Овие опции можат да бидат или специфични параметри за алгоритам што се користат за генерирање на клучот, или општи опции што се користат и во CSRгенерирање ако не се специфицирани. Погледнете openssl_csr_new() за повеќе информации за тоа како да се користи options за CSR. Меѓу тие опции само private_key_bits, private_key_type, curve_nameПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во config се користат за генерирање на клучот. Опциите специфични за алгоритам се користат ако асоцијативниот низ вклучува еден од специфичните клучеви.

  • "rsa" клуч за поставување на RSA параметри.
    options type format required description
    "n" string бинарниот број yes modulus
    "e" string бинарниот број no јавниот експонент
    "d" string бинарниот број yes приватниот експонент
    "p" string бинарниот број no прим 1
    "q" string бинарниот број no прим 2
    "dmp1" string бинарниот број no експонент1, d mod (p-1)
    "dmq1" string бинарниот број no експонент2, d mod (q-1)
    "iqmp" string бинарниот број no коефициент, (инверзно од q) mod p
  • "dsa" клуч за поставување на DSA параметри.
    options type format required description
    "p" string бинарниот број no прим број (јавен)
    "q" string бинарниот број no 160-битен подпрост, q | p-1 (јавно)
    "g" string бинарниот број no генератор на подгрупа (јавно)
    "priv_key" string PEM клуч no приватен клуч x
    "pub_key" string PEM клуч no јавен клуч y = g^x
  • "dh" клуч за DH (Дифи-Хелман размена на клучеви) параметри.
    Опции Тип Формат Задолжително = NULL
    "p" string бинарниот број no прост број (споделен)
    "g" string бинарниот број no генератор на Z_p (споделен)
    "priv_key" string PEM клуч no приватна DH вредност x
    "pub_key" string PEM клуч no јавна DH вредност g^x
  • "ec" клуч за параметри на елиптична крива
    Опции Тип Формат Задолжително = NULL
    "curve_name" string name no име на крива, види openssl_get_curve_names()
    "p" string бинарниот број no прост број на полето за крива над Fp
    "a" string бинарниот број no коефициент a на кривата за Fp: y^2 mod p = x^3 + ax + b mod p
    "b" string бинарниот број no коефициент b на кривата за Fp: y^2 mod p = x^3 + ax + b mod p
    "seed" string бинарниот број no опционално семе за случаен број што се користи за генерирање на коефициентот b
    "generator" string бинарно кодирана точка no генераторска точка на кривата
    "g_x" string бинарниот број no x координата на генераторската точка на кривата
    "g_y" string бинарниот број no координата y на генераторската точка на кривата
    "cofactor" string бинарниот број no кофактор на кривата
    "order" string бинарниот број no ред на кривата
    "x" string бинарниот број no x координата (јавна)
    "y" string бинарниот број no y координата (јавна)
    "d" string бинарниот број no приватен клуч
  • "x25519", "x448", "ed25519", "ed448" клучови за параметрите Curve25519 и Curve448.
    Опции Тип Формат Задолжително = NULL
    "priv_key" string PEM клуч no приватен клуч
    "pub_key" string PEM клуч no јавен клуч

Вратени вредности

Враќа OpenSSLAsymmetricKey инстанца за pkey при успех, или false при грешка.

Дневник на промени

Верзија = NULL
8.4.0 Додадена е поддршка за клучеви базирани на Curve25519 и Curve448 со воведувањето на x25519, ed25519, x448Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во ed448 fields.
8.3.0 Додадена е поддршка за генерирање EC клучеви со прилагодени EC параметри. Конкретно со воведувањето на EC опциите: p, a, b, seed, generator, g_x, g_y, cofactorПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во order.
8.0.0 При успех, оваа функција враќа OpenSSLAsymmetricKey инстанца сега; претходно, а resource од тип OpenSSL key .
7.1.0 На curve_name клучот на options параметарот беше додаден за да се овозможи создавање 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);

?>

Горниот пример ќе прикаже нешто слично на:

// Output prior to PHP 8.0.0; note, the function returns a resource
-----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)

// Output as of PHP 8.0.0; note, the function returns an object
-----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);

?>

Белешки од корисници 8 белешки

dirt на awoms dot com
12 години пред
Working example:

$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
    
// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);

// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

$data = 'plaintext data goes here';

// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);

// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo $decrypted;
gomez dot alejandre на gmail dot com
пред 7 години
Not forget the $configArgs for windows users :D, or the method throws a error with the primary key

//write your configurations :D
$configargs = array(
  "config" => "C:/xampp/php/extras/openssl/openssl.cnf",
  'private_key_bits'=> 2048,
  'default_md' => "sha256",
);

// Create the keypair
$res=openssl_pkey_new($configargs);
// Get private key
openssl_pkey_export($res, $privKey,NULL,$configargs);

and it's for all methods ._ .

a full implementation example here.

https://gist.github.com/DuckHunter213/269a0efd17e709f7f1f177ae7da46ad1

this error take me 3 full days you'r welcome :)
scott на brynen dot com
пред 11 години
If you try and generate a new key using openssl_pkey_new(), and need to specify the size of the key, the key MUST be type-bound to integer

// works
$keysize = 1024;
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// fails
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// works (force to int)
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => (int)$keysize));
Ендрју
пред 4 години
It's not documented here but you can also create ECC keys from existing key parameters (e.g. from JWK):

<?php
$key = openssl_pkey_new([
    'ec' => [
        'curve_name' => 'prime256v1',
        'x' => $someXValue,
        'y' => $someYValue,
        'd' => $someDValue
    ]
]);
?>

You can just provide x/y if it's a public key, or you can just provide d if it's a private key.
vike2000 на google mail домејн
пред 17 години
It's easier than all that, if you just want the keys:

<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey);

// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
?>
Eno_CN на qq dot com
пред 1 година
Some examples for generating EC keypair 

EC - generate keypair with curve_name

<?php
/* 
 * Custom parameters x, y, and d are not supported with SM2 in OpenSSL 3.x.
 * Directly creating EVP_PKEY_CTX using EVP_PKEY_CTX_new_from_name(NULL, "SM2", NULL) 
 * will result in generating incorrect private keys (which cannot be correctly recognized 
 * by existing external applications based on the SM2 algorithm).
 */
$curve_name = 'SM2';
$pkey = openssl_pkey_new(array(
    'ec'=> array(
        'curve_name' => $curve_name,
    )
));

$details = openssl_pkey_get_details($pkey);
var_dump($details);
$pubkey = $details['key'];
openssl_pkey_export($pkey, $prikey);
echo 'Private Key:', PHP_EOL, $prikey, PHP_EOL;
echo 'Public Key:', PHP_EOL, $pubkey, PHP_EOL;
?>

EC - generate keypair with custom params (OSCCA WAPIP192v1 Elliptic curve)

<?php
$d = hex2bin('8D0AC65AAEA0D6B96254C65817D4A143A9E7A03876F1A37D'); // private key binary
$x = hex2bin('98E07AAD50C31F9189EBE6B8B5C70E5DEE59D7A8BC344CC6'); // public key x binary
$y = hex2bin('6109D3D96E52D0867B9D05D72D07BE5876A3D973E0E96792'); // public key y binary

$p = hex2bin('BDB6F4FE3E8B1D9E0DA8C0D46F4C318CEFE4AFE3B6B8551F');
$a = hex2bin('BB8E5E8FBC115E139FE6A814FE48AAA6F0ADA1AA5DF91985');
$b = hex2bin('1854BEBDC31B21B7AEFC80AB0ECD10D5B1B3308E6DBF11C1');
$g_x = hex2bin('4AD5F7048DE709AD51236DE65E4D4B482C836DC6E4106640');
$g_y = hex2bin('02BB3A02D4AAADACAE24817A4CA3A1B014B5270432DB27D2');
$order = hex2bin('BDB6F4FE3E8B1D9E0DA8C0D40FC962195DFAE76F56564677');

$pkey = openssl_pkey_new(array(
    'ec'=> array(
        'p' => $p,
        'a' => $a,
        'b' => $b,
        'order' => $order,
        'g_x' => $g_x,
        'g_y' => $g_y,
        //'d' => $d, // import the private key to generate keypairs
    )
));

$details = openssl_pkey_get_details($pkey);
var_dump($details);
$pubkey = $details['key'];
openssl_pkey_export($pkey, $prikey);
echo 'Private Key:', PHP_EOL, $prikey, PHP_EOL;
echo 'Public Key:', PHP_EOL, $pubkey, PHP_EOL;
?>

EC - generate keypair with custom params (SM2 curve)

<?php
$p = hex2bin('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF');
$a = hex2bin('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC');
$b = hex2bin('28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93');
$g_x = hex2bin('32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7');
$g_y = hex2bin('BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0');
$order = hex2bin('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123');

/* 
 * Custom parameters x, y, and d are not supported with SM2 in OpenSSL 3.x.
 * Directly creating EVP_PKEY_CTX using EVP_PKEY_CTX_new_from_name(NULL, "SM2", NULL) 
 * will result in generating incorrect private keys (which cannot be correctly recognized 
 * by existing external applications based on the SM2 algorithm).
 */
$pkey = openssl_pkey_new(array(
    'ec'=> array(
        'p' => $p,
        'a' => $a,
        'b' => $b,
        'order' => $order,
        'g_x' => $g_x,
        'g_y' => $g_y,
    )
));

/* 
 * It is not entirely the same as generating keys through the SM2 curve naming method.
 * So the generated key will be in PKCS8 format to store algorithm information.
 */
$details = openssl_pkey_get_details($pkey);
var_dump($details);
$pubkey = $details['key'];
openssl_pkey_export($pkey, $prikey);
echo 'Private Key:', PHP_EOL, $prikey, PHP_EOL;
echo 'Public Key:', PHP_EOL, $pubkey, PHP_EOL;
?>
fbgolly at gmail dot com
пред 7 години
In case this function returns false, then check your openssl.cnf and make sure that in the [req] section of this file the entry default_bits is not commented out.
dodginess на yahoo dot com
пред 9 години
If you're using openssl_pkey_new() in conjunction with openssl_csr_new() and want to change the CSR digest algorithm as well as specify a custom key size, the configuration override should be defined once and sent to both functions:

<?php
$config = array(
    'digest_alg' => 'sha1',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
);

$privkey = openssl_pkey_new($config);

$csr = openssl_csr_new($dn, $privkey, $config);
?>

Although openssl_pkey_new() will accept the 'digest_alg' argument it won't use it, and setting the value has no effect unless you also set this value for openssl_csr_new(). The reason for this is that the $config array is acting as a drop-in replacement for the values found in the openssl.cnf file, so it must contain all of the override values that you need even if the function they're being sent to won't use them.

Also, if you change the 'digest_alg' to something like 'sha256' and still get an MD5 signed CSR check your openssl.cnf file to see whether the digest algorithm you want to use is actually supported.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.