天天看點

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

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位數值,根據自己需要設定;

四、效果預覽

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

五、實作步驟

1、打開Unity,建立空工程,在場景中添加 UI,用于輸入加密内容,顯示加密内容和解密後的結果,如下圖

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

2、在工程中添加腳本,單例類保證類唯一,資料加密解密管理類為加密解密邏輯,測試腳本按下 E 鍵加密,按下 D 鍵解密,如下圖

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

3、把測試腳本挂載到場景中,并對應指派,如下圖

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

4、運作場景,效果如下

Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作Unity 工具類 之 簡單的資料加密解密類 DataEncryptionAndDecryptionManager 實作

六、關鍵代碼

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;
            }
        }
    }
}
           

七、參考工程

點選下載下傳工程

繼續閱讀