C#의 AES 암호화

반응형

.NET은 대칭 및 비대칭의 다양한 암호화 알고리즘에 대한 상위 수준 클래스를 제공합니다. AES(Advanced Encryption Standard)는 송신자, 수신자 모두가 동일한 키를 사용하여 데이터를 암호화하고 해독할 수 있도록 하는 대칭 암호화 알고리즘 중 하나입니다.

AES는 두 명의 벨기에 암호학자 Vincent Rijmen과 Jan Daemen이 개발했습니다. 2001년에 AES는 미국 국립표준기술연구소(NIST)에 의해 암호화 표준으로 선정되었습니다. AES는 128, 192, 256비트 키 크기와 128비트 크기를 지원합니다.

AesManaged 클래스는 AES 알고리즘의 관리형 구현입니다. 이 문서에서는 AesManaged 클래스를 사용하여 AES 알고리즘을 적용하여 .NET 및 C#에서 데이터를 암호화하고 해독하는 방법을 보여줍니다.

AesManaged를 사용하여 데이터를 암호화하려면 다음 단계가 필요합니다.

 

1 단계

AesManaged를 생성하고,

AesManaged aes = new AesManaged();
 
 

2 단계

암호화기 생성,

ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);
 
 

3단계

MemoryStream을 생성하고,

MemoryStream ms = new MemoryStream();
 
 

4단계

MemoryStream 및 Encrypter에서 CryptoStream을 생성하고 작성합니다.

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();
}
 
 

전체 코드는 목록 1에 나열되어 있습니다. 코드를 테스트하려면 Visual Studio에서 .NET Core 프로젝트를 만들고 코드를 복사하여 붙여넣습니다. 

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;
    }
}
 
반응형