PHP 8.5.0 Alpha 1 available for testing

openssl_open

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

openssl_openAbre datos sellados

Descripción

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() abre (descifra) data utilizando una clave de envoltura que se descifra a partir de encrypted_key utilizando private_key. La descifrado se realiza mediante cipher_algo y iv. El IV es requerido únicamente si el método de cifrado lo exige. La función llena output con los datos descifrados. La clave de envoltura generalmente se genera cuando los datos son sellados utilizando una clave pública asociada a la clave privada. Consulte openssl_seal() para más información.

Parámetros

data

Los datos sellados.

output

Si la llamada tiene éxito, los datos abiertos son devueltos en este parámetro.

encrypted_key

La clave simétrica cifrada que puede ser descifrada utilizando private_key

private_key

La clave privada utilizada para descifrar encrypted_key.

cipher_algo

El método de cifrado utilizado para el descifrado de data.

Precaución

El valor por omisión para las versiones de PHP anteriores a 8.0 es ('RC4'), que es considerada como no segura. Se recomienda fuertemente especificar explícitamente un método de cifrado seguro.

iv

El vector de inicialización utilizado para el descifrado de data. Es requerido si el método de cifrado necesita un IV. Esto puede ser determinado llamando a openssl_cipher_iv_length() con cipher_algo.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Historial de cambios

Versión Descripción
8.0.0 private_key ahora acepta una instancia de OpenSSLAsymmetricKey o OpenSSLCertificate; anteriormente, se aceptaba un recurso de tipo OpenSSL key o OpenSSL X.509 CSR.
8.0.0 cipher_algo ya no es un parámetro opcional.

Ejemplos

Ejemplo #1 Ejemplo con openssl_open()

<?php

// Se asume que $sealed, $env_key y $iv contienen los datos sellados,
// la clave de envoltura y el IV. Todos proporcionados por el remitente.

// Obtener la clave privada desde el archivo ubicado en private_key.pem
$pkey = openssl_get_privatekey("file://private_key.pem");

// Descifrado de los datos: se colocan en $open
if (openssl_open($sealed, $open, $env_key, $pkey, 'AES256', $iv)) {
echo
"Aquí están los datos descifrados: ", $open;
} else {
echo
"No se pudo descifrar los datos";
}

?>

Ver también

add a note

User Contributed Notes 2 notes

up
1
sdc
14 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
16 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