openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_encryptCifra los datos

Descripción

openssl_encrypt(
    #[\SensitiveParameter] string $data,
    string $cipher_algo,
    #[\SensitiveParameter] string $passphrase,
    int $options = 0,
    string $iv = "",
    string &$tag = null,
    string $aad = "",
    int $tag_length = 16
): string|false

Cifra los datos pasados con el método y la frase de contraseña especificados. Devuelve un chaîne de caractères bruto o codificado en base64.

Parámetros

data

Los datos del mensaje en texto bruto a cifrar.

cipher_algo

El 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.

Precaución

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.

tag

La etiqueta de autenticación pasada por referencia al utilizar el modo de cifrado AEAD (GCM o CCM).

aad

Datos adicionales autenticados.

tag_length

La longitud de la tag de autenticación. Su valor puede estar entre 4 y 16 para el modo GCM.

Valores devueltos

Devuelve la cadena cifrada en caso de éxito o false en caso de error.

Errores/Excepciones

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.

Historial de cambios

Versión Descripción
7.1.0 Se añadieron los parámetros tag, aad y tag_length.

Ejemplos

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";
}
?>

Ver también