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 |