팀 프로젝트를 하면서 저장 불러오기를 구현하기 위해 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));
}
}
}
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));
}
}
}