PHP Conference Nagoya 2025

openssl_open

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

openssl_openOuvre des données scellées

Description

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

La openssl_open() ouvre (décrypte) data en utilisant une clé d'enveloppe qui est décryptée à partir de encrypted_key en utilisant private_key. La décryption est effectuée à l'aide de cipher_algo et iv. Le VI est requis uniquement si la méthode de chiffrement l'exige. La fonction remplit output avec les données décryptées. La clé d'enveloppe est généralement générée lorsque les données sont scellées à l'aide d'une clé publique associée à la clé privée. Consultez openssl_seal() pour plus d'informations.

Liste de paramètres

data

Les données scellées.

output

Si l'appel a réussi, les données ouvertes sont retournées dans ce paramètre.

encrypted_key

La clé symétrique chiffrée qui peut être décryptée à l'aide de private_key

private_key

La clé privée utilisée pour déchiffrer encrypted_key.

cipher_algo

La méthode de chiffrement utilisée pour le déchiffrement de data.

Attention

La valeur par défaut pour les versions de PHP antérieures à 8.0 est ('RC4'), qui est considérée comme non sécurisée. Il est fortement recommandé de spécifier explicitement une méthode de chiffrement sécurisée.

iv

Le vecteur d'initialisation utilisé pour le déchiffrement de data. Il est requis si la méthode de chiffrement nécessite un VI. Cela peut être déterminé en appelant openssl_cipher_iv_length() avec cipher_algo.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version Description
8.0.0 private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 CSR était acceptée.
8.0.0 cipher_algo n'est désormais plus un paramètre optionnel.

Exemples

Exemple #1 Exemple avec openssl_open()

<?php

// On suppose que $sealed, $env_key et $iv contiennent les données scellées,
// la clé d'enveloppe et IV. Toutes ournies par l'expéditeur.

// Récupérer la clé privée depuis le fichier situé dans private_key.pem
$pkey = openssl_get_privatekey("file://private_key.pem");

// Déchiffrage des données : elles sont placées dans $open
if (openssl_open($sealed, $open, $env_key, $pkey, 'AES256', $iv)) {
echo
"Voici les données déchiffrées : ", $open;
} else {
echo
"Impossible de déchiffrer les données";
}

?>

Voir aussi

add a note

User Contributed Notes 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