Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. using System.IO;
  5.  
  6. namespace Articulos.Pregunta.P1120
  7. {
  8.     public class DESEncrypt
  9.     {
  10.         // Crea la llave y el vector de inicialización para la
  11.         // contraseña de protección del contenido a
  12.         // encriptar o desencriptar usando un algoritmo basado
  13.         // en TripleDES:
  14.         public static TripleDES CrearDES(string clave)
  15.         {
  16.             MD5 md5 = new MD5CryptoServiceProvider();
  17.             TripleDES des = new TripleDESCryptoServiceProvider();
  18.             des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(clave));
  19.             des.IV = new byte[des.BlockSize / 8];
  20.             return des;
  21.         }
  22.  
  23.         // Encripta una cadena de caracteres usando una contraseña personalizada:
  24.         public string EncriptarCadenaDeCaracteres(string textoPlano, string contrasegnia)
  25.         {
  26.             // Primero debemos convertir el texto plano en `textoPlano`
  27.             // en un arreglo de bytes:
  28.             byte[] textoPlanoBytes = Encoding.Unicode.GetBytes (textoPlano);
  29.  
  30.             // Uso de un flujo de memoria para la contención de los bytes:
  31.             MemoryStream flujoMemoria = new MemoryStream();
  32.  
  33.             // Creación de la clave de protección y el vector de inicialización:
  34.             TripleDES des = CrearDES (contrasegnia);
  35.  
  36.             // Creación del codificador para la escritura al flujo de memoria:
  37.             CryptoStream flujoEncriptacion = new CryptoStream (flujoMemoria, des.CreateEncryptor(), CryptoStreamMode.Write);
  38.  
  39.             // Escritura del arreglo de bytes sobre el flujo de memoria:
  40.             flujoEncriptacion.Write (textoPlanoBytes, 0, textoPlanoBytes.Length);
  41.             flujoEncriptacion.FlushFinalBlock();
  42.  
  43.             // Retorna representación legible de la cadena encriptada:
  44.             return Convert.ToBase64String (flujoMemoria.ToArray());
  45.         }
  46.  
  47.         // Descripta una cadena encriptada usando una contraseña de protección:
  48.         public string DesencriptarCadenaDeCaracteres(string textoEncriptado, string contrasegnia)
  49.         {
  50.             // Primero debemos convertir el texto plano en `textoPlano`
  51.             // en un arreglo de bytes:
  52.             byte[] bytesEncriptados = Convert.FromBase64String (textoEncriptado);
  53.  
  54.             // Uso de un flujo de memoria para la contención de los bytes:
  55.             MemoryStream flujoMemoria = new MemoryStream();
  56.  
  57.             // Creación de la clave de protección y el vector de inicialización:
  58.             TripleDES des = CrearDES (contrasegnia);
  59.  
  60.             // Creación de decodificador:
  61.             CryptoStream flujoDesencriptacion = new CryptoStream (flujoMemoria, des.CreateDecryptor(), CryptoStreamMode.Write);
  62.  
  63.             // Escritura del arreglo de bytes sobre el flujo de memoria:
  64.             flujoDesencriptacion.Write (bytesEncriptados, 0, bytesEncriptados.Length);
  65.             flujoDesencriptacion.FlushFinalBlock();
  66.  
  67.             // Conversión del flujo de datos en una cadena de caracteres:
  68.             return Encoding.Unicode.GetString (flujoMemoria.ToArray());
  69.         }
  70.     }
  71. }