(PHP 5 >= 5.3.0, PHP 7, PHP 8)
openssl_encrypt — Cifra los datos
$data,$cipher_algo,$passphrase,$options = 0,$iv = "",&$tag = null,$aad = "",$tag_length = 16Cifra los datos pasados con el método y la frase de contraseña especificados. Devuelve un string bruto o codificado en base64.
dataLos datos del mensaje en texto bruto a cifrar.
cipher_algoEl método de cifrado. Para una lista de los métodos de cifrado disponibles, utilizar openssl_get_cipher_methods().
passphrase
La frase de contraseña. Si la frase de contraseña es más corta de lo esperado, se rellena silenciosamente
con caracteres NUL; si la frase de contraseña es más larga de lo esperado, se trunca silenciosamente.
No se utiliza ninguna función de derivación de clave para el parámetro passphrase
como su nombre podría sugerir. La única operación utilizada es el relleno con caracteres
NUL o la truncación si la longitud es diferente de la esperada.
options
options es una disyunción a nivel de bits de los flags
OPENSSL_RAW_DATA y
OPENSSL_ZERO_PADDING
o OPENSSL_DONT_ZERO_PAD_KEY.
iv
Un vector de inicialización no-null. Si el IV es más corto de lo esperado, se completa con
caracteres NUL y se emite un aviso; si la frase de contraseña es más larga
de lo esperado, se trunca y se emite un aviso.
tagLa etiqueta de autenticación pasada por referencia al utilizar el modo de cifrado AEAD (GCM o CCM).
aadDatos adicionales autenticados.
tag_length
La longitud de la tag de autenticación.
Su valor puede estar entre 4 y 16 para el modo GCM.
Devuelve la cadena cifrada en caso de éxito o false si ocurre un error.
Emite un error de nivel E_WARNING si se pasa un algoritmo de cifrado
desconocido como parámetro cipher_algo.
Emite un error de nivel E_WARNING si se pasa un valor
vacío como parámetro iv.
| Versión | Descripción |
|---|---|
| 7.1.0 | Se añadieron los parámetros tag, aad y tag_length. |
Ejemplo #1 Ejemplo de cifrado autenticado AES en modo GCM para PHP 7.1+
<?php
//$key debería ser generado previamente de manera criptográfica, tal como 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);
//guardar $cipher, $iv, y $tag para el descifrado posterior
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
?>Ejemplo #2 Ejemplo de cifrado autenticado AES en modo GCM anterior a PHP 7.1
<?php
//$key debería ser generado previamente de manera criptográfica, tal como 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 );
// descifrar más tarde ...
$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))// comparación segura contra ataques de tiempo
{
echo $original_plaintext."\n";
}
?>