Criptografia AES com C#

0
O .NET fornece classes de alto nível para vários algoritmos de criptografia, tanto simétricos quanto assimétricos. O Advanced Encryption Standard (AES) é um dos algoritmos de criptografia simétrica que permite que ambas as partes, emissor e receptor, usem a mesma chave para criptografar e descriptografar dados.
AES foi desenvolvido por dois criptógrafos belgas, Vincent Rijmen e Jan Daemen. Em 2001, a AES foi selecionada como padrão para criptografia pelo Instituto Nacional de Padrões e Tecnologia (NIST) dos EUA. O AES suporta tamanhos de chave de 128, 192 e 256 bits e tamanho de bloco de 128 bits.
AesManaged class é uma implementação gerenciada do algoritmo AES. Hoje vou mostrar como usar a classe AesManaged para aplicar um algoritmo AES para criptografar e descriptografar dados em .NET e C #.
As etapas a seguir são necessárias para criptografar dados usando AesManaged:
// 1 - criar a instancia 
AesManaged aes = new AesManaged(); 

// 2 - criar o encriptor com sua chave personalizada
ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);  

// 3- utilzar o memory stream
MemoryStream ms = new MemoryStream();  


//utilizar a criptografia dentro do memory stream
using(CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))   
{  
    using(StreamWriter sw = new StreamWriter(cs))  
    sw.Write(plainText);  
    encrypted = ms.ToArray();  
}  



Veja agora uma utilização de um console completo:
    using System;  
    using System.IO;  
    using System.Security.Cryptography;  
    class ManagedAesSample {  
        public static void Main() {  
            Console.WriteLine("Enter text that needs to be encrypted..");  
            string data = Console.ReadLine();  
            EncryptAesManaged(data);  
            Console.ReadLine();  
        }  
        static void EncryptAesManaged(string raw) {  
            try {  
                // Create Aes that generates a new key and initialization vector (IV).    
                // Same key must be used in encryption and decryption    
                using(AesManaged aes = new AesManaged()) {  
                    // Encrypt string    
                    byte[] encrypted = Encrypt(raw, aes.Key, aes.IV);  
                    // Print encrypted string    
                    Console.WriteLine($ "Encrypted data: {System.Text.Encoding.UTF8.GetString(encrypted)}");  
                    // Decrypt the bytes to a string.    
                    string decrypted = Decrypt(encrypted, aes.Key, aes.IV);  
                    // Print decrypted string. It should be same as raw data    
                    Console.WriteLine($ "Decrypted data: {decrypted}");  
                }  
            } catch (Exception exp) {  
                Console.WriteLine(exp.Message);  
            }  
            Console.ReadKey();  
        }  
        static byte[] Encrypt(string plainText, byte[] Key, byte[] IV) {  
            byte[] encrypted;  
            // Create a new AesManaged.    
            using(AesManaged aes = new AesManaged()) {  
                // Create encryptor    
                ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);  
                // Create MemoryStream    
                using(MemoryStream ms = new MemoryStream()) {  
                    // Create crypto stream using the CryptoStream class. This class is the key to encryption    
                    // and encrypts and decrypts data from any given stream. In this case, we will pass a memory stream    
                    // to encrypt    
                    using(CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) {  
                        // Create StreamWriter and write data to a stream    
                        using(StreamWriter sw = new StreamWriter(cs))  
                        sw.Write(plainText);  
                        encrypted = ms.ToArray();  
                    }  
                }  
            }  
            // Return encrypted data    
            return encrypted;  
        }  
        static string Decrypt(byte[] cipherText, byte[] Key, byte[] IV) {  
            string plaintext = null;  
            // Create AesManaged    
            using(AesManaged aes = new AesManaged()) {  
                // Create a decryptor    
                ICryptoTransform decryptor = aes.CreateDecryptor(Key, IV);  
                // Create the streams used for decryption.    
                using(MemoryStream ms = new MemoryStream(cipherText)) {  
                    // Create crypto stream    
                    using(CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {  
                        // Read crypto stream    
                        using(StreamReader reader = new StreamReader(cs))  
                        plaintext = reader.ReadToEnd();  
                    }  
                }  
            }  
            return plaintext;  
        }  
    }  
Um grande abraço!
Referências:
  • https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
  • https://docs.microsoft.com
  • https://www.c-sharpcorner.com/members/mahesh-chan

 

Compartilhe.

Sobre o autor

Criador do blog Código Simples e com mais 9 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist. Atuando em funções analista, desenvolvedor, arquiteto, líder técnico e gestor de equipes. Mais informações em : http://jhonathansoares.com