PHP: Hypertext Preprocessor (original) (raw)
openssl_open
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
openssl_open — Open sealed data
Description
Parameters
data
The sealed data.
output
If the call is successful the opened data is returned in this parameter.
encrypted_key
The encrypted symmetric key that can be decrypted using private_key
.
private_key
The private key used for decrypting encrypted_key
.
cipher_algo
The cipher method used for decryption of data
.
Caution
The default value for PHP versions prior to 8.0 is ('RC4'
) which is considered insecure. It is strongly recommended to explicitly specify a secure cipher method.
iv
The initialization vector used for decryption of data
. It is required if the cipher method requires IV. This can be found out by callingopenssl_cipher_iv_length() with cipher_algo
.
Return Values
Returns [true](reserved.constants.php#constant.true)
on success or [false](reserved.constants.php#constant.false)
on failure.
Changelog
Version | Description |
---|---|
8.0.0 | private_key accepts an OpenSSLAsymmetricKey or OpenSSLCertificate instance now; previously, a resource of type OpenSSL key or OpenSSL X.509 CSR was accepted. |
8.0.0 | cipher_algo is no longer an optional parameter. |
Examples
Example #1 openssl_open() example
`<?php// sealed,sealed, sealed,env_key and $iv are assumed to contain the sealed data, our
// envelope key and IV. All given to us by the sealer.
// Fetch private key from file located in private_key.pem
pkey=opensslgetprivatekey("file://privatekey.pem");//Decryptthedataandstoreitinpkey = openssl_get_privatekey("file://private_key.pem");// Decrypt the data and store it in pkey=opensslgetprivatekey("file://privatekey.pem");//Decryptthedataandstoreitinopen
if (openssl_open($sealed, open,open, open,env_key, pkey,′AES256′,pkey, 'AES256', pkey,′AES256′,iv)) {
echo "Here is the opened data: ", $open;
} else {
echo "Failed to open data";
}?>`
Found A Problem?
13 years ago
`PHP compiled without OpenSSL support? Here's how you can call the openssl command-line utility to achieve the same goal:
sealedandsealed and sealedandenv_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])){ envkey.=sprintf("env_key.=sprintf("%02x",ord(fgetc(envkey.=sprintf("pipes[1]))); } fclose($pipes[1]); if($xc=proc_close($ph)){ echo "Exit code: $xc\n"; }// call openssl to decryp ph=procopen(′opensslrc4−d−iv0−K′.ph=proc_open('openssl rc4 -d -iv 0 -K '.ph=procopen(′opensslrc4−d−iv0−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(open.=fgets(open.=fgets(pipes[1]); } fclose($pipes[1]); if($xc=proc_close($ph)){ echo "Exit code: $xc\n"; }// display the decrypted data echo $open;?>`
16 years ago
`Example code, assume mycert.pem is a certificate containing both private and public key.
$cert = file_get_contents("mycert.pem"); public=opensslgetpublickey(public = openssl_get_publickey(public=opensslgetpublickey(cert); private=opensslgetprivatekey(private = openssl_get_privatekey(private=opensslgetprivatekey(cert);
$data = "I'm a lumberjack and I'm okay.";
echo "Data before: {$data}\n";
openssl_seal($data, cipher,cipher, cipher,e, array($public));
echo "Ciphertext: {$cipher}\n";
openssl_open($cipher, open,open, open,e[0], $private);
echo "Decrypted: {$open}\n";
`