c# - una - librerias de visual studio 2017
¿Cómo usar el cifrado Rijndael con una biblioteca de clases.Net Core?(No.Net Framework) (1)
La diferencia (en .NET) entre Rijndael y AES es que Rijndael permite que cambie el tamaño del bloque, pero AES no lo hace. Como el tamaño de bloque predeterminado de RijndaelManaged es el mismo que el tamaño de bloque AES (128 bit / 16 byte), de hecho, está utilizando AES.
En lugar de instanciar el tipo de implementación por nombre, solo use la fábrica ( Aes.Create()
). Eso funciona en .NET Core y .NET Framework.
Otras cosas que vale la pena mencionar:
- Todas las instancias de SymmetricAlgorithm son IDisposable, debe usarlas en una instrucción de
using
. - Todas las instancias de ICryptoTransform (como su
desEncryptor
nombre incorrecto) son IDisposable, debe usarlas en una instrucción deusing
. - El relleno ISO10126 no está disponible en .NET Core 1.0. Si necesita ser compatible con transmisiones existentes, puede aplicar el relleno usted mismo y especificar PaddingMode.None. De lo contrario, PKCS7 es más estándar.
- Su clave AES no es muy aleatoria, ya que proviene de una cadena ASCII (muchos valores no serán válidos).
- Base64 al menos tiene un rango de valor completo
- PBKDF2 (función de derivación de clave basada en contraseña 2) a través de la clase Rfc2898DeriveBytes permite la entrada de secreto de cadena compartida, salida de ruido predecible.
- KeyAgreement es en general mejor, pero ni ECDH ni Classic DH están disponibles en .NET Core 1.0.
- Por lo general, el encriptador debe permitir que se calcule un IV aleatorio (llame a
aes.GenerateIV()
si usa el mismo objeto para múltiples operaciones) yaes.GenerateIV()
con el texto cifrado. Así que encriptar toma una clave y texto plano y produce un texto cifrado y IV. Descifrar toma (clave, IV, texto cifrado) y produce texto sin formato.
¿Cómo utilizamos el cifrado Rijndael en una biblioteca de clases .Net Core? (No es una biblioteca de clases .Net Framework) Necesitamos crear una biblioteca .Net Core compartida para usar en múltiples proyectos y necesitamos implementar métodos de cifrado y descifrado que usen el mismo cifrado Rijndael en todos los proyectos.
Actualmente estamos usando:
- VS Enterprise 2015
- do#
- .Net Core Class Library
- .NETStandard, Version = v1.6 reference
Parece que la implementación de Rijndael y AES falta en la versión .Net Core 1.0 ... parece que solo incluye las clases base. ¿Cómo se agrega una implementación .NET Core de Rijndael o encriptación AES como referencia a un nuevo proyecto de biblioteca de clases .Net Core Class?
Aquí está el método Encrypt que funciona en .Net Framework 4.5.2:
public static string Encrypt(string valueToEncrypt, string symmetricKey, string initializationVector)
{
string returnValue = valueToEncrypt;
var aes = new System.Security.Cryptography.RijndaelManaged();
try
{
aes.Key = ASCIIEncoding.ASCII.GetBytes(symmetricKey);
aes.IV = ASCIIEncoding.ASCII.GetBytes(initializationVector);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.ISO10126;
var desEncrypter = aes.CreateEncryptor();
var buffer = ASCIIEncoding.ASCII.GetBytes(valueToEncrypt);
returnValue = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));
}
catch (Exception)
{
returnValue = string.Empty;
}
return returnValue;
}