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
반응형
'프로그래밍' 카테고리의 다른 글
Azure PowerShell Az모듈 msi 설치 방법 (0) | 2021.02.24 |
---|---|
Azure PowerShell을 이용한 AppService 생성/삭제 스크립트 (0) | 2021.02.10 |
Azure PowerShell을 이용한 AppService Plan(요금제) 생성/삭제 스크립트 (0) | 2021.02.09 |
[JSON] 무료 환율API로 환율 정보 가져오기 (0) | 2021.01.30 |
초보 개발자에게 유용한 비주얼 스튜디오 (Visual Studio) 단축키 (0) | 2021.01.28 |
댓글