Encriptación Simétrica

Published Saturday, November 27, 2004 11:34 PM

La Encriptación simétrica se utiliza cuando necesito almacenar información crítica, que deberá poder descifrarse, y seré yo el único que haga todo el proceso. Nadie mas tendrá acceso a la llave con que se encriptará y desencriptará la información.

El proceso de realizar una encriptación es complejo para ser entendido por nosotros mismos, pero no es limitante para conocer cuales son los pasos para utilizarlos y que errores no se deben cometer.

Dentro de los algoritmos de encriptación simétrica podemos encontrar los siguientes, algunos más seguros que otros.

  • DES (Digital Encryption Standard): Creado en 1975 con ayuda de la NSA (National Security Agency), en 1982 se convirtió en un estándar. Utiliza una llave de 56 bit. En 1999 logró ser quebrado (violado) en menos de 24 horas por un servidor dedicado a eso. Esto lo calificó como un algoritmo inseguro y con falencias reconocidas.
  • 3DES (Three DES o Triple DES): Antes de ser quebrado DES, ya se trabajaba en un nuevo algoritmo basado en el anterior. Este funciona aplicando tres veces el proceso con tres llaves diferentes de 56 bits. La importancia de esto es que si alguien puede descifrar una llave, es casi imposible poder descifrar las tres y utilizarlas en el orden adecuado. Hoy en día es uno de los algoritmos simétricos más seguros.
  • IDEA (International Data Encryption Algorithm): Más conocido como un componente de PGP (encriptación de mails), trabaja con llaves de 128 bits. Realiza procesos de shift y copiado y pegado de los 128 bits, dejando un total de 52 sub llaves de 16 bits cada una. Es un algoritmo más rápido que DES, pero al ser nuevo, aun no es aceptado como un estándar, aunque no se le han encontrado debilidades aún.
  • AES (Advanced Encryption Standard): Éste fue el ganador del primer concurso de algoritmos de encriptación realizado por la NIST (National Institute of Standards and Technology) en 1997. Después de 3 años de estudio y habiendo descartado a 14 candidatos, este algoritmo, también conocido como Rijndael por Vincent Rijmen y Joan Daemen, fue elegido como ganador. Aun no es un estándar, pero es de amplia aceptación a nivel mundial. Junto a 3DES es de los más seguros.

Cualquiera de estos algoritmos utiliza los siguientes dos elementos. Ninguno de los dos debe pasarse por alto ni subestimar su importancia.

  • IV (Vector de inicialización): Ésta cadena se utiliza para empezar cada proceso de encriptación. Un error común es utilizar la misma cadena de inicialización en todas las encriptaciones. En ese caso, el resultado de las encriptaciones es similar, pudiendo ahorrarle mucho trabajo a un hacker en el desciframiento de los datos. Tiene 16 bytes de largo.
  • Key (llave): Esta es la principal información para encriptar y desencriptar en los algoritmos simétricos. Toda la seguridad del sistema depende de donde este esta llave, como esté compuesta y quien tiene acceso. El largo de las llaves depende del algoritmo.

Bueno, despues de una introducción tan larga, vámos al código, donde utilizamos AES o Rijndael.

public class MiRijndael

{

       public static byte[] Encriptar(string strEncriptar, string strPK)

       {

             System.Text.UTF8Encoding textConverter = new UTF8Encoding();

             Rijndael miRijndael = Rijndael.Create();

             byte[] encrypted = null;

             byte[] returnValue = null;

 

             try

             {

                    miRijndael.Key = textConverter.GetBytes(strPK);

 

                    byte[] toEncrypt = textConverter.GetBytes(strEncriptar);

                    encrypted = (miRijndael.CreateEncryptor()).TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);

 

                    returnValue = new byte[miRijndael.IV.Length + encrypted.Length];

                    miRijndael.IV.CopyTo(returnValue, 0);

                    encrypted.CopyTo(returnValue, miRijndael.IV.Length);

 

             }

             catch {      }

             return returnValue;

       }

 

       public static string Desencriptar(byte[] bytDesEncriptar, string strPK)

       {

             System.Text.UTF8Encoding textConverter = new UTF8Encoding();

             Rijndael miRijndael = Rijndael.Create();

             byte[] tempArray = new byte[miRijndael.IV.Length];

             byte[] encrypted = new byte[bytDesEncriptar.Length - miRijndael.IV.Length];

             string returnValue = string.Empty;

 

             try

             {

                    miRijndael.Key = textConverter.GetBytes(strPK);

 

                    Array.Copy(bytDesEncriptar, tempArray, tempArray.Length);

                    Array.Copy(bytDesEncriptar, tempArray.Length, encrypted, 0, encrypted.Length);

                    miRijndael.IV = tempArray;

 

                    returnValue = textConverter.GetString((miRijndael.CreateDecryptor()).TransformFinalBlock(encrypted, 0, encrypted.Length));

 

             }

             catch { }

             return returnValue;

       }

}

El resultado de la encriptación es un arreglo de Bytes. Si se quiere un string se puede ejecutar el método GetString(arreglo de bytes) de cualquier converter (UTF8 como en el ejemplo), como tambien transformarlo con Convert.ToBase64String(arreglo de bytes).

Patrick Mac Kay
Noviembre 2004.

by pmackay
Filed under:

Leave a Comment

(required) 
(required) 
(optional)
(required)