본문 바로가기

개발/Unity, C#

C# AES 암호화

Key는 32자리

IV는 16자리인데

해시로 만들어서 사용하는 사람들도 있던데 어느 방법이 더 좋은 건지는 모르겠음

 

알고리즘보단 일단 간단한 사용법

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

public class Crypto
{
    public static readonly string key = "01234567890123456789012345678901";
    public static readonly string iv = "0123456789012345";
    
    //AES 암호화
    public static string AESEncrypt(string input)
    {
        try
        {
            RijndaelManaged aes = new RijndaelManaged();
            //aes.KeySize = 256; //AES256으로 사용시 
            aes.KeySize = 128; //AES128로 사용시 
            aes.BlockSize = 128;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = Encoding.UTF8.GetBytes(iv);
            var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
            byte[] buf = null;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
                {
                    byte[] xXml = Encoding.UTF8.GetBytes(input);
                    cs.Write(xXml, 0, xXml.Length);
                }
                buf = ms.ToArray();
            }
            string Output = Convert.ToBase64String(buf);
            return Output;
        }
        catch (Exception ex)
        {
            Debug.LogError(ex.Message);
            return ex.Message;
        }
    }

    //AES 복호화
    public static string AESDecrypt(string input)
    {
        try
        {
            RijndaelManaged aes = new RijndaelManaged();
            //aes.KeySize = 256; //AES256으로 사용시 
            aes.KeySize = 128; //AES128로 사용시 
            aes.BlockSize = 128;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = Encoding.UTF8.GetBytes(iv);
            var decrypt = aes.CreateDecryptor();
            byte[] buf = null;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
                {
                    byte[] xXml = Convert.FromBase64String(input);
                    cs.Write(xXml, 0, xXml.Length);
                }
                buf = ms.ToArray();
            }
            string Output = Encoding.UTF8.GetString(buf);
            return Output;
        }
        catch (Exception ex)
        {
            Debug.LogError(ex.Message);
            return string.Empty;
        }
    }
}

 

AES인데 왜 RijndaelManaged를 사용하는지 궁금해서 알아봤는데 (Aes클래스가 따로 존재해도)

 

- AES는 128 비트의 블록 크기에 대해서만 정의된 Rijndael의 축소 버전입니다.

- Rijndael-256과 Rijndael-192는 AES (Rijndael-128)와 완전히 다른 알고리즘으로 보여야 합니다. 그것들은 본질적으로 양립할 수 없다.

 

라고 누가 그러더라...

https://stackoverflow.com/questions/748622/differences-between-rijndael-and-aes

'개발 > Unity, C#' 카테고리의 다른 글

Unity UGUI Text에서 특정 단어의 위치 찾기  (0) 2019.09.12
Unity Update문에 대해서  (0) 2019.07.27
Unity Invoke vs Coroutine  (0) 2019.07.26
C# Enum 사용시 Garbage 문제  (0) 2019.07.16
Unity 2019 LWRP Camera Stacking  (0) 2019.07.14