Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作
目錄
Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作
一、簡單介紹
二、實作原理
三、注意事項
四、效果預覽
五、實作步驟
六、關鍵代碼
七、參考工程
一、簡單介紹
Unity 工具類,自己整理的一些遊戲開發可能用到的子產品,單獨獨立使用,友善遊戲開發。
簡單的資料加密解密類,單獨做了一個單例類,提供資料加密解密的接口,供外界調用即可。
MD5的全稱是message-digest algorithm 5(資訊-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來, 經md2、md3和md4發展而來。
MD5具有很好的安全性(因為它具有不可逆的特征,加過密的密文經過解密後和加密前的東東相同的可能性極小)
二、實作原理
1、單例類,保證整個場景中隻有一個類管理資料加密解密;
2、使用 RijndaelManaged 進行相關加密解密;
3、使用 DataEncryptionAndDecryptionManager.Instance.ConductEncryption 即可加密資料;
4、使用 DataEncryptionAndDecryptionManager.Instance.ConductDecryption 即可解密資料;
三、注意事項
1、加密解密的key為32位數值,根據自己需要設定;
四、效果預覽
五、實作步驟
1、打開Unity,建立空工程,在場景中添加 UI,用于輸入加密内容,顯示加密内容和解密後的結果,如下圖
2、在工程中添加腳本,單例類保證類唯一,資料加密解密管理類為加密解密邏輯,測試腳本按下 E 鍵加密,按下 D 鍵解密,如下圖
3、把測試腳本挂載到場景中,并對應指派,如下圖
4、運作場景,效果如下
六、關鍵代碼
1、TestScript
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
public InputField Content_InputField;
public Text Encryption_Text;
public Text Decryption_Text;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.E)) {
Encryption_Text.text =
DataEncryptionAndDecryptionManager.Instance.ConductEncryption(Content_InputField.text,
DataEncryptionAndDecryptionManager.Instance.KeyValue
);
}
if (Input.GetKeyDown(KeyCode.D))
{
Decryption_Text.text =
DataEncryptionAndDecryptionManager.Instance.ConductDecryption(Encryption_Text.text,
DataEncryptionAndDecryptionManager.Instance.KeyValue
);
}
}
}
2、DataEncryptionAndDecryptionManager
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class DataEncryptionAndDecryptionManager : Singleton<DataEncryptionAndDecryptionManager>
{
/// <summary>
/// 32位任意數值,作為是加密解碼約定數字(可以根據需要修改成自己想要的32位任意數值)
/// </summary>
private string _keyValue = "01234567890123456789012345678901";
public string KeyValue { get => _keyValue; set => _keyValue = value; }
/// <summary>
/// 資料加密
/// </summary>
/// <param name="content">需要加密内容</param>
/// <param name="keyValue">加密的32位密碼</param>
/// <returns></returns>
public string ConductEncryption(string content, string keyValue)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(keyValue);
//加密格式
RijndaelManaged encryption = new RijndaelManaged();
encryption.Key = keyArray;
encryption.Mode = CipherMode.ECB;
encryption.Padding = PaddingMode.PKCS7;
//生成加密鎖
ICryptoTransform cTransform = encryption.CreateEncryptor();
byte[] _EncryptArray = UTF8Encoding.UTF8.GetBytes(content);
byte[] resultArray = cTransform.TransformFinalBlock(_EncryptArray, 0, _EncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// 資料解密
/// </summary>
/// <param name="content">需要解密的資料</param>
/// <param name="keyValue">解密的32位密碼</param>
/// <returns></returns>
public string ConductDecryption(string content, string keyValue)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(keyValue);
// 解密格式
RijndaelManaged decryption = new RijndaelManaged();
decryption.Key = keyArray;
decryption.Mode = CipherMode.ECB;
decryption.Padding = PaddingMode.PKCS7;
// 開始解密
ICryptoTransform cTransform = decryption.CreateDecryptor();
byte[] _DecryptArray = Convert.FromBase64String(content);
byte[] resultArray = cTransform.TransformFinalBlock(_DecryptArray, 0, _DecryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
}
3、Singleton
public abstract class Singleton<T> where T : class, new()
{
private static T instance = null;
// 多線程安全機制
private static readonly object locker = new object();
public static T Instance
{
get
{
lock (locker)
{
if (instance == null)
instance = new T();
return instance;
}
}
}
}
七、參考工程
點選下載下傳工程