openssl_encrypt
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Encrypts data
Description
Encrypts given data with given method and passphrase, returns a raw or base64 encoded string
Parameters
dataThe plaintext message data to be encrypted.
cipher_algoThe cipher method. For a list of available cipher methods, use
openssl_get_cipher_methods().passphraseThe passphrase. If the passphrase is shorter than expected, it is silently padded with
NULcharacters; if the passphrase is longer than expected, it is silently truncated.CautionThere is no key derivation function used for
passphraseas its name might suggest. The only operation used is padding withNULcharacters or truncation if the length is different than expected.optionsoptionsis a bitwise disjunction of the flagsOPENSSL_RAW_DATA,OPENSSL_ZERO_PADDING, andOPENSSL_DONT_ZERO_PAD_KEY.When
OPENSSL_RAW_DATAis set, the encrypted output is returned as raw binary data. When it is not set, the return value is base64-encoded.ivA non-null Initialization Vector. If the IV is shorter than expected, it is padded with
NULcharacters and warning is emitted; if the passphrase is longer than expected, it is truncated and warning is emitted.tagThe authentication tag passed by reference when using AEAD cipher mode (GCM or CCM).
aadAdditional authenticated data.
tag_lengthThe length of the authentication
tag. Its value can be between 4 and 16 for GCM mode.
Return Values
Returns the encrypted string on successFalseforfailure.
Errors/Exceptions
Emits an E_WARNING level error if an unknown cipher algorithm is passed in via the cipher_algo parameter.
Emits an E_WARNING level error if an empty value is passed in via the iv parameter.
Changelog
| Version | Description |
|---|---|
| 7.1.0 | The tag, aad and tag_length parameters were added. |
Examples
AES Authenticated Encryption in GCM mode example for PHP 7.1+
<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
//store $cipher, $iv, and $tag for decryption later
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
?>AES Authenticated Encryption example prior to PHP 7.1
<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))// timing attack safe comparison
{
echo $original_plaintext."\n";
}
?>