Explicación sobre la forma de encriptar cadenas utilizando el algoritmo Rijndael en C#
Uno de los algoritmos de criptografía asimétrica es el algoritmo Rijndael o AES .
Utilizar las librerías de encriptación de.NET ( System.Security.Cryptography ) para encriptar o desencriptar una cadena utilizando Rijndael es igual de sencillo que utilizar el algoritmo TripleDES , simplemente debemos seguir los mismos pasos:
Inicializando el proveedor criptográfico
El primer paso antes de encriptar o desencriptar un mensaje es inicializar el proveedor utilizando la clave del usuario:
private static RijndaelManaged GetInstance(string strKey) { RijndaelManaged objProvider = new RijndaelManaged(); // Inicializa el proveedor objProvider.Key = Encoding.Unicode.GetBytes(strKey); objProvider.IV = new byte[objProvider.BlockSize / 8]; // Devuelve el proveedor return objProvider; }
Encriptación de un mensaje
Para encriptar una cadena obteniendo el resultado como un array de bytes podemos utilizar la siguiente rutina:
public static byte [] Encrypt(string strMessage, string strKey) { RijndaelManaged objProvider = GetInstance(strKey); ICryptoTransform objCrypto = objProvider.CreateEncryptor(); byte [] arrBytBuffer = Encoding.Unicode.GetBytes(strMessage); // Devuelve el aray de bytes encriptado return objCrypto.TransformFinalBlock(arrBytBuffer, 0, arrBytBuffer.Length); }
Si deseamos una cadena codificada en base 64 (por ejemplo para grabarlo en un archivo de texto o un nodo XML) podemos utilizar la siguiente rutina:
public static string EncryptToBase64(string strMessage, string strKey) { return Convert.ToBase64String(Encrypt(strMessage, strKey)); }
Desencriptar una cadena
Desencriptar una cadena es igualmente sencillo, inicializamos el proveedor y obtenemos una instancia para desencriptar ( ICryptoTransform ), llamamos a la función TransformFinalBlock para obtener una cadena de bytes desencriptada:
public static string Decrypt(string strMessage, string strKey) { byte [] arrBytBuffer = Convert.FromBase64String(strMessage); RijndaelManaged objProvider = GetInstance(strKey); ICryptoTransform objCrypto = objProvider.CreateDecryptor(); // Devuelve la cadena desencriptada return Encoding.Unicode.GetString(objCrypto.TransformFinalBlock(arrBytBuffer, 0, arrBytBuffer.Length)); }
La rutina anterior espera una cadena codificada en base 64 , por eso la primer instrucción de la rutina convierte ese texto en un array de bytes ( Convert.FromBase64String ).