Encriptación utilizando Rijndael - AES con .NET

Encriptación utilizando Rijndael - AES con .NET

October 11, 2019

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 Triple DES 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);
}
</pre>

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).