본문 바로가기
개발

[C#] AES256 암/복호화

by 개발에대해 2024. 7. 10.

 

AES256 CBC 모드로 데이터 암호화 및 복호화하는 방법

 

AES256 암호화 소개

AES (Advanced Encryption Standard) 알고리즘은 데이터를 안전하게 암호화하는데 널리 사용됩니다.

특히 AES256은 256비트 키를 사용하는 강력한 암호화 방법으로, 데이터 보호에 효과적입니다.

이번 포스트에서는 C#에서 AES256을 사용하여 데이터를 CBC (Cipher Block Chaining) 모드로 암호화하고 복호화하는 방법을 소개합니다.

 

AES256의 주요 암호화 모드

AES는 여러 가지 모드를 지원하며, 각 모드는 데이터 암호화 및 복호화 과정에서 다른 방식으로 동작합니다.

이 중에서 가장 많이 사용되는 모드는 다음과 같습니다:

1. ECB (Electronic Codebook) 모드

ECB 모드는 가장 간단한 암호화 모드로, 각 블록을 독립적으로 암호화합니다. 동일한 평문 블록은 항상 동일한 암호문 블록으로 변환됩니다. 이로 인해 보안성이 낮은 편이며, 같은 데이터가 반복될 경우 암호문도 반복되는 문제가 발생할 수 있습니다. 이 때문에 중요한 데이터를 암호화할 때는 권장되지 않습니다.

2. CBC (Cipher Block Chaining) 모드

CBC 모드는 암호화할 각 블록을 이전 암호문 블록과 XOR 연산 후 암호화하는 방식입니다. 이 방식은 각 블록을 독립적으로 암호화하는 것에 비해 보안성이 더 뛰어납니다. 왜냐하면 동일한 평문도 매번 다른 암호문을 생성하기 때문입니다. 그러나 CBC 모드에서는 암호화 및 복호화 시 IV(초기화 벡터)를 사용해야 하므로 IV 관리가 중요합니다. 이 모드는 많은 암호화 응용 프로그램에서 기본적으로 사용됩니다.

3. CFB (Cipher Feedback) 모드

CFB 모드는 암호화된 블록을 부분적으로 복호화한 뒤 그 결과를 평문과 XOR 연산하여 암호화합니다. 이 방식은 스트림 암호화처럼 동작할 수 있으며, 작은 단위의 데이터를 처리할 때 유용합니다. CFB는 CBC 모드보다 더 적은 데이터 크기를 다룰 수 있으며, 실시간 암호화에 유리합니다.

4. OFB (Output Feedback) 모드

OFB 모드는 암호화된 출력 블록을 다시 입력으로 사용하여 연속적으로 암호화합니다. 이 방식은 블록 암호를 스트림 암호처럼 사용할 수 있게 해줍니다. OFB 모드는 오류 전파가 없기 때문에 한 비트 오류가 전체 암호문에 영향을 미치지 않지만, IV 관리가 중요합니다.

5. CTR (Counter) 모드

CTR 모드는 카운터 값을 증가시키면서 암호화된 카운터와 평문을 XOR 연산하여 암호문을 생성하는 방식입니다. 이 모드는 암호화 및 복호화 속도가 빠르며, 병렬 처리에 적합한 특성을 가지고 있습니다. CTR 모드는 오류 전파가 없고, 스트림 암호처럼 동작하여 실시간 처리에 유리합니다.

이와 같이 AES256은 다양한 암호화 모드를 지원하며, 각 모드는 사용 용도와 환경에 따라 다르게 선택될 수 있습니다. 각 모드는 보안성, 성능, 처리 속도 등에 따라 특성이 다르므로, 사용하는 애플리케이션의 요구 사항에 맞는 모드를 선택하는 것이 중요합니다.

AES256 CBC 모드 암호화 예제

먼저, AES256 CBC 모드를 사용하여 데이터를 암호화하는 방법을 살펴봅니다.

아래 코드는 C#에서 RijndaelManaged 클래스를 사용하여 데이터를 암호화하는 예제입니다.


public static String EncryptAES256(String text)
{            
    RijndaelManaged RijndaelCipher = new RijndaelManaged();
    RijndaelCipher.Mode = CipherMode.CBC;  // CBC 모드 사용
    RijndaelCipher.Padding = PaddingMode.PKCS7; // 패딩 모드 설정

    byte[] PlainText = Encoding.Unicode.GetBytes(text);  // 평문을 바이트 배열로 변환
    byte[] Salt = Encoding.ASCII.GetBytes(AES_KEY.Length.ToString());  // Salt 생성

    PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(AES_KEY, Salt);  // 비밀번호에서 키 생성
    ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));  // 암호화기 생성
    
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);
    cryptoStream.Write(PlainText, 0, PlainText.Length);  // 암호화 진행
    cryptoStream.FlushFinalBlock();

    byte[] CipherBytes = memoryStream.ToArray();  // 암호화된 바이트 배열
    memoryStream.Close();
    cryptoStream.Close();

    return Convert.ToBase64String(CipherBytes);  // 암호화된 데이터를 Base64로 변환하여 반환            
}
            

