miércoles, 4 de julio de 2012

Cifrado con Triple DES


Triple DES es el algoritmo que hace triple cifrado del DES, también es conocido como TDES o 3DES, fue desarrollado por IBM en 1978.

Cuando se descubrió que una clave de 56 bits no era suficiente para evitar un ataque de fuerza bruta, TDES fue elegido como forma de agrandar el largo de la clave sin necesidad de cambiar de algoritmo de cifrado. Este método de cifrado es inmune al ataque por encuentro a medio camino, doblando la longitud efectiva de la clave (112 bits), pero en cambio es preciso triplicar el número de operaciones de cifrado, haciendo este método de cifrado muchísimo más seguro que el DES. Por tanto, la longitud de la clave usada será de 192 bits, aunque como se ha dicho su eficacia solo sea de 112 bits.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

Empecemos por el método de cifrado.

   1: public string Encryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Encoding.ASCII.GetBytes(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el metodo
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode= CipherMode.ECB;
  19:  
  20:         //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso sobre con HTTP
  22:         return Convert.ToBase64String(TDes.CreateEncryptor().TransformFinalBlock (buffer,0,buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al cifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

En este caso TDES maneja una llave mas larga razón por la cual se me ocurrió que en lugar de la llave que se recibe por parámetro, seria mejor utilizar el hash de la misma, de esta forma se hace aun mas robusto el mecanismo.


Es importante entender que existen diferentes métodos de cifrado, y que se debe usar el mismo tanto para el cifrado como para el descifrado del mensaje.


A continuación veremos el método para descifrar los datos que previamente hemos cifrado.


   1: public string Decryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Convert.FromBase64String(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el método
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode = CipherMode.ECB;
  19:  
  20:         //Se crea el desencriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso en ambientes de redes
  22:         return Encoding.ASCII.GetString(TDes.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al descifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un nivel de seguridad mas que adecuado para la mayoría de nuestras aplicaciones, si bien no es adecuada para ambientes donde la seguridad es el atributo de calidad dominante, si es una muy buena opción como mecanismo de seguridad en un entorno normal.


Etiquetas de Technorati: ,,,

No hay comentarios: