📌 개요

[ XOR 암복호화 알고리즘 ]
[보안] C# XOR 암복호화 알고리즘
📌 개요 유니티로 로컬 데이터 저장을 개발하다 json으로 직렬화하여 데이터를 저장하는 기능을 구현하였습니다. 그런데... 날 것으로 저장하니 데이터가 훤히 보이네요ㄷㄷ... 아무래도
gus6615.tistory.com
이전에 XOR 암복호화에 대해 알아봤었습니다.
하지만 이 알고리즘을 사용하면 보안이 취약하다는 점이 있습니다.
지난 포스팅을 요약하자면,

"AAAAAAAAAAAAAAAA" 와 같은 평문을 사용하면 일정한 패턴이 발생해요.

패턴을 평문과 다시 XOR하면 Key을 확보할 수 있습니다.
이처럼 XOR 암복호화에는 큰 보안 문제점이 존재합니다.
그래서 이번에는 보안이 좋고 대중적으로 쓰이는 AES-256 암복호화에 대해 알아보겠습니다!
📌 AES-256 암복호화란?

AES-256 암복호화: 데이터 암호화에 널리 사용되는 대칭키 암복호화 알고리즘
2001년 미국 국립표준기술연구소(NIST)가 보안 표준으로 채택한 알고리즘입니다.
대칭 키 암호화 알고리즘이기에 암호화와 복호화에 동일한 키를 사용합니다.
그 중에서 AES는 총 3가지 형태의 알고리즘이 존재합니다.
- AES-128 : 128 bit 키를 사용
- AES-192 : 192 bit 키를 사용
- AES-256 : 256 bit 키를 사용
AES 암복호화 원리

평문을 128 비트의 고정된 블록 크기로 나눠서 여러 블록에 대해 단계적으로 데이터를 암호화합니다.
1 ~ (9, 11, 13) 라인드에는 SubBytes, ShiftRows, MixColumns, AddRoundKey를 순서대로 실행합니다.
※ AES-128, 192, 256에 따라 각각 9번, 11번 ,13번 반복합니다.
마지막 (10, 12, 14) 번째 라운드에서는 SubBytes, ShiftRows, AddRoundKey를 순서대로 실행합니다.
즉, 라운드에 따라 점진적으로 네가지 연산을 통해 데이터를 암호화합니다.
Cipher Mode : 데이터를 암호화하는 방식
- ECB : 각 블록을 독립적으로 암호화
- 간단하고 구현 용이
- 패턴 노출 가능, 보안에 취약
- CBC : 이전 블록을 기반으로 XOR 후 암호화 (초기화 벡터 IV로 첫번째 블록 처리)
- 동일한 평문이라도 다른 암호문을 생성하며 패턴 노출 방지
- CTR : 카운터 값을 계족 증가하며 암호화 (평문 XOR 암호화된 카운터 값)
- OFB : 암호 출력 반복적으로 XOR
- CFB : 이전 암호문 암호화 후 XOR
Cipher Mode는 주로 보안과 성능이 뛰어난 CBC를 사용합니다.
Padding Mode : 데이터의 길이가 블록 크기의 배수가 아닐 때 부족한 부분을 채우는 방식
- PKCS5 : 블록 크기를 8바이트로 제한
- 블록 크기가 8바이트인 알고리즘(DES, 3DES)에서 사용되기 때문에 AES에서는 사용되지 않습니다.
- PKCS7 : 가변 블록 크기(AES의 16바이트 포함) 지원
- 현재 암호화 알고리즘인 AES에서 주로 사용합니다.
Padding Mode는 주로 PKCS7을 사용합니다.
정리해보자면 일반적으로 AES 암복호화를 구현할 때는 아래 구성요소를 주로 사용합니다.
SecretKey, IV(Initialize Vector), Cipher Mode(CBC), Padding Mode(PKCS7)
📌 AES-256 암복호화 구현
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
private static readonly string _aesKey = Convert.ToBase64String(Encoding.UTF8.GetBytes("R4ADa1K14Wuy4oWza01SJfdverwnC7Pl".PadRight(32, '0')));
private static readonly string _aesIv = Convert.ToBase64String(Encoding.UTF8.GetBytes("ONZjdMmli4TfDciQ".PadRight(16, '0')));
public static string Aes256Encrypt(string plainText)
{
byte[] encrypted;
using (Aes aes = Aes.Create())
{
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Key = Convert.FromBase64String(_aesKey);
aes.IV = Convert.FromBase64String(_aesIv);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream ms = new())
{
using (CryptoStream cs = new(ms, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter sw = new(cs))
{
sw.Write(plainText);
}
encrypted = ms.ToArray();
}
}
}
return Convert.ToBase64String(encrypted);
}
public static string Aes256Decrypt(string encryptedText)
{
string decrypted;
byte[] cipher = Convert.FromBase64String(encryptedText);
using (Aes aes = Aes.Create())
{
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Key = Convert.FromBase64String(_aesKey);
aes.IV = Convert.FromBase64String(_aesIv);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream ms = new(cipher))
{
using (CryptoStream cs = new(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader sr = new(cs))
{
decrypted = sr.ReadToEnd();
}
}
}
}
return decrypted;
}
본 코드는 Unity와 C#에 기반한 AES-256 알고리즘 코드입니다.
'IT > 기술 정리' 카테고리의 다른 글
[보안] C# XOR 암복호화 알고리즘 (0) | 2024.12.06 |
---|