原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1010/59.html
Untiy3D使用PlayerPrefs类实现本地数据加密
	PlayerPrefs类本身不进行加密 ,保持数据的时候容易被修改破解。使用多少key值存储太过麻烦,通过集成类可以存储实例对象。下面就来看看使用PlayerPrefs类实现本地数据加密的实现。
		using System;
	
		using System.IO;
	
		using System.Security.Cryptography;
	
		using System.Text;
	
		using UnityEngine;
	
		using System.Collections;
	
		public class CryptoPrefs
	
		{
	
		    private static string sKEY = "ZTdkNTNmNDE2NTM3MWM0NDFhNTEzNzU1";
	
		    private static string sIV = "4rZymEMfa/PpeJ89qY4gyA==";
	
		    public static void SetInt(string key, int val)
	
		    {
	
		        PlayerPrefs.SetString(CryptoPrefs.GetHash(key), CryptoPrefs.Encrypt(val.ToString()));
	
		    }
	
		    public static int GetInt(string key, int defaultValue = 0)
	
		    {
	
		        string @string = CryptoPrefs.GetString(key, defaultValue.ToString());
	
		        int result = defaultValue;
	
		        int.TryParse(@string, out result);
	
		        return result;
	
		    }
	
		    public static void SetFloat(string key, float val)
	
		    {
	
		        PlayerPrefs.SetString(CryptoPrefs.GetHash(key), CryptoPrefs.Encrypt(val.ToString()));
	
		    }
	
		    public static float GetFloat(string key, float defaultValue = 0f)
	
		    {
	
		        string @string = CryptoPrefs.GetString(key, defaultValue.ToString());
	
		        float result = defaultValue;
	
		        float.TryParse(@string, out result);
	
		        return result;
	
		    }
	
		    public static void SetString(string key, string val)
	
		    {
	
		        PlayerPrefs.SetString(CryptoPrefs.GetHash(key), CryptoPrefs.Encrypt(val));
	
		    }
	
		    public static string GetString(string key, string defaultValue = "")
	
		    {
	
		        string text = defaultValue;
	
		        string @string = PlayerPrefs.GetString(CryptoPrefs.GetHash(key), defaultValue.ToString());
	
		        if (!text.Equals(@string))
	
		        {
	
		            text = CryptoPrefs.Decrypt(@string);
	
		        }
	
		        return text;
	
		    }
	
		    public static bool HasKey(string key)
	
		    {
	
		        string hash = CryptoPrefs.GetHash(key);
	
		        return PlayerPrefs.HasKey(hash);
	
		    }
	
		    public static void DeleteKey(string key)
	
		    {
	
		        string hash = CryptoPrefs.GetHash(key);
	
		        PlayerPrefs.DeleteKey(hash);
	
		    }
	
		    public static void DeleteAll()
	
		    {
	
		        PlayerPrefs.DeleteAll();
	
		    }
	
		    public static void Save()
	
		    {
	
		        PlayerPrefs.Save();
	
		    }
	
		    private static string Decrypt(string encString)
	
		    {
	
		        RijndaelManaged rijndaelManaged = new RijndaelManaged
	
		        {
	
		            Padding = PaddingMode.Zeros,
	
		            Mode = CipherMode.CBC,
	
		            KeySize = 128,
	
		            BlockSize = 128
	
		        };
	
		        byte[] bytes = Encoding.UTF8.GetBytes(CryptoPrefs.sKEY);
	
		        byte[] rgbIV = Convert.FromBase64String(CryptoPrefs.sIV);
	
		        ICryptoTransform transform = rijndaelManaged.CreateDecryptor(bytes, rgbIV);
	
		        byte[] array = Convert.FromBase64String(encString);
	
		        byte[] array2 = new byte[array.Length];
	
		        MemoryStream stream = new MemoryStream(array);
	
		        CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Read);
	
		        cryptoStream.Read(array2, 0, array2.Length);
	
		        //Debug.Log("Encoding.UTF8.GetString(array2).TrimEnd(new char[1] " + Encoding.UTF8.GetString(array2).TrimEnd(new char[1]));
	
		        return Encoding.UTF8.GetString(array2).TrimEnd(new char[1]);
	
		    }
	
		    private static string Encrypt(string rawString)
	
		    {
	
		        RijndaelManaged rijndaelManaged = new RijndaelManaged
	
		        {
	
		            Padding = PaddingMode.Zeros,
	
		            Mode = CipherMode.CBC,
	
		            KeySize = 128,
	
		            BlockSize = 128
	
		        };
	
		        byte[] bytes = Encoding.UTF8.GetBytes(CryptoPrefs.sKEY);
	
		        byte[] rgbIV = Convert.FromBase64String(CryptoPrefs.sIV);
	
		        ICryptoTransform transform = rijndaelManaged.CreateEncryptor(bytes, rgbIV);
	
		        MemoryStream memoryStream = new MemoryStream();
	
		        CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
	
		        byte[] bytes2 = Encoding.UTF8.GetBytes(rawString);
	
		        cryptoStream.Write(bytes2, 0, bytes2.Length);
	
		        cryptoStream.FlushFinalBlock();
	
		        byte[] inArray = memoryStream.ToArray();
	
		        return Convert.ToBase64String(inArray);
	
		    }
	
		    private static string GetHash(string key)
	
		    {
	
		        MD5 mD = new MD5CryptoServiceProvider();
	
		        byte[] array = mD.ComputeHash(Encoding.UTF8.GetBytes(key));
	
		        StringBuilder stringBuilder = new StringBuilder();
	
		        for (int i = 0; i < array.Length; i++)
	
		        {
	
		            stringBuilder.Append(array[i].ToString("x2"));
	
		        }
	
		        return stringBuilder.ToString();
	
		    }
	
		    //  //默认密钥向量
	
		    //  private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
	
		    //  public static string keyss = "1234567z";
	
		    //  /// <summary>
	
		    //  /// DES加密字符串
	
		    //  /// </summary>
	
		    //  /// <param name="encryptString">待加密的字符串</param>
	
		    //  /// <param name="encryptKey">加密密钥,要求为8位</param>
	
		    //  /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
	
		    //  public static string EncryptDES(string encryptString, string encryptKey)
	
		    //  {
	
		    //      try
	
		    //      {
	
		    //          byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
	
		    //          byte[] rgbIV = Keys;
	
		    //          byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
	
		    //          DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
	
		    //          MemoryStream mStream = new MemoryStream();
	
		    //          CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
	
		    //          cStream.Write(inputByteArray, 0, inputByteArray.Length);
	
		    //          cStream.FlushFinalBlock();
	
		    //          return Convert.ToBase64String(mStream.ToArray());
	
		    //      }
	
		    //      catch
	
		    //      {
	
		    //          return encryptString;
	
		    //      }
	
		    //  }/// <summary>
	
		    //  /// DES解密字符串
	
		    //  /// </summary>
	
		    //  /// <param name="decryptString">待解密的字符串</param>
	
		    //  /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
	
		    //  /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
	
		    //  public static string DecryptDES(string decryptString, string decryptKey)
	
		    //  {
	
		    //      try
	
		    //      {
	
		    //          byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
	
		    //          byte[] rgbIV = Keys;
	
		    //          byte[] inputByteArray = Convert.FromBase64String(decryptString);
	
		    //          DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
	
		    //          MemoryStream mStream = new MemoryStream();
	
		    //          CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
	
		    //          cStream.Write(inputByteArray, 0, inputByteArray.Length);
	
		    //          cStream.FlushFinalBlock();
	
		    //          return Encoding.UTF8.GetString(mStream.ToArray());
	
		    //      }
	
		    //      catch
	
		    //      {
	
		    //          return decryptString;
	
		    //      }
	
		    //  }
	
		}
		using UnityEngine;
	
		using System.Collections;
	
		using System;
	
		using System.Reflection;
	
		public static class PlayerPrefsExtend
	
		{
	
		    public static void Save(string name, object o)
	
		    {
	
		        Type t = o.GetType();
	
		        //Debug.LogError (t);
	
		        FieldInfo[] fiedls = t.GetFields();
	
		        for (int i = 0; i < fiedls.Length; i++)
	
		        {
	
		            string saveName = name + "." + fiedls[i].Name;
	
		            switch (fiedls[i].FieldType.Name)
	
		            {
	
		            case "String":
	
		                CryptoPrefs.SetString(saveName, fiedls[i].GetValue(o).ToString());
	
		                break;
	
		            case "Int32":
	
		            case "Int64":
	
		            case "Int":
	
		            case "uInt":
	
		                CryptoPrefs.SetInt(saveName, (int)fiedls[i].GetValue(o));
	
		                break;
	
		            case "Float":
	
		                CryptoPrefs.SetFloat(saveName, (float)fiedls[i].GetValue(o));
	
		                break;
	
		            }
	
		        }
	
		    }
	
		    public static T GetValue<T>(string name) where T : new()
	
		    {
	
		        T newObj = new T();
	
		        Type t = newObj.GetType();
	
		        FieldInfo[] fiedls = t.GetFields();
	
		        for (int i = 0; i < fiedls.Length; i++)
	
		        {
	
		            string saveName = name + "." + fiedls[i].Name;
	
		            switch (fiedls[i].FieldType.Name)
	
		            {
	
		            case "String":
	
		                fiedls[i].SetValue(newObj, CryptoPrefs.GetString(saveName));
	
		                break;
	
		            case "Int32":
	
		            case "Int64":
	
		            case "Int":
	
		            case "uInt":
	
		                fiedls[i].SetValue(newObj, CryptoPrefs.GetInt(saveName));
	
		                break;
	
		            case "Float":
	
		                fiedls[i].SetValue(newObj, CryptoPrefs.GetFloat(saveName));
	
		                break;
	
		            }
	
		        }
	
		        return newObj;
	
		    }
	
		}
	
			using System.Collections;
		
			using System.Collections.Generic;
		
			using UnityEngine;
		
			public class User {
		
			    public string  Name ;
		
			    public int Age;
		
			    public string Describe ;
		
			    public string dse ;
		
			    public string text ;
		
			}
		
			public class Test : MonoBehaviour {
		
			    // Use this for initialization
		
			    void Start () {
		
			        PlayerPrefs.DeleteAll();
		
			        User user = new User();
		
			        user.Name = "Name";
		
			        user.Age = 20;
		
			        user.Describe = "Descripbe ";
		
			        user.dse = "text";
		
			        user.text = "text";
		
			        PlayerPrefsExtend.Save("user", user);
		
			        user = null;
		
			        User userGet = new User ();
		
			        userGet = PlayerPrefsExtend.GetValue<User>("user");
		
			        Debug.Log("user name: " + userGet.Name);
		
			        Debug.Log("user Age: " + userGet.Age);
		
			        Debug.Log("user Describe: " + userGet.Describe);
		
			    }
		
			    // Update is called once per frame
		
			    void Update () {
		
			    }
		
			}
		上篇:上一篇:Unity3D封装WWW
下篇:下一篇:[Unity3d]打包Assetbundle并加载




