Encriptar informacion (Nativo)
Empiezo con otro post, ahora con respecto a la encriptación de informacion. Muchas veces necesitamos que la informacion que nosotros enviamos, recibimos o almacenamos se encuentre disponible solo para el usuario que la genero.
Puede ser informacion delicada y/o crítica como contraseñas, datos personales, etc. Navegando un poco en internet me encontre que hay como realizar esta accion desde C# sin necesidad de ninguna librería de terceros.
CipherMode
Padding Mode
Ahora a lo que nos compete; voy a generar una biblioteca de Clases, en mi caso le he puesto el nombre de EncriptarDesencriptarInformacion, mi clase contiene un constructor para el ingreso de la clave con la que se va a encriptar la informacion.
También he creado una clase encriptar datos la cual nos ayudará a cifrar la informacion.
Y por último una clase para desencriptar la información:
Hay que tomar en cuenta que, una vez ingresada la clave para encriptar; esta será la única para poder desencriptar.
Para complementar les dejo la dll para los que quieren saltarse el paso de copiar el código, esta hecho en VS13 Framework 4.5.1
Puede ser informacion delicada y/o crítica como contraseñas, datos personales, etc. Navegando un poco en internet me encontre que hay como realizar esta accion desde C# sin necesidad de ninguna librería de terceros.
Antes de nada indicar que para este tutorial necesitaremos de una clave con la cual podremos encriptar y desencriptar la informacion.
System.Security.Cryptography
Para este post vamos a utilizar la librería System.Security.Cryptography la cual hará todo el trabajo pesado, de esta librería utilizamos MD5CryptoServiceProvider. Que es MD5 (Clase):Representa la clase abstracta desde la que se heredan todas las implementaciones del algoritmo hash MD5. Mas info aquíAdicional para cifrar la informacion utilizamos TripleDESCryptoServiceProvider para especificar el modo de cifrado de bloques y el tipo de relleno que vamos a utilizar. Podemos ver mas información de esto en estos enlaces:
CipherMode
Padding Mode
Ahora a lo que nos compete; voy a generar una biblioteca de Clases, en mi caso le he puesto el nombre de EncriptarDesencriptarInformacion, mi clase contiene un constructor para el ingreso de la clave con la que se va a encriptar la informacion.
01 02 private string clave; 03 04 /// <summary> 05 /// Constructor que define la clave a utilizarse para encriptar la información 06 /// </summary> 07 /// <param name="claveEncriptacion">clave de encriptacion</param> 08 public EncriptarDatos(string claveEncriptacion) 09 { 10 this.clave = claveEncriptacion; 11 }
También he creado una clase encriptar datos la cual nos ayudará a cifrar la informacion.
01 02 /// <summary> 03 /// Metodo para encriptar la informacion 04 /// </summary> 05 /// <param name="informacion">Informacion que se quiere encriptar</param> 06 /// <returns></returns> 07 public string Encriptar(string informacion) 08 { 09 //Aqui guardamos la clave con la que vamos a cifrar 10 byte[] arrayClave; 11 12 //Aqui guardamos el texto a cifrar 13 byte[] arregloDeInformacion = UTF8Encoding.UTF8.GetBytes(informacion); 14 15 //Se utiliza System.Security.Cryptography para MD5 16 MD5CryptoServiceProvider variableHashMD5 = new MD5CryptoServiceProvider(); 17 18 //Se hace el hash con la clave 19 arrayClave = variableHashMD5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clave)); 20 21 variableHashMD5.Clear(); 22 23 TripleDESCryptoServiceProvider cifradoTripleDES = new TripleDESCryptoServiceProvider(); 24 25 cifradoTripleDES.Key = arrayClave; 26 cifradoTripleDES.Mode = CipherMode.ECB; //Especifica el modo de cifrado de bloques que se utilizará para cifrar 27 cifradoTripleDES.Padding = PaddingMode.PKCS7; //Especifica el tipo de relleno que se aplica cuando el bloque de datos del mensaje es más pequeño que el número total de bytes necesarios para una operación criptográfica. 28 29 ICryptoTransform cTransform = cifradoTripleDES.CreateEncryptor(); 30 31 byte[] resultadoEncriptacion = cTransform.TransformFinalBlock(arregloDeInformacion, 0, arregloDeInformacion.Length); 32 33 cifradoTripleDES.Clear(); 34 35 return Convert.ToBase64String(resultadoEncriptacion, 0, resultadoEncriptacion.Length); 36 }
Y por último una clase para desencriptar la información:
01 02 /// <summary> 03 /// Metodo para desencriptar la informacion 04 /// </summary> 05 /// <param name="informacionEncriptada">Información que se va a desencriptar</param> 06 /// <returns>variables desencriptada</returns> 07 public string Desencriptar(string informacionEncriptada) 08 { 09 byte[] arrayClave; 10 11 byte[] arregloDeInformacinoEncriptada = Convert.FromBase64String(informacionEncriptada); 12 13 MD5CryptoServiceProvider variableHashMD5 = new MD5CryptoServiceProvider(); 14 15 arrayClave = variableHashMD5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clave)); 16 17 variableHashMD5.Clear(); 18 19 TripleDESCryptoServiceProvider cifradoTripleDES = new TripleDESCryptoServiceProvider(); 20 21 cifradoTripleDES.Key = arrayClave; 22 cifradoTripleDES.Mode = CipherMode.ECB; 23 cifradoTripleDES.Padding = PaddingMode.PKCS7; 24 25 ICryptoTransform cTransform = cifradoTripleDES.CreateDecryptor(); 26 27 byte[] resultadoDesencriptacion = cTransform.TransformFinalBlock(arregloDeInformacinoEncriptada, 0, arregloDeInformacinoEncriptada.Length); 28 29 cifradoTripleDES.Clear(); 30 31 return UTF8Encoding.UTF8.GetString(resultadoDesencriptacion); 32 } 33 }
Hay que tomar en cuenta que, una vez ingresada la clave para encriptar; esta será la única para poder desencriptar.
Para complementar les dejo la dll para los que quieren saltarse el paso de copiar el código, esta hecho en VS13 Framework 4.5.1