Table of contents

    개요

    AES는 ISO/IEC 18033-3 표준에 포함되어 있다.

    • 암호화 키로 128 bit, 192 bit, 256 bit를 가질 수 있는데 이를 AES-128, AES-192, AES-256 라고 한다.
    • 128bit / 16Byte / 10 라운드
    • 192bit / 24Byte / 12 라운드
    • 256bit / 32Byte / 14 라운드

     

    AES는 대입치환(Substitution-Permutation Network)을 사용한다.

    말 그대로 대입(Substitution)과 치환(Permutation)을 이용하는 방식으로, bit 전체를 암호화한다.

     

    패딩

    • 암복화 알고리즘 경우 input 데이터의 길이는 block size의 배수가 되어야 한다.
    • 하지만, 데이터의 길이가 block size의 배수가 아닌 경우 마지막 블록에 값을 추가해 block size의 배수로 맞춘다.
    • 이때, 추가 되는 행위 또는 값을 padding 이라고 한다.
    • 통신에서도 많이 활용되고, 처리속도를 높이기 위해 활용되기도 함

     

     

    IV(Initialize Vector, 초기화 벡터)

    이전에 암호화했던 블록을 XOR 연산을 한 다음에 암호화를 수행하는 경우가 있다. 하지만, 첫 블록의 경우 이전 데이터가 없으므로 초기화 벡터를 이용한다. 크기는 AES의 bit와 동일하게 맞춘다. 공개가 되어도 상관 없다.

     

     

    코드 예제

    ChatGPT로 생성한 코드 예제다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    //AES
    using System.IO;
    using System.Security.Cryptography;
    
    namespace AES_EnDecryption_Csharp
    {
        class Program
        {
            private static void EncryptFile(string inputFile, string outputFile, byte[] key, byte[] iv)
            {
                using (Aes aes = Aes.Create())
                {
                    aes.Key = key;
                    aes.IV = iv;
    
                    using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                    {
                        using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                        {
                            using (ICryptoTransform encryptor = aes.CreateEncryptor())
                            {
                                using (CryptoStream cs = new CryptoStream(fsOutput, encryptor, CryptoStreamMode.Write))
                                {
                                    fsInput.CopyTo(cs);
                                }
                            }
                        }
                    }
                }
            }
    
            private static void DecryptFile(string inputFile, string outputFile, byte[] key, byte[] iv)
            {
                using (Aes aes = Aes.Create())
                {
                    aes.Key = key;
                    aes.IV = iv;
    
                    using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                    {
                        using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                        {
                            using (ICryptoTransform decryptor = aes.CreateDecryptor())
                            {
                                using (CryptoStream cs = new CryptoStream(fsInput, decryptor, CryptoStreamMode.Read))
                                {
                                    cs.CopyTo(fsOutput);
                                }
                            }
                        }
                    }
                }
            }
    
            static void Main(string[] args)
            {
                byte[] key = new byte[16];
                byte[] iv = new byte[16];
                Array.Clear(key, 0, key.Length);
                Array.Clear(iv, 0, iv.Length);
    
                // 키와 초기화 벡터 설정
                for(int i=0; i<16; i++) { 
                    key[i] = (byte)i;
                    iv[i] = (byte)i;
                }
    
                // 암호화할 XML 파일 지정
                string inputFile = "input.xml";
    
                // 암호화 수행
                string encryptedFile = "ecnrypted.xml";
                EncryptFile(inputFile, encryptedFile, key, iv);
    
                // 복호화 수행
                string decryptedFile = "decrypted.xml";
                DecryptFile(encryptedFile, decryptedFile, key, iv);
            }
        }
    }

     

    '소프트웨어 > 개념' 카테고리의 다른 글

    IPC(Inter-Process Communication)와 RPC(Remote Procedure Call)  (0) 2023.07.20
    .NET Wrapper란?  (0) 2023.07.11
    .d파일이란?  (0) 2023.07.11