Classe para encriptar e decriptar strings usando C#

Existe muita literatura em como encriptar strings e muitos códigos prontos disponíveis na internet.

Eu gosto de manter a simplicidade do meu código, principalmente aquele que publico para referencia.

Neste exemplo que montei eu utilizei o namespace
using System.Security.Cryptography;
Retirado da documentação oficial do .NET core: ‘O namespace System.Security.Cryptography fornece serviços de criptografia, incluindo codificação e decodificação seguras de dados, bem como muitas outras operações, como hash, geração de números aleatórios e autenticação de mensagens.’

Agora vem o momento ‘show me the code’

A classe que faz a lógica de encriptar e decriptar a string segue:

using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace Validation
{
    class EncryptDecrypt
    {
        public byte[] Key { get; set; }
        public byte[] IniVetor { get; set; }
        public Aes Algorithm { get; set; }

        public EncryptDecrypt(byte[] key)
        {
            this.Key = key;
            this.IniVetor = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            this.Algorithm = Aes.Create();
        }

        public EncryptDecrypt(byte[] key, byte[] iniVetor)
        {
            this.Key = key;
            this.IniVetor = iniVetor;
            this.Algorithm = Aes.Create();
        }

        public string Encrypt(string entryText)
        {
            byte[] symEncryptedData;

            var dataToProtectAsArray = Encoding.UTF8.GetBytes(entryText);
            using (var encryptor = this.Algorithm.CreateEncryptor(this.Key, this.IniVetor))
            using (var memoryStream = new MemoryStream())
            using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
            {
                cryptoStream.Write(dataToProtectAsArray, 0, dataToProtectAsArray.Length);
                cryptoStream.FlushFinalBlock();
                symEncryptedData = memoryStream.ToArray();
            }
            this.Algorithm.Dispose();
            return Convert.ToBase64String(symEncryptedData);
        }

        public string Decrypt(string entryText)
        {
            var symEncryptedData = Convert.FromBase64String(entryText);
            byte[] symUnencryptedData;
            using (var decryptor = this.Algorithm.CreateDecryptor(this.Key, this.IniVetor))
            using (var memoryStream = new MemoryStream())
            using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
            {
                cryptoStream.Write(symEncryptedData, 0, symEncryptedData.Length);
                cryptoStream.FlushFinalBlock();
                symUnencryptedData = memoryStream.ToArray();
            }
            this.Algorithm.Dispose();
            return System.Text.Encoding.Default.GetString(symUnencryptedData);
        }
    }
}

Minha aplicação para teste segue:

using System;

namespace Validation
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string dataToProtect = "String super secure";
            var key = new byte[] { 12, 2, 56, 117, 12, 67, 33, 23, 12, 2, 56, 117, 12, 67, 33, 23 };

            var EncryptTest = new EncryptDecrypt(key);
            string base64EncryptString = EncryptTest.Encrypt(dataToProtect);

            Console.WriteLine("Encrypt: "+ base64EncryptString);

            var DecryptTest = new EncryptDecrypt(key);
            string base64DecryptString = DecryptTest.Decrypt(base64EncryptString);

            Console.WriteLine("Decrypt: " + base64DecryptString);
            
            Console.Read();
        }
    }
}

Ambas estão no mesmo namespace pois foram criadas apenas para validar o funcionamento da classe e não para ser utilizado da maneira que se encontra.

Ao rodar este código a saída deve ser algo muito parecido com esta:

Encrypt: RIiwMvBUHn9xcwSywVe+XVMf79zTMnQNfUUi29vUY2U=
Decrypt: String super secure

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *