mcrypt_encrypt

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_encryptCifra texto plano con los parámetros dados

Advertencia

Esta función ha sido declarada OBSOLETA a partir de PHP 7.1.0. Su uso está totalmente desaconsejado.

Descripción

mcrypt_encrypt ( string $cipher , string $key , string $data , string $mode [, string $iv ] ) : string

Cifra los datos y los devuelve.

Parámetros

cipher

Una de las constantes MCRYPT_nombredelcifrado, o el nombre del algoritmo como string.

key

La clave con la que los datos serán cifrados. Si el tamaño de la clave proporcionada no está soportado por el cifrador, la función emitirá una advertencia y devolverá FALSE

data

Los datos que serán cifrados con el cifrador y modo dados a través de cipher y mode. Si el tamaño de la información no es n * blocksize, ésta será rellenada con '\0'.

El texto cifrado devuelto puede ser mayor al tamaño de datos que fue especificado por el parámetro data.

mode

Una de las constantes MCRYPT_MODE_nombredelmodo, o una de las siguientes strings: "ecb", "cbc", "cfb", "ofb", "nofb" o "stream".

iv

Utilizado para la inicialización en los modos CBC, CFB, OFB, y en algunos algoritmos en el modo STREAM. Si el tamañlo del IV proporcionado no está soportado por el modo de encadenamiento o no se proporcionó ninún IV, y el modo de encadenamiento requiere uno, la función emitirá una advertencia y devolverá FALSE.

Valores devueltos

Devuelve los datos cifrados, en formato cadena o FALSE en caso de error.

Historial de cambios

Versión Descripción
5.6.0 Tamaños incorrectos en key y iv ya no son admitidos. mcrypt_encrypt() emitirá una advertencia y devolverá FALSE si los datos de entrada son incorrectos. Anteriormente la clave y el IV eran rellenados con bytes '\0' hasta el siguiente tamaño válido.

Ejemplos

Ejemplo #1 Ejemplo de mcrypt_encrypt()

<?php
    
# --- ENCRYPTION ---

    # la clave debería ser binaria aleatoria, use scrypt, bcrypt o PBKDF2 para
    # convertir un string en una clave
    # la clave se especifica en formato hexadecimal
    
$key pack('H*'"bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
    
    
# mostrar el tamaño de la clave, use claves de 16, 24 o 32 bytes para AES-128, 192
    # y 256 respectivamente
    
$key_size =  strlen($key);
    echo 
"Tamaño de la clave: " $key_size "\n";
    
    
$plaintext "Este estring estaba encriptado con AES-256 / CBC / ZeroBytePadding.";

    
# crear una aleatoria IV para utilizarla co condificación CBC
    
$iv_size mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128MCRYPT_MODE_CBC);
    
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);
    
    
# crea un texto cifrado compatible con AES (tamaño de bloque Rijndael = 128)
    # para hacer el texto confidencial 
    # solamente disponible para entradas codificadas que nunca finalizan con el
    # el valor  00h (debido al relleno con ceros)
    
$ciphertext mcrypt_encrypt(MCRYPT_RIJNDAEL_128$key,
                                 
$plaintextMCRYPT_MODE_CBC$iv);

    
# anteponer la IV para que esté disponible para el descifrado
    
$ciphertext $iv $ciphertext;
    
    
# codificar el texto cifrado resultante para que pueda ser representado por un string
    
$ciphertext_base64 base64_encode($ciphertext);

    echo  
$ciphertext_base64 "\n";

    
# === ADVERTENCIA ===

    # El texto cifrado resultante no tiene añadida integridad o autenticidad
    # y no está protegido contra los ataques de relleno de oracle.
    
    # --- DESCIFRADO ---
    
    
$ciphertext_dec base64_decode($ciphertext_base64);
    
    
# recupera la IV, iv_size debería crearse usando mcrypt_get_iv_size()
    
$iv_dec substr($ciphertext_dec0$iv_size);
    
    
# recupera el texto cifrado (todo excepto el $iv_size en el frente)
    
$ciphertext_dec substr($ciphertext_dec$iv_size);

    
# podrían eliminarse los caracteres con valor 00h del final del texto puro
    
$plaintext_dec mcrypt_decrypt(MCRYPT_RIJNDAEL_128$key,
                                    
$ciphertext_decMCRYPT_MODE_CBC$iv_dec);
    
    echo  
$plaintext_dec "\n";
?>

El resultado del ejemplo sería:

Tamaño de la clave: 32
ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU=
Este estring estaba encriptado con AES-256 / CBC / ZeroBytePadding.

Ver también