-
유니티 AES 암호화, 복호화하기 / Unity AES Encrypt and Decrypt유니티 2023. 8. 31. 15:54
암호화의 필요성
유니티로 만든 게임에서 핵 문제가 참으로 많습니다.
디컴파일 프로그램을 이용하면 코드 자체를 뜯어볼 수 있고
이를 방지하기 위해 디컴파일한 코드 읽기를 힘들어하도록 난독화 에셋 Obfuscator 을 사용하기도 합니다.
개발자는 코드수정은 못 막더라도 최소한 저장된 데이터를 변형하기 힘들게 하도록 하는 노력은 해야합니다.
그냥 txt파일에 세이브 파일을 누구나 다 읽을 수 있도록 JSON 등으로 저장해버리면
고양이한테 생선을 맡겨놓는 격입니다.
암호화의 종류
암호화는 저장을 할 때, 복호화는 불러올 때 사용합니다.
이때 비밀번호로 암호화 또는 복호화를 하는데 이 비밀번호 키가 같으면 대칭 키 암호화라고 합니다.
반대로 암호화 할 때의 키와 복호화 할 때의 비밀번호 키가 다르면 비대칭 키 암호화라고합니다.
AES 암호화란?
AES (Advanced Encryption Standard)의 약자로 고급 암호화 표준입니다.
암호화 방식 중 대칭 키 암호화를 사용합니다.
NSA에서 1급 비밀에 사용할 수 있도록 승인된 암호화 알고리즘으로 높은 안정성과 속도로 인기가 있습니다.
비밀번호 키가 노출되면 복호화가 가능하기 때문에 비밀번호 관리에 각별한 주의가 필요합니다.
AES 암호화 과정을 비주얼로 나타낸 영상이며 이해가 불가능할 정도로 매우 어렵다고 생각이 됩니다.
이런게 있구나 하고 넘어가면 될 거 같습니다.
AES 암복호화 스크립트
using System; using System.Security.Cryptography; using System.Text; using UnityEngine; public class AES : MonoBehaviour { public string EncryptAES(string textToEncrypt, string key) { RijndaelManaged rijndaelCipher = GetRijndaelCipher(key); byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt); return Convert.ToBase64String(rijndaelCipher.CreateEncryptor().TransformFinalBlock(plainText, 0, plainText.Length)); } public string DecryptAES(string textToDecrypt, string key) { RijndaelManaged rijndaelCipher = GetRijndaelCipher(key); byte[] encryptedData = Convert.FromBase64String(textToDecrypt); byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length); return Encoding.UTF8.GetString(plainText); } RijndaelManaged GetRijndaelCipher(string key) { byte[] pwdBytes = Encoding.UTF8.GetBytes(key); byte[] keyBytes = new byte[16]; int len = pwdBytes.Length; if (len > keyBytes.Length) len = keyBytes.Length; Array.Copy(pwdBytes, keyBytes, len); return new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes }; } void Start() { string key = "password"; string original = "안녕하세요 이거는 비밀문서입니다 12345&@!"; string encrypted = EncryptAES(original, key); string roundtrip = DecryptAES(encrypted, key); print($"Encrypted: {encrypted}"); print($"Round Trip: {roundtrip}"); } }
실행 결과
Encrypted: +4I1UBOlsge1GIGkjGCdhF2UaQSU+5GZQOOtK1bda8IOCm9qJ8zPJRHjsmpPTfprbHXOUFwoELeMJuPgFpBmRg== Round Trip: 안녕하세요 이거는 비밀문서입니다 12345&@!
'유니티' 카테고리의 다른 글
유니티 반응형 UI 기초지식 / Unity How to Make Flexible Responsive UI (0) 2023.08.31 유니티 비주얼 이펙트 그래프 백과사전 / Unity Visual Effect Graph All Nodes (2) 2023.08.31 유니티 셰이더그래프 UI에서 화면전환하기 / Unity Shadergraph UI Transition (0) 2023.08.31 유니티 셰이더그래프 그라데이션 스카이박스 만들기 / Unity Shadergraph Gradient Skybox (0) 2023.08.31 유니티 유틸리티 클래스 모음 / Unity Utility Class Bundle (2) 2023.08.31