12 diciembre, 2012

Cifrado de DES en Java

Cifrado de DES en Java


En esta ocasión les comparto la implementación del Cifrado DES (Data Encryption Standard) realizado en Java, si no lo conocen en detalle o nunca escucharon de él como siempre veremos un resumen en la parte inferior, pero si quieren adentrar mucho más en el tema pueden acceder aquí.

"Data Encryption Standard (DES) es un algoritmo de cifrado, es decir, un método para cifrar información, escogido como un estándar FIPS en los Estados Unidos en 1976, y cuyo uso se ha propagado ampliamente por todo el mundo. Posteriormente DES fue sometido a un intenso análisis académico y motivó el concepto moderno del cifrado por bloques y su criptoanálisis.

Hoy en día, DES se considera inseguro para muchas aplicaciones. Esto se debe principalmente a que el tamaño de clave de 56 bits es corto; las claves de DES se han roto en menos de 24 horas. Existen también resultados analíticos que demuestran debilidades teóricas en su cifrado, aunque son inviables en la práctica. Se cree que el algoritmo es seguro en la práctica en su variante de Triple DES, aunque existan ataques teóricos.
Desde hace algunos años, el algoritmo ha sido sustituido por el nuevo AES (Advanced Encryption Standard).
En algunas ocasiones, DES es denominado también DEA (Data Encryption Algorithm)."
Si desean profundizar en Seguridad Informática, especificamente en Aplicaciones Web les recomiendo que visiten las siguientes páginas y se suscriban:
Los Sitios pertenecen a la Comunidad de Software Libre y Seguridad Informática [Hackem], y la Escuela Politécnica Nacional (EPN) es actualmente la sede de OWASP (Open Web Application Security Project) del Capítulo Nacional y del Capítulo Universitario de Ecuador gracias a Hackem Research Group, más información en los 2 enlaces antes mencionados.

En esta Comunidad se suelen dar cursos y capacitaciones en áreas como Software Libre, GNU/Linux y Seguridad Informática y Ethical Hacking, incluso personas que residan en Ecuador pueden participar activamente de forma presencial.

Volviendo al tema, este es uno de los primeros algoritmos que se podría considerar ya de nivel complejo para analizar su funcionamiento y de como se aplican las rondas, a continuación se adjunta una imagen con la estructura básica de este algoritmo de cifrado:


Estructura Básica de DES

Ahora cómo funcionaría esto en código Java?
El procedimiento básico a seguir sería:
1. Generar una clave DES aleatoria. (Usamos KeyGenerator)
2. Cifrar con DES nuestro mensaje (Ingresado por Consola o archivo), Usaremos DES/ECB/PKCS5Padding
3. Descifrar con DES nuestro mensaje (Desde un archivo o por Consola), Acá es el procedimiento inverso, no cambia nada más.

Ahora les incluyo parte del código de la función que utilizaremos para cifrar:

cifrador.init(Cipher.ENCRYPT_MODE, clave);
byte[] buffer = new byte[1000];
byte[] bufferCifrado;

FileInputStream in = new FileInputStream(args[0]);
FileOutputStream out = new FileOutputStream(args[0]+".cifrado");
int bytesLeidos = in.read(buffer, 0, 1000);
while (bytesLeidos != -1)
{
bufferCifrado = cifrador.update(buffer, 0, bytesLeidos);
out.write(bufferCifrado);
bytesLeidos = in.read(buffer, 0, 1000);
}
bufferCifrado = cifrador.doFinal();
out.write(bufferCifrado);
in.close();
out.close();


Y finalmente el código de la función inversa que descifra nuestro mensaje:
cifrador.init(Cipher.DECRYPT_MODE, clave);

in = new FileInputStream(args[0]+".cifrado");
out = new FileOutputStream(args[0]+".descifrado");
byte[] bufferPlano;
bytesLeidos = in.read(buffer, 0, 1000);
while (bytesLeidos != -1)
{
bufferPlano = cifrador.update(buffer, 0, bytesLeidos);
out.write(bufferPlano);
bytesLeidos = in.read(buffer, 0, 1000);
}

bufferPlano = cifrador.doFinal();
out.write(bufferPlano);
in.close();
out.close();

Como siempre la solución completa se encuentra al final del blog en la Java Box, si tienen preguntas o inquietudes sobre el programa y su funcionamiento no duden en comentarlo.

Forma de Uso:
Una vez compilado el archivo.jar procedemos a abrir un cmd (Terminal en GNU/Linux) y ejecutamos así:
java -jar DES_Cipher.jar mensajeACifrar.txt

La salida en consola deberá ser similar al algoritmo que planteamos en la parte superior, se adjunta una captura:

Cómo pueden observar la llave es generada desde el programa de forma aleatoria, en el ejemplo utilice un archivo de entrada y obtuve los siguientes archivos finales con su respectivo contenido:

mensajeACifrar.txt
Hola Mundo desde Java con DES! =)

mensajeACifrar.txt.cifrado
»§õžê _ Ì
øÂñÀ¡ ê 4²YÃCR u×üôûšëØ‚qì98

mensajeACifrar.txt.descifrado
Hola Mundo desde Java con DES! =)

1 comentario: