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

4 comments for “Classe para encriptar e decriptar strings usando C#

  1. Stella Oliveira
    11/09/2019 at 20:25

    Olá, tive um erro ao descriptar a string no FlushFinalBlock

    • lisura
      14/09/2019 at 22:06

      Stella, boa noite

      Eu rodei a aplicação novamente aqui na minha maquina e não tive erro no FlushFinalBlock.
      Vou colocar aqui as informações do App.config para que você possa comparar.

      App.Config

      Se puder me dar mais informações do erro que você teve, talvez eu possa ajudar.
      Obrigado pelo comentário.

      • Stella Oliveira
        17/09/2019 at 15:24

        Consegui cara, valeu de mais !

        • lisura
          20/09/2019 at 01:29

          Obrigado por enviar sua dúvida.

Leave a Reply

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