post icon

Encriptar y desencriptar con Rijndael (AES) en dotNet

Ya anteriormente veíamos como encriptar sacando el hash a los textos (los cuales no tienen reversión de los mismos). Esta vez veremos como encriptar los textos y poder hacer el reverso del mismo.

Unos de los algoritmos mas populares es el Rijndael o AES para estos cometidos, su fama se basa en su seguridad y dificultad que ofrece para llevar lograr una reversión no autorizada.

Existe en la web mucha info sobre como hacer esto en C#.Net con la versión 1.0 y 1.1 específicamente del framework que es la siguiente:

Framework 1.0/1.1

public static string Encrypt(string PlainText, string Password, string SaltValue, string hashAlgorithm, int PasswordIterations, string InitialVector, int KeySize)
{
	byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
	byte[] saltValueBytes = Encoding.ASCII.GetBytes(SaltValue);
	byte[] plainTextBytes = Encoding.UTF8.GetBytes(PlainText);
	PasswordDeriveBytes password = new PasswordDeriveBytes(Password, saltValueBytes, hashAlgorithm, PasswordIterations);
	byte[] keyBytes = password.GetBytes(KeySize / 8);
	RijndaelManaged symmetricKey = new RijndaelManaged();
	symmetricKey.Mode = CipherMode.CBC;
	ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, InitialVectorBytes);
	MemoryStream memoryStream = new MemoryStream();
	CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
	cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
	cryptoStream.FlushFinalBlock();
	byte[] cipherTextBytes = memoryStream.ToArray();
	memoryStream.Close();
	cryptoStream.Close();
	string cipherText = Convert.ToBase64String(cipherTextBytes);
	return cipherText;
}

public static string Decrypt(string PlainText, string Password, string SaltValue, string HashAlgorithm, int PasswordIterations, string InitialVector, int KeySize)
{
	byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
	byte[] saltValueBytes = Encoding.ASCII.GetBytes(SaltValue);
	byte[] cipherTextBytes = Convert.FromBase64String(PlainText);
	PasswordDeriveBytes password = new PasswordDeriveBytes(Password, saltValueBytes, HashAlgorithm, PasswordIterations);
	byte[] keyBytes = password.GetBytes(KeySize / 8);
	RijndaelManaged symmetricKey = new RijndaelManaged();
	symmetricKey.Mode = CipherMode.CBC;
	ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, InitialVectorBytes);
	MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
	CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
	byte[] plainTextBytes = new byte[cipherTextBytes.Length];
	int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
	memoryStream.Close();
	cryptoStream.Close();
	string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
	return plainText;
}

Framework 2.0 y superiores

Ahora si van a utilizar una versión superior del framework, pueden usar el siguiente código:

    /// <summary>
    /// Algoritmo para encripatar en Rijndael o mas conocido como AES
    /// </summary>
    /// <param name="plainText">Texto a encriptar</param>
    /// <param name="password">Nuestra contraseña</param>
    /// <param name="saltValue">Puede ser cualquier cadena</param>
    /// <param name="passwordIterations">Debe ser una cadena de 16 bytes, es decir, 16 caracteres</param>
    /// <param name="initialVector">Cantidad de veces que se pasará el algoritmo (1 o 2 es suficiente)</param>
    /// <param name="keySize">Puede ser cualquiera de estos tres valores: 128, 192 o 256</param>
    /// <returns>texto encriptado</returns>
    public string EncriptarRijndael(string plainText, string password, string saltValue, int passwordIterations, string initialVector, int keySize)
    {
        MemoryStream memoryStream = null;
        CryptoStream cryptoStream = null;
        try
        {
            var initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
            var saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
            var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
            var passwd = new Rfc2898DeriveBytes(password, saltValueBytes, passwordIterations);
            var keyBytes = passwd.GetBytes(keySize / 8);
            var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC };
            var encryptor = symmetricKey.CreateEncryptor(keyBytes, initialVectorBytes);
            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            var cipherTextBytes = memoryStream.ToArray();
            var cipherText = Convert.ToBase64String(cipherTextBytes);

            return cipherText;
        }
        catch
        { throw; }
        finally
        {
            if (memoryStream != null) memoryStream.Close();
            if (cryptoStream != null) cryptoStream.Close();
        }

    }

    /// <summary>
    /// Algoritmo para desencripatar en Rijndael o mas conocido como AES
    /// </summary>
    /// <param name="plainText">Texto a encriptar</param>
    /// <param name="password">Nuestra contraseña</param>
    /// <param name="saltValue">Puede ser cualquier cadena</param>
    /// <param name="passwordIterations">Debe ser una cadena de 16 bytes, es decir, 16 caracteres</param>
    /// <param name="initialVector">Cantidad de veces que se pasará el algoritmo (1 o 2 es suficiente)</param>
    /// <param name="keySize">Puede ser cualquiera de estos tres valores: 128, 192 o 256</param>
    /// <returns>texto desencriptado</returns>
    public string DesencriptarRijndael(string plainText, string password, string saltValue, int passwordIterations, string initialVector, int keySize)
    {
        MemoryStream memoryStream = null;
        CryptoStream cryptoStream = null;
        try
        {
            var initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
            var saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
            var cipherTextBytes = Convert.FromBase64String(plainText);
            var passwd = new Rfc2898DeriveBytes(password, saltValueBytes, passwordIterations);
            var keyBytes = passwd.GetBytes(keySize / 8);
            var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC };
            var decryptor = symmetricKey.CreateDecryptor(keyBytes, initialVectorBytes);
            memoryStream = new MemoryStream(cipherTextBytes);
            cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
            var plainTextBytes = new byte[cipherTextBytes.Length];
            var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

            var desencriptado = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);

            return desencriptado;
        }
        catch
        { throw; }
        finally
        {
            if (memoryStream != null) memoryStream.Close();
            if (cryptoStream != null) cryptoStream.Close();
        }
    }

Comentarios desde Facebook:

  1. avatar
    alfredo MEXICO Google Chrome Windows
    14 abril 2012 at 20:37 #

    muy bueno tu código muchas gracias por publicarlo y entender mas de este encriptado

Responder