Unity3D 使用AES方式加密与解密文件

今天小编为大家介绍如何把保存的文件采用AES 方式加密/解密
   1.新建一个 unity3d 项目,新建一个Test.unity场景,场景里面需要有一个摄像机,并且在摄像机上附加一个SaveAESFile.cs组件类,另外还需要在项目新建一个Resources文件夹,这个文件夹为了存放加密的文件。

        


   2.首先需要一个辅助类AES.cs和一个实体类People.cs,然后代码如下:

      ①AES.cs代码如下:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
 
namespace Utils
{
    /// <summary>
    /// AES加密解密
    /// </summary>
    public class AES
    {
        #region 加密
        #region 加密字符串
        /// <summary>
        /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
        /// </summary>
        /// <param name="EncryptString">待加密密文</param>
        /// <param name="EncryptKey">加密密钥</param>
        public static string AESEncrypt(string EncryptString, string EncryptKey)
        {
            return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey));
        }
        #endregion
 
        #region 加密字节数组
        /// <summary>
        /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
        /// </summary>
        /// <param name="EncryptString">待加密密文</param>
        /// <param name="EncryptKey">加密密钥</param>
        public static byte[] AESEncrypt(byte[] EncryptByte, string EncryptKey)
        {
            if (EncryptByte.Length == 0) { throw (new Exception("明文不得为空")); }
            if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
            byte[] m_strEncrypt;
            byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
            byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
            Rijndael m_AESProvider = Rijndael.Create();
            try
            {
                MemoryStream m_stream = new MemoryStream();
                PasswordDeriveBytes pdb = new PasswordDeriveBytes(EncryptKey, m_salt);
                ICryptoTransform transform = m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV);
                CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
                m_csstream.Write(EncryptByte, 0, EncryptByte.Length);
                m_csstream.FlushFinalBlock();
                m_strEncrypt = m_stream.ToArray();
                m_stream.Close(); m_stream.Dispose();
                m_csstream.Close(); m_csstream.Dispose();
            }
            catch (IOException ex) { throw ex; }
            catch (CryptographicException ex) { throw ex; }
            catch (ArgumentException ex) { throw ex; }
            catch (Exception ex) { throw ex; }
            finally { m_AESProvider.Clear(); }
            return m_strEncrypt;
        }
        #endregion
        #endregion
 
        #region 解密
        #region 解密字符串
        /// <summary>
        /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
        /// </summary>
        /// <param name="DecryptString">待解密密文</param>
        /// <param name="DecryptKey">解密密钥</param>
        public static string AESDecrypt(string DecryptString, string DecryptKey)
        {
            return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey));
        }
        #endregion
 
        #region 解密字节数组
        /// <summary>
        /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
        /// </summary>
        /// <param name="DecryptString">待解密密文</param>
        /// <param name="DecryptKey">解密密钥</param>
        public static byte[] AESDecrypt(byte[] DecryptByte, string DecryptKey)
        {
            if (DecryptByte.Length == 0) { throw (new Exception("密文不得为空")); }
            if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
            byte[] m_strDecrypt;
            byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
            byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
            Rijndael m_AESProvider = Rijndael.Create();
            try
            {
                MemoryStream m_stream = new MemoryStream();
                PasswordDeriveBytes pdb = new PasswordDeriveBytes(DecryptKey, m_salt);
                ICryptoTransform transform = m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV);
                CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
                m_csstream.Write(DecryptByte, 0, DecryptByte.Length);
                m_csstream.FlushFinalBlock();
                m_strDecrypt = m_stream.ToArray();
                m_stream.Close(); m_stream.Dispose();
                m_csstream.Close(); m_csstream.Dispose();
            }
            catch (IOException ex) { throw ex; }
            catch (CryptographicException ex) { throw ex; }
            catch (ArgumentException ex) { throw ex; }
            catch (Exception ex) { throw ex; }
            finally { m_AESProvider.Clear(); }
            return m_strDecrypt;
        }
        #endregion
        #endregion
 
    }
}


②People.cs 代码如下:
using System;
namespace Assets
{
    [Serializable]
 
    public class People
    {
        public People()
        {
        }
        public int ID;
        public string Name;
        public int Age;
    }
}

 3.直接是SaveAESFile.cs的核心代码

using UnityEngine;
using Assets;
using System.Text;
using System;
using System.IO;
using Utils;
 
public class SaveAESFile : MonoBehaviour
{
 
    public string FilePath = "";
    private People _people;
    private string info = "";
 
    /// <summary>
    /// AES 密码保存
    /// </summary>
    private const string _password = "qq123";
 
    /// <summary>
    /// 一次处理的明文字节数
    /// </summary>
    public static readonly int encryptSize = 10000000;
    /// <summary>
    /// 一次处理的密文字节数
    /// </summary>
    public static readonly int decryptSize = 10000016;
 
 
    void Awake()
    {
        FilePath = Application.dataPath + @"/Resources/SaveAESFile.json";
    }
 
