/* *********************************************** * Discribe: * Author:PeterGao * CreateTime:2020-02-28 17:55:06 * Edition:1.0 * ************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Text; using UnityEngine;
public class EncryTest : MonoBehaviour { public static class IOHelper { /// /// 判断文件是否存在 /// /// /// public static bool IsFileExists(string fileName) { return File.Exists(fileName); }
/// 判断路径是否存在 /// public static bool IsDirectoryExists(string fileName) { return Directory.Exists(fileName); } /// /// 创建一个文本文件 /// /// /// public static void CreateFile(string fileName, string content) { StreamWriter sw = File.CreateText(fileName); sw.Write(content); sw.Close(); } /// /// 创建一个文件夹 /// /// public static void CreateDirectory(string fileName) { if (IsDirectoryExists(fileName)) return; Directory.CreateDirectory(fileName); } // 设置加密实例 public static void SetData(string fileName, string key, object o) { //序列化为字符串 string toSave = JsonUtility.ToJson(o); toSave = RijndaelEncrypt(toSave, key); StreamWriter sw = File.CreateText(fileName); sw.Write(toSave); sw.Close(); }
//设置解密实例 public static string GetData(string fileName, string key) { StreamReader sr = File.OpenText(fileName); string data = sr.ReadToEnd(); //对数据进行解密,32位解密密钥 data = RijndaelDecrypt(data, key); sr.Close(); return data; }
// Rijndael加密算法 private static string RijndaelEncrypt(string pString, string pKey) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);//密钥 byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);//待加密明文数组 //加密算法 RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor();
//返回加密后的密文 byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); }
/// Rijndael解密算法 public static string RijndaelDecrypt(string pString, string pKey) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);//解密密钥 byte[] toEncryArray = Convert.FromBase64String(pString);//待解密密文数组
//Rijndael解密算法 RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor();
//返回解密后的明文 byte[] resultArray = cTransform.TransformFinalBlock(toEncryArray, 0, toEncryArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); }
}
// 测试脚本:
[System.Serializable]//序列化 public class Student { public string Name; public int ID; public Student(string name, int id) { this.Name = name; this.ID = id; } } public class Test : MonoBehaviour { public string key = "12345678912345678912345678912345"; string path;
void Start() { path = Application.persistentDataPath + "/Save"; IOHelper.CreateDirectory(path); string fileName = path + "/GameData.sav"; Debug.Log(fileName); Student s = new Student("张三", 45); IOHelper.SetData(fileName, key, s); string message = IOHelper.GetData(fileName, key); Student ss = JsonUtility.FromJson(message); Debug.Log(ss.Name + ":" + ss.ID); } } }