PHP Conference Nagoya 2025

openssl_open

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

openssl_openОткрывает запечатанные данные

Описание

openssl_open(
    string $data,
    #[\SensitiveParameter] string &$output,
    string $encrypted_key,
    #[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
    string $cipher_algo,
    ?string $iv = null
): bool

Функция openssl_open() открывает, или дешифрует, данные data ключом конверта, который получает после расшифровки зашифрованного ключа encrypted_key открытым ключом private_key. Расшифровать данные функции помогают алгоритм шифрования cipher_algo и вектор инициализации iv. Вектор инициализации требуется, только если его запрашивает метод шифрования. Функция заполняет аргумент output данными, которые расшифровала. Функция генерирует ключ конверта, когда данные запечатали открытым ключом, который связан с закрытым ключом. Подробнее о запечатке, или шифровании, данных рассказывает описание функции openssl_seal().

Список параметров

data

Запечатанные данные.

output

Функция заполнит аргумент открытыми данными, если завершит работу без ошибок.

encrypted_key

Симметричный ключ шифрования, который расшифровывают закрытым ключом private_key.

private_key

Закрытый ключ для расшифровки зашифрованного ключа encrypted_key.

cipher_algo

Метод шифрования для расшифровки данных data.

Предостережение

До PHP 8.0 по умолчанию параметру назначали значение 'RC4', которое считают небезопасным. Настоятельно рекомендуют явно указывать безопасный метод шифрования.

iv

Вектор инициализации для расшифровки данных data. Параметр устанавливают, только если методу шифрования требуется вектор инициализации. Значение вектора узнают путём вызова функции openssl_cipher_iv_length() с алгоритмом шифрования cipher_algo.

Возвращаемые значения

Функция возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия Описание
8.0.0 Параметр private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; раньше принимался ресурс (resource) с типом OpenSSL key или OpenSSL X.509 CSR.
8.0.0 Параметр cipher_algo теперь обязателен.

Примеры

Пример #1 Пример распечатки данных функцией openssl_open()

<?php

// Предположим, что переменные $sealed, $env_key и $iv содержат запечатанные данные,
// ключ конверта и вектор инициализации, которые прислал тот, кто запечатал данные

// Получаем закрытый ключ из файла private_key.pem
$pkey = openssl_get_privatekey("file://private_key.pem");

// Расшифровываем данные и сохраняем открытые данные в аргументе $open
if (openssl_open($sealed, $open, $env_key, $pkey, 'AES256', $iv)) {
echo
"Вот открытые данные: ", $open;
} else {
echo
"Не удалось открыть данные";
}

?>

Смотрите также

  • openssl_seal() - Запечатывает, или зашифровывает, данные

Добавить

Примечания пользователей 2 notes

up
2
sdc
13 years ago
PHP compiled without OpenSSL support? Here's how you can call the openssl command-line utility to achieve the same goal:

<?php
// $sealed and $env_key are assumed to contain the sealed data
// and our envelope key, both given to us by the sealer.

// specify private key file and passphrase
$pkey_file='key.pem';
$pkey_pp='netsvc';

// call openssl to decrypt envelope key
$ph=proc_open('openssl rsautl -decrypt -inkey '.
escapeshellarg($pkey_file).' -passin fd:3',array(
0 => array('pipe','r'), // stdin < envelope key
1 => array('pipe','w'), // stdout > decoded envelope key
2 => STDERR,
3 => array('pipe','r'), // < passphrase
),$pipes);
// write envelope key
fwrite($pipes[0],$env_key);
fclose($pipes[0]);
// write private key passphrase
fwrite($pipes[3],$pkey_pp);
fclose($pipes[3]);
// read decoded key, convert to hexadecimal
$env_key='';
while(!
feof($pipes[1])){
$env_key.=sprintf("%02x",ord(fgetc($pipes[1])));
}
fclose($pipes[1]);
if(
$xc=proc_close($ph)){
echo
"Exit code: $xc\n";
}

// call openssl to decryp
$ph=proc_open('openssl rc4 -d -iv 0 -K '.$env_key,array(
0 => array('pipe','r'), // stdin < sealed data
1 => array('pipe','w'), // stdout > opened data
2 => STDERR,
),
$pipes);
// write sealed data
fwrite($pipes[0],$sealed);
fclose($pipes[0]);
// read opened data
//$open=stream_get_contents($pipes[1]);
$open='';
while(!
feof($pipes[1])){
$open.=fgets($pipes[1]);
}
fclose($pipes[1]);
if(
$xc=proc_close($ph)){
echo
"Exit code: $xc\n";
}

// display the decrypted data
echo $open;

?>
up
0
Gareth Owen
15 years ago
Example code, assume mycert.pem is a certificate containing both private and public key.

$cert = file_get_contents("mycert.pem");

$public = openssl_get_publickey($cert);
$private = openssl_get_privatekey($cert);

$data = "I'm a lumberjack and I'm okay.";

echo "Data before: {$data}\n";
openssl_seal($data, $cipher, $e, array($public));

echo "Ciphertext: {$cipher}\n";

openssl_open($cipher, $open, $e[0], $private);
echo "Decrypted: {$open}\n";
To Top