내일배움캠프 39일차 TIL - JSON 암호화 복호화

권태하·2024년 6월 11일
0

개요

팀 프로젝트를 하면서 저장 불러오기를 구현하기 위해 JSON을 이용하게 되었다. JSON은 직렬화와 역직렬화를 통해 데이터를 쉽게 저장하고 불러올 수 있게 해주지만 중요한 정보를 서버에 저장하지 않으면 로컬 저장소에서는 쉽게 읽고 값을 수정할 수 있다는 단점이 있었다.

이를 위해 저장 불러오기에 필요한 코드를 삽입하여 저장되는 데이터 값을 암호화 할 수 있다는 것을 알게되었다.

원리는 정확히 모르지만 필요한 Using문과 코딩을 그대로 쓰면서 key값을 원하는데로 설정하면 해당 key를 이용해서만 복호화가 이뤄진다는 것을 확인하였다.

암호화, 복호화 소스

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
 
namespace AESWithJava.Con
{
    class Program
    {
        static void Main(string[] args)
        {
            String originalText = "plain text";
            String key = "key";
            String en = Encrypt(originalText, key);
            String de = Decrypt(en, key);

            Console.WriteLine("Original Text is " + originalText); 
            Console.WriteLine("Encrypted Text is " + en);
            Console.WriteLine( "Decrypted Text is " + de);
        }

        public static string Decrypt(string textToDecrypt, string key)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7; 

            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            byte[] encryptedData = Convert.FromBase64String(textToDecrypt);
            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);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
            return Encoding.UTF8.GetString(plainText);
        }

        public static string Encrypt(string textToEncrypt, string key)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7; 

            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            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);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
            byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
            return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
        }
    }
}

적용 cs

using SurvivalEngine;
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class DataManager : Singleton<DataManager>
{
    public UserData data;
    string key = "key";  // 암호화보안키

    public void OnSaveData()
    {
        DataSerialize();
        var json = JsonUtility.ToJson(data);
        json = AESWithJava.Con.Program.Encrypt(json, key);  // 암호화
        File.WriteAllText(Application.persistentDataPath + "/UserData.json", json);
    }

    public void OnLoadData()
    {
        var jsonData = File.ReadAllText(Application.persistentDataPath + "/UserData.json");

        jsonData = AESWithJava.Con.Program.Decrypt(jsonData, key);  // 복호화
        data = JsonUtility.FromJson<UserData>(jsonData);
        EnvironmentManager.Instance.ClearEnvironment();  // 환경 초기화
        DataDeserialize();
    }

// 암호화 복호화
namespace AESWithJava.Con
{
    class Program
    {
        static void Main(string[] args)
        {
            String originalText = "plain text";
            String key = "key";
            String en = Encrypt(originalText, key);
            String de = Decrypt(en, key);

            Console.WriteLine("Original Text is " + originalText); 
            Console.WriteLine("Encrypted Text is " + en);
            Console.WriteLine( "Decrypted Text is " + de);
        }

        public static string Decrypt(string textToDecrypt, string key)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7; 

            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            byte[] encryptedData = Convert.FromBase64String(textToDecrypt);
            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);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
            return Encoding.UTF8.GetString(plainText);
        }

        public static string Encrypt(string textToEncrypt, string key)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7; 

            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            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);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
            byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
            return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
        }
    }
}

만들어진 암호화 파일

profile
스터디 로그

0개의 댓글

관련 채용 정보