본문 바로가기
프로그래밍

C# AES256-CBC 암호화/복호화

by 도장깨기 2021. 1. 29.
728x90
반응형

오늘 소개할 내용 AES256-CBC 암호화 입니다.

 

 

 

제가 보안 쪽 전문가는 아니지만 회사 프로젝트에서 사용했던 AES256-CBC 암호화, 복호화 샘플코드를 공유하고자 합니다.

 

암호화 전문가는 아니지만 그래도 기본적인 개념을 알아야하니까 간단히 서치해본 결과

 

AES

암호화 방식 중 하나로 대칭키 방식으로 암호화 및 복호화에 사용되는 키 값이 동일한 방식이라고 합니다.

 

AES뒤에 붙는 256 숫자는 키값의 길이라고 합니다. 

그래서 AES128(12B bit), AES192(192bit), AES256(256bit) 등으로 나뉜다고 하네요.

 

키값이 길면 길수록 보안 공격에 대해 더 유리하게 방어할 수 있다고 합니다.

 

<Encrypt(암호화) / Decrpyt(복호화) 샘플 소스코드>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Security.Cryptography;

namespace CI.Common
{
    /// <summary>
    /// AES256-CBC 암호화    
    /// 암호화방식 : AES (대칭키 : 256bit (32Bytes), IV : 128bit (16Bytes))
    /// 모드 : CBC
    /// 패딩 : PKCS7
    /// </summary>
    public class CryptoAES256CBC
    {
        /// <summary>
        /// 암호화
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string Encrypt(string str)
        {
            return Encrypt(str, KeyValue.SECRET_KEY, KeyValue.IV_KEY);
        }
        public string Encrypt(string plainText, string keyString, string ivString)
        {
            try
            {
                RijndaelManaged aes = new RijndaelManaged();
                aes.KeySize = 256;
                aes.BlockSize = 128;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = Convert.FromBase64String(keyString);
                aes.IV = Convert.FromBase64String(ivString);

                var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
                byte[] xBuff = null;
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
                    {
                        byte[] xXml = Encoding.UTF8.GetBytes(plainText);
                        cs.Write(xXml, 0, xXml.Length);
                    }

                    xBuff = ms.ToArray();
                }

                String Output = Convert.ToBase64String(xBuff);
                return Output;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 복호화
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string Decrypt(string str)
        {
            return Decrypt(str, KeyValue.SECRET_KEY, KeyValue.IV_KEY);
        }
        public string Decrypt(string combinedString, string keyString, string ivString)
        {
            try
            {
                RijndaelManaged aes = new RijndaelManaged();
                aes.KeySize = 256;
                aes.BlockSize = 128;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = Convert.FromBase64String(keyString);
                aes.IV = Convert.FromBase64String(ivString);

                var decrypt = aes.CreateDecryptor();
                byte[] xBuff = null;
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
                    {
                        byte[] xXml = Convert.FromBase64String(combinedString);
                        cs.Write(xXml, 0, xXml.Length);
                    }

                    xBuff = ms.ToArray();
                }

                string Output = Encoding.UTF8.GetString(xBuff);
                return Output;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
    }

}

 

 

AES 암호화/복호화에는

1. Secret key

2. IV

3. CiperMode

4. Padding Mode

가 필요한대

제 소스의 경우에는 CiperMode는 CBC,

Padding Mode는 PKCS7을 사용한 경우입니다.

 

크게 CiperMode의 경우 

EBC, CBC가 있는데 

제가 사용한 CBC는

 

 

이런형태라고 하네요... 참고만!

 

 

 

그리고 Key와 IV의 경우 Base64기반으로 작성되었어요.

 

 

암호화/복호화 실행
		/// <summary>
		/// Crypto AES256-CBC _ 암호화
		/// </summary>
		/// <param name="plainText">암호화,복호화할 TEXT</param>
		private void AES_Enc(string Encrypt)
		{
			try
			{
				CryptoAES256CBC crypto = new CryptoAES256CBC();

				string response = crypto.Encrypt(Encrypt);
				Console.WriteLine("암호화: " + response);

			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// 11. Crypto AES256-CBC _ 복호화
		/// </summary>
		/// <param name="plainText">암호화,복호화할 TEXT</param>
		private void AES_Dec(string Decrypt)
		{
			try
			{
				CryptoAES256CBC crypto = new CryptoAES256CBC();

				string response2 = crypto.Decrypt(Decrypt);
				Console.WriteLine("복호화: " + response2);

			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

 

<실행결과>

- 암호화 

 

 

제 블로그 주소를 넣어서 암호화한 뒤

 

- 복호화

 

 

 

다시 복호화로 돌리면 

블로그 주소가 나오는걸 볼 수 있어요~

암호화 복호화가 잘됐다는 결과겠죠!

 

 

 

이렇게 활용하시면 될거같습니다!

초보 개발자라 부족한 부분이 많을 수 있으니 

참고 부탁드리겠습니다 감사합니다~~

728x90
반응형

댓글