Encriptando cositas con MCrypt

La fase final de mi experimento con XML-RPC suponía poder encriptar la solicitud que iba del cliente al servidor así como la respuesta de este último hacia el cliente. Como se sobreentiende, esta encriptación debería ser de dos vías. Para esto estuve revisando la API de PHP y encontré que la utilización de la librería mcrypt es bastante útil y que por suerte hasta el hosting mas antiguo de todos la soporta en PHP.

Para esto entonces desarrolle dos procedimientos: encriptar y desencriptar para separar su funcionalidad.

Encriptar.

Para encriptar información se requieren los siguientes parámetros.

  • El nombre del algoritmos de encriptación (Ej. blowfish).
  • El modo de encriptación (Ej. cfb).
  • El orígen del azar (Ej. MCRYPT_RAND).
  • La contraseña de encriptación (secreta).
  • Los datos a encriptar.
  • El vector de encriptación (IV) que actúa como semilla (opcional).

Se abre el módulo del algoritmo de encriptación y se especifica su definición.

$td = mcrypt_module_open($encryption_algorithm, ”, $encryption_mode, ”);

Se crea el vector de encriptación y se determina la longitud de la llave.

$client_iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), $random_source);
$ks = mcrypt_enc_get_key_size($td);

Se crea la llave basada en la contraseña de encriptación especificada por el usuario (mayor seguridad).

$key = substr(md5($encryption_key), 0, $ks);

Se inicializa la encriptación con la información establecida anteriormente.

mcrypt_generic_init($td, $key, $client_iv);

Se encriptan los datos.

$encrypted_data = mcrypt_generic($td, $raw_data);

Se termina el proceso de encriptación.

mcrypt_generic_deinit($td);

Al final se obtiene el vector de encriptación ($client_iv) y la información encriptada ($encrypted_data), ambos son necesarios para realizar el proceso inverso.

Desencriptar.

Para desencriptar la información se requiere la siguiente información.

  • El nombre del algoritmos de encriptación (Ej. blowfish).
  • El modo de encriptación (Ej. cfb).
  • La contraseña de encriptación (secreta).
  • El vector de encriptación (IV).
  • Los datos encriptados.

Se abre el módulo del algoritmo de desencriptación y se especifica su definición.

$td = mcrypt_module_open($encryption_algorithm, ”, $encryption_mode, ”);

Se determina la longitud de la llave.

$ks = mcrypt_enc_get_key_size($td);

Se crea la llave basada en la contraseña de encriptación especificada por el usuario (mayor seguridad).

$key = substr(md5($encryption_key), 0, $ks);

Se inicializa la desencriptación con la información establecida anteriormente.

mcrypt_generic_init($td, $key, $client_iv);

Se desencriptan los datos.

$decrypted_data = mdecrypt_generic($td, $encrypted_data);

Se termina el proceso de encriptación y se cierra el módulo.

mcrypt_generic_deinit($td);
mcrypt_module_close($td);

Al final se obtiene la información desencriptada ($decrypted_data) la cual debe corresponder con la información original. Algunas veces la desencriptación deja espacios en blanco a los lados de la cadena desencriptada por lo que puede ser de utilidad pasar la información por un trim() como último paso.

La demostración de este código se encuentra siguiendo este enlace Demo #0. Este cuenta con los archivos config.php (variables necesarias), security.php (funciones para encriptar y desencriptar) y demo1.php (ejemplo funcional).

2 thoughts on “Encriptando cositas con MCrypt”

  1. hola he estado probando la encriptacion como indicas en tu ejemplo pero me ocurre un un problema y es que al enviar la clave cifrada por xml me da error porque no soporta algunos de los caracteres del cifrado
    como lo has solucionado tu?

  2. Saludos Cristian. Hasta el momento no he tenido que enviar información cifrada en un XML así que no me había enfrentado a la situación que mencionas.

    Lo primero que se me ocurre sería convertir el mensaje a ser incluído en el XML utilizando BASE64. Para probar esto te serán útiles las funciones base64_encode/base64_decode de PHP.

Leave a Reply

Your email address will not be published. Required fields are marked *