12 ene 2011

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (I de II)

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (Parte I de II)

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (Parte II de II)

Buenas a todos, la próxima versión de Flu, que será la beta 0.2 se caracterizará porque permitirá, entre otras cosas, el envío de los datos recuperados desde nuestra botnet de manera cifrada mediante el algoritmo Rijndael (AES). En esta cadena de dos posts que hoy doy comienzo voy a enseñaros a cifrar una cadena de texto, desarrollando un programa en C#. Posteriormente descifraremos la cadena desarrollando una aplicación PHP, al igual que hará Flu en su próxima versión.

Antes de nada vamos a ver un poco de historia sobre este algoritmo:

En el año 2000, hace ya 11 años, el National Institute for Standards and Technology, conocido como el NIST, anunció que el algoritmo Rijndael iba a ser el nuevo estándar.

El nombre del algoritmo proviene de sus inventores Joan Daemen y Vicent Rijmen. AES es un sistema de cifrado por bloques que puede manejar longitudes de entre 128 y 256 bits de clave y de bloque.

En 2003 fue aprobado para su uso por la NSA para cifrar información clasificada como alto secreto.

Hoy por hoy es de los algoritmos de criptografía simétrica más seguros.

Si tenéis interés en aprender el funcionamiento del algoritmo hasta el más mínimo detalle, os recomiendo sin duda esta animación Flash que ha diseñado Enrique Zabala: http://bit.ly/aTumKd

Comencemos con el algoritmo de cifrado que vamos a estudiar:

En primer lugar agregaremos la siguiente directiva using:

A continuación os presento el algoritmo de cifrado completo:

En primer lugar debemos definir una clave y un vector de inicialización (iv). Para el ejemplo hemos inventado una clave de 16 bytes (qwertyuioplkjhgf), es decir 16 x 8 = 128 bits, que es el tamaño menor de clave que admite AES. Podéis sustituir la clave por la que queráis, pero siempre respetando los tamaños. Idem con el vector de inicialización.

Si no queréis inventaros una clave o vector de incialización podéis generarlos automaticamente con el siguiente código:

Rijndael rijndael = Rijndael.Create();

byte[] clave = rijndael.Key;

byte[] iv  = rijndael.IV;

Ahora pasaremos a bytes la cadena de texto que queremos cifrar, en nuestro caso se la pasaremos en la variable cadena y creamos la variable cadenaEncriptada donde almacenaremos el resultado.

A continuación crearemos la instancia del algoritmo Rijndael:

RijndaelManaged cripto = new RijndaelManaged();

Y estableceremos el flujo en memoria para el cifrado y el flujo de cifrado:

using (MemoryStream ms = new MemoryStream(inBytes.Length))

using (CryptoStream objCryptoStream = new CryptoStream(ms, cripto.CreateEncryptor(clave, iv), CryptoStreamMode.Write))

Una vez hecho esto realizamos el cifrado enviando los datos en bytes al flujo de cifrado (objCryptoStream.Write) y recuperaremos los datos ya cifrados en la variable cadenaEncriptada:

cadenaEncriptada = ms.ToArray();

Finalmente devolvemos el resultado en Base 64.

Para mostraros el funcionamiento he desarrollado una sencilla aplicación que os podéis descargar junto con su código fuente desde aquí.

Aprovecho el post para agradecer a @nexus6 su apoyo en el desarrollo de este módulo de Flu, ¡gracias!

Mañana continuaremos con el descifrado mediante el desarrollo de una aplicación en PHP.

Saludos!

5 comentarios:

  1. Es un placer colaborar.Buen artículo.Saludos!

    ResponderEliminar
  2. [...] Iniciar Sesión « Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (I de II) [...]

    ResponderEliminar
  3. Thank you, I have recently been searching for information about this topic for ages and yours is the best I have discovered so far.

    ResponderEliminar