Data Encryption Standard (DES) es un algoritmo de cifrado, fue escogido como un estándar FIPS en los Estados Unidos en 1976, en aquel tiempo alcanzo gran popularidad, pero hoy en día se considera inseguro, esto en parte a que la longitud de clave es de solo 56 bits.
Aun cuando puede no ser apto para un entorno en el que se requiere una gran seguridad si puede ser usado en aplicaciones mas sencillas para brindar un nivel de seguridad mas que aceptable. Bajo esta premisa, veremos la forma de implementar este mecanismo de cifrado en nuestras aplicaciones.
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 crear el método que cifrar los datos:
1: private static string Coding(string cadena, string key)
2: {
3: DESCryptoServiceProvider des = new DESCryptoServiceProvider();
4: Byte[] buffer;
5: Byte[] cryptoKey=new byte[8];
6:
7: try
8: {
9: //Se convierte la cadena en un arreglo de bytes
10: buffer = Encoding.ASCII.GetBytes(cadena);
11:
12: //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
13: Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
14:
15: //Se define la llave de encripción
16: des.Key = cryptoKey;
17:
18: //Se define el modo de cifrado que se desea utilizar
19: des.Mode = CipherMode.ECB;
20:
21: //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64
22: //ya que asi es mas viable el uso sobre redes
23: return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
24: }
25: catch (Exception ex)
26: {
27: Console.WriteLine("Se ha presentado un error! : {0}", ex.ToString());
28: throw;
29: }
30: }
Como se puede observar, la llave que usa DES es de 8 bytes, así que se toman solo 8 bytes de el array, pues de otra forma se generara una excepción.
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: private static string UnCoding(string cadena, string key)
2: {
3: DESCryptoServiceProvider des = new DESCryptoServiceProvider();
4: Byte[] buffer;
5: Byte[] cryptoKey = new byte[8];
6:
7: try
8: {
9: //Se convierte la cadena en un arreglo de bytes
10: buffer = Convert.FromBase64String(cadena);
11:
12: //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
13: Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
14:
15: //Se define la llave de encripción
16: des.Key = cryptoKey;
17:
18: //Se define el modo de cifrado que se desea utilizar
19: des.Mode = CipherMode.ECB;
20:
21: //Se crea el decodificador y se transforma el bloque de bits, se convierte a una cadena de texto
22: return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0,buffer.Length));
23: }
24: catch (Exception ex)
25: {
26: Console.WriteLine("Se ha presentado un error al decodificar! : {0}", ex);
27: throw ;
28: }
29: }
Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un moderado nivel de seguridad en aplicaciones donde por diferentes motivos la seguridad no esta entre los atributos de seguridad dominantes, pero que tampoco queremos dejarla de lado totalmente.