    void OnGUI()
    {
        // 文本显示
        GUI.Label(new Rect(50, 200, 200, 50), info);
 
 
        // 第一个文字按钮
        GUI.color = Color.yellow;  //按钮文字颜色  
        GUI.backgroundColor = Color.red; //按钮背景颜色
 
        if (GUI.Button(new Rect(50, 250, 200, 30), "保存加密文件"))
        {
            info = "保存加密文件!";
            AESSaveFile();
        }
 
        // 第二个图片按钮
        GUI.color = Color.white;  //按钮文字颜色  
        GUI.backgroundColor = Color.red; //按钮背景颜色
 
        if (GUI.Button(new Rect(50, 300, 200, 30), "显示解密文件"))
        {
            ShowAESFile();
            info = "显示解密文件!";
            People temp = _people;
            info = "ID:" + _people.ID + "   " + "Name:" + _people.Name + "    " + "Age:" + _people.Age;
        }
 
    }
 
 
    void AESSaveFile()
    {
        AddData();
        byte[] texts = new byte[] { };
        try
        {
            string autoSaveJson = JsonUtility.ToJson(_people);
            //加密
            texts = Utils.AES.AESEncrypt(Encoding.UTF8.GetBytes(autoSaveJson), _password);
        }
        catch (Exception e)
        {
            Debug.LogError("Message:" + e.Message);
        }
        if (File.Exists(FilePath))
        {
            File.Delete(FilePath);
        }
        using (FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write))
        {
            if (fs != null)
            {
                fs.Write(texts, 0, texts.Length);
                fs.Flush();
                fs.Dispose();
            }
        }
    }
 
    void ShowAESFile()
    {
        try
        {
            string DecrypText = string.Empty;
            using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
            {
                if (fs.Length > 0)
                {
                    int blockCount = ((int)fs.Length - 1) / decryptSize + 1;
                    for (int i = 0; i < blockCount; i++)
                    {
                        int size = decryptSize;
                        if (i == blockCount - 1) size = (int)(fs.Length - i * decryptSize);
                        byte[] bArr = new byte[size];
                        fs.Read(bArr, 0, size);
                        //解密
                        byte[] result = AES.AESDecrypt(bArr, _password);
                        DecrypText += Encoding.UTF8.GetString(result);
                    }
                    fs.Close();
                    fs.Dispose();
                }
            }
            _people = JsonUtility.FromJson<People>(DecrypText);
        }
        catch (Exception e)
        {
            Debug.LogError("Message:" + e.Message);
        }
    }
 
    void AddData()
    {
        _people = new People();
        _people.ID = 1;
        _people.Name = "小白兔";
        _people.Age = 18;
    }
}

  4.最后便是执行项目看效果啦!
    ①点击解密保存文件,我们会发现在Resources下面会生成一个.json文件,如图下:
    
        


        
         
    ②当我们点击按钮解密显示文件时,会发现加密的文件的内容被解密,如图下:
   
        

2——0.png

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是UnityAES加密解密的示例代码: 加密代码: ```csharp using System.Security.Cryptography; using UnityEngine; public static class AESEncryption { private static readonly byte[] Key = new byte[16] { 215, 254, 100, 91, 10, 69, 23, 146, 12, 175, 237, 65, 38, 205, 85, 111 }; private static readonly byte[] IV = new byte[16] { 183, 221, 44, 251, 126, 7, 77, 234, 154, 150, 97, 24, 165, 2, 153, 201 }; public static string Encrypt(string plainText) { byte[] encrypted; using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Key; aesAlg.IV = IV; ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (System.IO.MemoryStream msEncrypt = new System.IO.MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (System.IO.StreamWriter swEncrypt = new System.IO.StreamWriter(csEncrypt)) { swEncrypt.Write(plainText); } encrypted = msEncrypt.ToArray(); } } } return System.Convert.ToBase64String(encrypted); } } ``` 解密代码: ```csharp using System.Security.Cryptography; using UnityEngine; public static class AESEncryption { private static readonly byte[] Key = new byte[16] { 215, 254, 100, 91, 10, 69, 23, 146, 12, 175, 237, 65, 38, 205, 85, 111 }; private static readonly byte[] IV = new byte[16] { 183, 221, 44, 251, 126, 7, 77, 234, 154, 150, 97, 24, 165, 2, 153, 201 }; public static string Decrypt(string cipherText) { byte[] cipherBytes = System.Convert.FromBase64String(cipherText); using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Key; aesAlg.IV = IV; ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (System.IO.MemoryStream msDecrypt = new System.IO.MemoryStream(cipherBytes)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (System.IO.StreamReader srDecrypt = new System.IO.StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } } } ``` 注意:这个示例代码中的密钥和向量都是为了演示而写死的,请根据实际需求使用更安全的方式生成密钥和向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值