LIV. Funciones Criptográficas

Estas funciones trabajan usando mcrypt.

Esta es una interfaz a la librería mcrypt, que soporta una gran variedad de algoritmos de bloque como DES, TripleDES, Blowfish (por defecto), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 y GOST en los modos de cifrado CBC, OFB, CFB y ECB. Adicionalmente, soporta RC6 e IDEA que se consideran "no-libres".

Para usarlos, descarga libmcrypt-x.x.tar.gz de aquí y sigue las instrucciones de instalación incluidas. Necesitas compilar PHP con el parámetro --with-mcrypt para activar esta extensión.

mcrypt puede usarse para encriptar y desencriptar usando los cifrados mencionados arriba. Los cuatro comandos importantes de mcrypt (mcrypt_cfb(), mcrypt_cbc(), mcrypt_ecb(), y mcrypt_ofb()) pueden operar en ambos modos que se llaman MCRYPT_ENCRYPT y MCRYPT_DECRYPT, respectivamente.

Ejemplo 1. Encripta un valor de entrada con TripleDES en modo ECB

<?php
$key = "esta es una clave muy secreta";
$input = "Nos vemos a las 9 en punto en el lugar secreto.";

$encrypted_data = mcrypt_ecb(MCRYPT_TripleDES, $key, $input, MCRYPT_ENCRYPT);
?>
Este ejemplo devolverá los datos encriptados como una cadena en $encrypted_data.

mcrypt puede operar en cuatro modos de cifrado (CBC, OFB, CFB y ECB). Perfilaremos el uso normal de cada uno de estos modos. Para una mejor referencia y una discusión más completa ver Applied Cryptography by Schneier (ISBN 0-471-11709-9).

  • ECB (electronic codebook o libro de códigos electrónico) va bien para datos aleatorios, tales como encriptar otras claves. Puesto que los datos son cortos y aleatorios, las desventajas de ECB tienen un efecto negativo favorable.

  • CBC (cipher block chaining o cifrado en bloque encadenado) es especialmente útil para encriptar ficheros, donde incrementa significativamente la seguridad por encima de ECB.

  • CFB (cipher feedback o cifrado realimentado) es el mejor modo de encriptar flujos de bytes donde cada byte debe ser encriptado.

  • OFB (output feedback o salida realimentada) es comparable al CFB, pero puede usarse en aplicaciones donde la propagación de errores no puede tolerarse.

Actualmente PHP no soporta el encriptado/desencriptado de flujos de bits. Por ahora, sólo soporta el manejo de cadenas.

Para una lista completa de los cifrados soportados, ver las definiciones al final de mcrypt.h. La regla general es que se puede acceder al cifrado desde PHP con MCRYPT_nombredelcifrado.

Aquí hay una pequeña lista de los cifrados que estan soportados actualmente por la extensión mcrypt. Si un cifrado no está listado aquí, pero está listado por mcrypt como soportado, puedes asumir con seguridad que ésta documentación está caduca.

  • MCRYPT_BLOWFISH

  • MCRYPT_DES

  • MCRYPT_TripleDES

  • MCRYPT_ThreeWAY

  • MCRYPT_GOST

  • MCRYPT_CRYPT

  • MCRYPT_DES_COMPAT

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_CAST128

  • MCRYPT_TEAN

  • MCRYPT_RC2

  • MCRYPT_TWOFISH (para las antiguas versiones mcrypt 2.x)

  • MCRYPT_TWOFISH128 (TWOFISHxxx está disponible en las versiones más nuevas 2.x)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_RC6

  • MCRYPT_IDEA

Debes (en los modos CFB y OFB) o puedes (en el modo CBC) suministrar un vector de inicialización (IV) a la correspondiente función de cifrado. El IV debe ser único y debe ser el mismo cuando desencriptas o encriptas. Con datos que son guardados encriptados, puedes cojer la salida de una función de índice bajo la cual los datos son almacenados (ej. la clave MD5 de un fichero). Alternativamente, puedes transmitir el IV junto con los datos encriptados (ver capítulo 9.3 de Applied Cryptography by Schneier (ISBN 0-471-11709-9) para una discusión de éste asunto).

Tabla de contenidos
mcrypt_cbc -- Encripta/desencripta datos en modo CBC
mcrypt_cfb -- Encripta/desencripta datos en modo CFB
mcrypt_create_iv -- Crea un vector de inicialización (IV) a partir de una fuente aleatoria
mcrypt_decrypt -- Decrypts crypttext with given parameters
mcrypt_ecb -- Encripta/desencripta datos en modo ECB
mcrypt_enc_get_algorithms_name -- Returns the name of the opened algorithm
mcrypt_enc_get_block_size -- Returns the blocksize of the opened algorithm
mcrypt_enc_get_iv_size -- Returns the size of the IV of the opened algorithm
mcrypt_enc_get_key_size -- Returns the maximum supported keysize of the opened mode
mcrypt_enc_get_modes_name -- Returns the name of the opened mode
mcrypt_enc_get_supported_key_sizes -- Returns an array with the supported keysizes of the opened algorithm
mcrypt_enc_is_block_algorithm_mode -- Checks whether the encryption of the opened mode works on blocks
mcrypt_enc_is_block_algorithm -- Checks whether the algorithm of the opened mode is a block algorithm
mcrypt_enc_is_block_mode -- Checks whether the opened mode outputs blocks
mcrypt_enc_self_test -- This function runs a self test on the opened module
mcrypt_encrypt -- Encrypts plaintext with given parameters
mcrypt_generic_deinit --  This function deinitializes an encryption module
mcrypt_generic_end -- This function terminates encryption
mcrypt_generic_init -- This function initializes all buffers needed for encryption
mcrypt_generic -- This function encrypts data
mcrypt_get_block_size -- Obtiene el tamaño de bloque del cifrado indicado
mcrypt_get_cipher_name -- Obtiene el nombre del cifrado especificado
mcrypt_get_iv_size -- Returns the size of the IV belonging to a specific cipher/mode combination
mcrypt_get_key_size -- Obtiene el tamaño de la clave de un cifrado
mcrypt_list_algorithms -- Get an array of all supported ciphers
mcrypt_list_modes -- Get an array of all supported modes
mcrypt_module_close --  Close the mcrypt module
mcrypt_module_get_algo_block_size -- Returns the blocksize of the specified algorithm
mcrypt_module_get_algo_key_size -- Returns the maximum supported keysize of the opened mode
mcrypt_module_get_supported_key_sizes -- Returns an array with the supported keysizes of the opened algorithm
mcrypt_module_is_block_algorithm_mode -- This function returns if the the specified module is a block algorithm or not
mcrypt_module_is_block_algorithm -- This function checks whether the specified algorithm is a block algorithm
mcrypt_module_is_block_mode -- This function returns if the the specified mode outputs blocks or not
mcrypt_module_open -- This function opens the module of the algorithm and the mode to be used
mcrypt_module_self_test -- This function runs a self test on the specified module
mcrypt_ofb -- Encripta/desencripta datos en modo OFB
mdecrypt_generic -- This function decrypts data