위 코드에서 EncryptAES256 메서드는 주어진 평문을 AES256 CBC 모드로 암호화하여 Base64 형식으로 반환합니다. Salt와 PasswordDeriveBytes 클래스를 사용하여 강력한 암호화 키를 생성합니다.

 

AES256 CBC 모드 복호화 예제

다음은 AES256 CBC 모드로 암호화된 데이터를 복호화하는 예제입니다.

복호화 과정은 암호화와 거의 반대로 진행되며, 암호화된 데이터를 복호화하여 원래의 평문을 복원합니다.


public static String DecryptAES256(String text)
{            
    RijndaelManaged RijndaelCipher = new RijndaelManaged();

    byte[] EncrypteData = Convert.FromBase64String(text);  // 암호화된 데이터를 Base64로부터 복원
    byte[] Salt = Encoding.ASCII.GetBytes(AES_KEY.Length.ToString());  // Salt 생성

    PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(AES_KEY, Salt);  // 비밀번호에서 키 생성
    ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));  // 복호화기 생성

    MemoryStream memoryStream = new MemoryStream(EncrypteData);  // 암호화된 데이터 스트림
    CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);  // 복호화 스트림 생성

    byte[] PlainText = new byte[EncrypteData.Length];  // 복호화된 평문 저장 배열
    int DecrypedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);  // 복호화 진행

    memoryStream.Close();
    cryptoStream.Close();

    return Encoding.Unicode.GetString(PlainText, 0, DecrypedCount);  // 평문으로 변환하여 반환
}
            

위 코드에서 DecryptAES256 메서드는 암호화된 데이터를 복호화하여 원래의 평문으로 되돌려줍니다. 암호화된 데이터를 Base64에서 복원하고, 복호화기를 사용하여 평문을 추출합니다.

 

AES256 CBC 모드의 보안성

AES256은 256비트 키를 사용하여 데이터를 암호화하는 강력한 알고리즘입니다.

CBC 모드는 이전 블록의 암호문을 현재 블록의 암호화에 사용하는 방식으로, 동일한 평문에 대해 항상 다른 암호문이 생성됩니다. 이는 동일한 데이터가 반복되어 암호화되더라도 결과가 달라지도록 보장하여 보안을 강화합니다.

'개발' 카테고리의 다른 글

[Wireshark] 특정값으로 필터링  (0) 2024.07.16
[C#] 오디오 입력장치 조회  (0) 2024.07.11
[c++] cmake 작성법  (0) 2024.07.03
[java] enum 상수값 가져오기  (0) 2024.07.01
[html] Thymeleaf 'th:if'  (0) 2024.07.01