International PHP Conference Berlin 2025

openssl_open

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

openssl_openÖffnet versiegelte Daten

Beschreibung

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() öffnet (entschlüsselt) data mit einem Umschlagschlüssel, der mit private_key aus encrypted_key entschlüsselt wird. Die Entschlüsselung erfolgt mit cipher_algo und iv. Der IV wird nur benötigt, wenn die Verschlüsselungsmethode dies erfordert. Die Funktion füllt output mit den entschlüsselten Daten. Der Umschlagschlüssel wird normalerweise erzeugt, wenn die Daten mit einem öffentlichen Schlüssel versiegelt werden, der mit dem privaten Schlüssel verknüpft ist. Siehe openssl_seal() für weitere Informationen.

Parameter-Liste

data

Die versiegelten Daten.

output

Bei erfolgreicher Ausführung werden die geöffneten Daten in diesem Parameter zurückgegeben.

encrypted_key

Der verschlüsselte symmetrische Schlüssel, der mit private_key entschlüsselt werden kann.

private_key

Der private Schlüssel, der für die Entschlüsselung von encrypted_key verwendet wird.

cipher_algo

Die Verschlüsselungsmethode, die für die Entschlüsselung von data verwendet wird.

Achtung

Der Standardwert für PHP-Versionen vor 8.0 ist 'RC4', was als unsicher gilt. Es wird dringend empfohlen, explizit eine sichere Verschlüsselungsmethode anzugeben.

iv

Der Initialisierungsvektor, der für die Entschlüsselung von data verwendet wird. Er wird benötigt, wenn die Verschlüsselungsmethode einen IV erfordert. Dies kann durch den Aufruf von openssl_cipher_iv_length() mit cipher_algo ermittelt werden.

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Changelog

Version Beschreibung
8.0.0 private_key akzeptiert nun eine OpenSSLAsymmetricKey- oder OpenSSLCertificate-Instanz; vorher wurde eine resource vom Typ OpenSSL key oder OpenSSL X.509 CSR akzeptiert.
8.0.0 Der Parameter cipher_algo ist nicht mehr optional.

Beispiele

Beispiel #1 openssl_open()-Beispiel

<?php

// Holen des privaten Schlüssels aus der Datei private_key.pem
$pkey = openssl_get_privatekey("file://private_key.pem");

// Entschlüsseln der Daten und speichern in $open
if (openssl_open($sealed, $open, $env_key, $pkey, 'AES256', $iv)) {
echo
"Das sind die geöffneten Daten: ", $open;
} else {
echo
"Öffnen der Daten nicht möglich!";
}

?>

Siehe auch

add a note

User Contributed Notes 2 notes

up
1
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
1
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