Wednesday, 15 April 2009

Cifrado BlowFish

Hace un par de días mientras miraba el capítulo 15 (Day 7: 10:00 P.M.- 11:00 P.M.) de la Séptima temporada de 24h, la agente especial Renee Walker filtraba información confidencial del FBI a Jack Bauer, en un intento de parar una amenaza biológica a gran escala. Pues bien, en este capítulo, usaron una encriptación Blowfish de 32 bits (si no recuerdo mal), entonces uno de los analistas Morris O'Brian tuvo que descifrarlo para poder ver la información que se enviaba, descifrando las cabeceras y supongo que luego aplicando fuerza bruta encontraron la key.
En este post, explico un poco en que consiste este cifrado, y varias aplicaciones que podemos utilizar para securitizar y cifrar los datos que enviamos a través de la red.

  • En que consiste y cómo funciona Blowfish?
Blowfish (codificador de bloques simétricos) es un método de cifrado inventado por Bruce Schneier en 1993. Es un algoritmo libre y que todo el mundo puede utilizar, se ha vuelto muy popular gracias a su licencia libre, que además utiliza una clave de longitud variable de 32 a 448 bits, aunque la mayoría de productos comerciales utiliza la encriptación de 448 bits que es muy fuerte.

Este algoritmo de encriptación es muy rápido, y solo requiere de unos 4Kb de RAM, por lo tanto se puede ejecutar en cualquier sistema.

Podemos encontrar explicaciones más detalladas en la página del autor:
http://www.schneier.com/blowfish.html

  • Protege tus contenidos.
Mediante Blowfish Advanced CS, aplicacions libre con la implementación del algoritmo Blowfish, podemos proteger nuestros ficheros y enviarlos por correo con total seguridad de que nadie podra ver nuestro contenido.
Podemos encontrar la última version de la aplicación en la página del autor (Markus Hahn):
http://www.lassekolb.info/bfacs.htm


Una vez instalada la aplicación, la ejecutamos y seleccionamos los ficheros que queremos encriptar, luego añadimos nuestra clave, y voilà!, ya tenemos nuestro fichero con una encriptación potente, con muy pocas probabilidades de que alguien lo descubra mediante un B-F.

Una vez acabada la encriptación (realmente es muy rápida), nos aparece un formulario resumen con el trabajo finalizado:

Ahora este fichero lo podemos enviar donde queramos siempre acordandonos de la clave, para poder volver al fichero original.

También podemos encontrar herramientas gratuitas para Linux, como BlowCrypt, que permite encriptar los ficheros mediante BlowFish.

Otro ejemplo del uso del BlowFish, es el que nos muestra la empresa Cinnabar Systems, que han desarrollado una aplicación llamada Canner, que permite evitar que el código que tu ejecutas en java dentro de la Máquina virtual pueda ser manipulado mediante ingenieria inversa. La aplicación es de pago, pero tiene un eval de 30 días para probarlo. A mi en particular, me ha gustado bastante, pero seguro que podemos hacer la misma implementación nosotros mismos.

  • Creando nuestras própias aplicaciones.
Muchos de los algoritmos criptográficos son libres y los podemos encontrar implementados en múltiples lenguages, Delphi, Java, C++, PHP, etc. Muchos de estos ya disponen de librerias integradas, las cuales las podemos utilizar para disenyar nuestras aplicaciones y que incluyan este algoritmo.

Por ejemplo, para Delphi, tenemos el package DcpCrypt, que ya hice un post una vez, comentando como se instalaba. Pues bien, dentro de la libreria, podemos encontrar la implementación del Blowfish.

Para java, tenemos la gnu-Crypto, una libreria Open Source con la implementación de todos los algoritmos de encriptación conocidos, también muy interesante.

Un ejemplo simple seria el siguiente:
Primero nos descargamos la última libreria de gnu-Crypto : gnu-crypto 2.0.1. Luego creamos un pequeño proyecto en java, y añadimos como referencia externa las librerias gnu-crypto.jar, javax-crypto.jar y javax-security.jar, y luego creamos una clase que se llame por ejemplo: TestBlowFish.


El código seria el siguiente:




import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class TestBlowFish {
public static void main(String[] args) throws Exception {
KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish");
SecretKey secretkey = keygenerator.generateKey();
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
String inputText = "this is a Test Message";
byte[] encrypted = cipher.doFinal(inputText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretkey);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("encrypted text: " + new String(encrypted) + "\n" +
"decrypted text: " + new String(decrypted));
System.exit(0);
}
}





La salida de la aplicación muestra el siguiente mensaje:

encrypted text: 8%&껌ICgÒú8& ÉØÉ
decrypted text:
this is a Test Message


También podemos encontrar recursos online, por ejemplo en el siguiente enlace:
http://webnet77.com/cgi-bin/helpers/blowfish.pl

Mediante estas aplicaciones, podemos encriptar nuestros mensajes con el algoritmo Blowfish.
Ahora ya podemos disfrutar de estas aplicaciones o incluso crear las nuestras. Otro dia ya os contaré sobre la evolución de este, el TwoFish.

  • Enlaces interesantes:

Aquí os dejo una lista de enlaces interesantes relacionados con el BlowFish.

http://vpnd.dotsrc.org/
http://www.bzupages.com/f14/folder-lock-full-version-include-serial-538/
http://www.encryptfiles.net/encryption/algorithm/blowfish.php
http://www.taringa.net/posts/downloads/2275348/BestCrypt-Volume-Encryption-v2_11_03.html


3 comments:

  1. hola, soy estudiante de tecnologia en sistemas y para un necesito encriptar un archivo de texto con blowfish desde linux en lenguaje C, sera que me podrias ayudar o sugerir una pagina donde me puedan ayudar... de antemano muchas gracias

    ReplyDelete
  2. Hi sthewar,

    thank you for your comment. Have you tried the OpenSSL in Ubuntu?. With that library you can encrypt files easily. Here is one of my posts explaining how to do that:

    Encrypting with OpenSSL

    you can find more information in the following link as well:

    Crypto Blowfish OpenSSL

    ReplyDelete
  3. hi jordi

    muchas gracias por tu pronta respuesta, hace poco entregue el proyecto. me interesa mucho este tema de la encriptacion y linux, gracias por los links
    y estamos en contacto
    bye

    ReplyDelete