Implementando a criptografia AES 256 (Rijndael) no C#

Se você está querendo implementar uma segurança extra de boa qualidade em seu projeto eis aqui uma ótima opção. Trata-se da criptografia AES 256 bit (Rijndael).

Na minha opinião é a melhor opção de criptografia factível com as classes do .Net Framework.

Bom, chega de papo. Aqui está o código completo:

using System;
using System.Text;
using System.Security.Cryptography;

namespace HL
{
    public class Aes256 : IDisposable
    {
        private RijndaelManaged Engine;
        private SHA256CryptoServiceProvider HashProvider;
        private byte[] HashBytes;

        private string _Password;

        /// <summary>
        /// Retorna ou modifica a senha usada por esta instância para opções de criptografia e descriptografia
        /// </summary>
        public string Password
        {
            get { return _Password; }
            set
            {
                _Password = value;
                HashBytes = HashProvider.ComputeHash(Encoding.UTF8.GetBytes(value));
                Engine.Key = HashBytes;
            }
        }

        /// <summary>
        /// Cria uma nova instância
        /// </summary>
        /// <param name="Password">Senha utilizada para criptografar e descriptografar</param>
        public Aes256(string Password)
        {
            _Password = Password;
            Engine = new RijndaelManaged();
            HashProvider = new SHA256CryptoServiceProvider();
            HashBytes = HashProvider.ComputeHash(Encoding.UTF8.GetBytes(Password));
            Engine.Mode = CipherMode.CBC;
            Engine.Key = HashBytes;
        }

        /// <summary>
        /// Criptografa um buffer de bytes
        /// </summary>
        /// <param name="Buffer"></param>
        /// <returns></returns>
        public byte[] Encrypt(byte[] Buffer)
        {
            using (ICryptoTransform Encryptor = Engine.CreateEncryptor())
                return Encryptor.TransformFinalBlock(Buffer, 0, Buffer.Length);

        }

        /// <summary>
        /// Descriptografa um buffer de bytes
        /// </summary>
        /// <param name="Buffer"></param>
        /// <returns></returns>
        public byte[] Decrypt(byte[] Buffer)
        {
            using (ICryptoTransform Decryptor = Engine.CreateDecryptor())
                return Decryptor.TransformFinalBlock(Buffer, 0, Buffer.Length);
        }

        /// <summary>
        /// Criptografa um texto
        /// </summary>
        /// <param name="Str"></param>
        /// <returns></returns>
        public string Encrypt(string Str)
        {
            return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(Str)));
        }

        /// <summary>
        /// Descriptografa um texto
        /// </summary>
        /// <param name="Str"></param>
        /// <returns></returns>
        public string Decrypt(string Str)
        {
            return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(Str)));
        }

        public void Dispose()
        {
            Engine.Dispose();
            HashProvider.Dispose();
            HashBytes = null;
            _Password = null;
        }

    }
}

Em menos de 100 linhas de código temos uma classe totalmente funcional para criptografar e descriptografar textos e arrays de bytes usando a cifra Rijndael (AES) com uma poderosa chave SHA de 256 bits. Mas não esqueça, mesmo se tratando de uma cifra muito poderosa é a sua senha quem faz a proteção! Então capriche nela!!!

Até a próxima, e qualquer dúvida, poste nos comentários!

Anúncios

2 comentários

  1. Olá, quando eu tento Decrypt da o seguinte erro: Padding is invalid and cannot be removed.
    Estou salvando a senha criptografada no banco e depois tento descriptografar para validar.

Deixe um comentário :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s