C#

C# AES128를 이용해 암호화, 복호화

5_솔방울 2023. 1. 3.

오늘은 AES128을 활용하여 암호화와 복호화를 담당하는 스크립트를 알아보자.

AES128은 암호화, 복호화를 구현하는 한 가지 방법이며 레인달이라는 알고리즘을 사용한다.

Unity에서 중요한 내용을 저장할 시, 해킹을 방지하기 위하여 활용할 수 있다.

 

코드전문

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class Crypto
{
    //키로 사용하기 위한 암호. 16글자 이상이어야 한다.
    private static string PASSWORD = "tHisIstesT4tistory";
    //인증키 정의
    private static readonly string KEY = PASSWORD.Substring(0, 128 / 8); //8bit단위로 나눔

    //암호화
    public static string AESEncrypt128(string plain)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plain);

        // AES : 고급 암호화 표준
        // 레인달(Rijndael) : 벨기에 공학자들 이름을 합쳐 만든 알고리즘 이름
        RijndaelManaged rijndael = new RijndaelManaged();

        // CipherMode : 암호화 모드 지정
        // https://learn.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.ciphermode?view=net-6.0
        rijndael.Mode = CipherMode.CBC;

        // PaddingMode : 메시지 데이터 블록이 암호화 작업에 필요한 전체 길이보다 짧을 때 뭘로 채울 것인지 결정
        // https://learn.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.paddingmode?view=net-6.0
        rijndael.Padding = PaddingMode.PKCS7;

        // KeySize : 패스워드 키 사이즈
        // https://learn.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.rijndaelmanaged.keysize?view=net-6.0#system-security-cryptography-rijndaelmanaged-keysize
        rijndael.KeySize = 128;

        MemoryStream memoryStream = new MemoryStream();

        ICryptoTransform encryptor = rijndael.CreateEncryptor(Encoding.UTF8.GetBytes(KEY), Encoding.UTF8.GetBytes(KEY));

        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(plainBytes, 0, plainBytes.Length);
        cryptoStream.FlushFinalBlock();

        byte[] encryptBytes = memoryStream.ToArray();
        string encryptString = Convert.ToBase64String(encryptBytes);

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

        return encryptString;
    }
	
    //복호화
    public static string AESDecrypt128(string encrypt)
    {
        byte[] encryptBytes = Convert.FromBase64String(encrypt);

        RijndaelManaged rijndael = new RijndaelManaged();
        rijndael.Mode = CipherMode.CBC;
        rijndael.Padding = PaddingMode.PKCS7;
        rijndael.KeySize = 128;

        MemoryStream memoryStream = new MemoryStream(encryptBytes);
        ICryptoTransform decryptor = rijndael.CreateDecryptor(Encoding.UTF8.GetBytes(KEY), Encoding.UTF8.GetBytes(KEY));
        CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

        byte[] plainBytes = new byte[encryptBytes.Length];

        int plainCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

        string plainString = Encoding.UTF8.GetString(plainBytes, 0, plainCount);

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

        return plainString;
    }
}

 

댓글