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