许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  Unity3D 使用AES方式加密与解密文件

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

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

        


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

      ①AES.cs代码如下:

  1. using System;
  2. using System.IO;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. namespace Utils
  6. {
  7. /// <summary>
  8. /// AES加密解密
  9. /// </summary>
  10. public class AES
  11. {
  12. #region 加密
  13. #region 加密字符串
  14. /// <summary>
  15. /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
  16. /// </summary>
  17. /// <param name="EncryptString">待加密密文</param>
  18. /// <param name="EncryptKey">加密密钥</param>
  19. public static string AESEncrypt(string EncryptString, string EncryptKey)
  20. {
  21. return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey));
  22. }
  23. #endregion
  24. #region 加密字节数组
  25. /// <summary>
  26. /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
  27. /// </summary>
  28. /// <param name="EncryptString">待加密密文</param>
  29. /// <param name="EncryptKey">加密密钥</param>
  30. public static byte[] AESEncrypt(byte[] EncryptByte, string EncryptKey)
  31. {
  32. if (EncryptByte.Length == 0) { throw (new Exception("明文不得为空")); }
  33. if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
  34. byte[] m_strEncrypt;
  35. byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
  36. byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
  37. Rijndael m_AESProvider = Rijndael.Create();
  38. try
  39. {
  40. MemoryStream m_stream = new MemoryStream();
  41. PasswordDeriveBytes pdb = new PasswordDeriveBytes(EncryptKey, m_salt);
  42. ICryptoTransform transform = m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV);
  43. CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
  44. m_csstream.Write(EncryptByte, 0, EncryptByte.Length);
  45. m_csstream.FlushFinalBlock();
  46. m_strEncrypt = m_stream.ToArray();
  47. m_stream.Close(); m_stream.Dispose();
  48. m_csstream.Close(); m_csstream.Dispose();
  49. }
  50. catch (IOException ex) { throw ex; }
  51. catch (CryptographicException ex) { throw ex; }
  52. catch (ArgumentException ex) { throw ex; }
  53. catch (Exception ex) { throw ex; }
  54. finally { m_AESProvider.Clear(); }
  55. return m_strEncrypt;
  56. }
  57. #endregion
  58. #endregion
  59. #region 解密
  60. #region 解密字符串
  61. /// <summary>
  62. /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
  63. /// </summary>
  64. /// <param name="DecryptString">待解密密文</param>
  65. /// <param name="DecryptKey">解密密钥</param>
  66. public static string AESDecrypt(string DecryptString, string DecryptKey)
  67. {
  68. return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey));
  69. }
  70. #endregion
  71. #region 解密字节数组
  72. /// <summary>
  73. /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
  74. /// </summary>
  75. /// <param name="DecryptString">待解密密文</param>
  76. /// <param name="DecryptKey">解密密钥</param>
  77. public static byte[] AESDecrypt(byte[] DecryptByte, string DecryptKey)
  78. {
  79. if (DecryptByte.Length == 0) { throw (new Exception("密文不得为空")); }
  80. if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
  81. byte[] m_strDecrypt;
  82. byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
  83. byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
  84. Rijndael m_AESProvider = Rijndael.Create();
  85. try
  86. {
  87. MemoryStream m_stream = new MemoryStream();
  88. PasswordDeriveBytes pdb = new PasswordDeriveBytes(DecryptKey, m_salt);
  89. ICryptoTransform transform = m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV);
  90. CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
  91. m_csstream.Write(DecryptByte, 0, DecryptByte.Length);
  92. m_csstream.FlushFinalBlock();
  93. m_strDecrypt = m_stream.ToArray();
  94. m_stream.Close(); m_stream.Dispose();
  95. m_csstream.Close(); m_csstream.Dispose();
  96. }
  97. catch (IOException ex) { throw ex; }
  98. catch (CryptographicException ex) { throw ex; }
  99. catch (ArgumentException ex) { throw ex; }
  100. catch (Exception ex) { throw ex; }
  101. finally { m_AESProvider.Clear(); }
  102. return m_strDecrypt;
  103. }
  104. #endregion
  105. #endregion
  106. }
  107. }
csharp
运行


②People.cs 代码如下:
  1. using System;
  2. namespace Assets
  3. {
  4. [Serializable]
  5. public class People
  6. {
  7. public People()
  8. {
  9. }
  10. public int ID;
  11. public string Name;
  12. public int Age;
  13. }
  14. }
csharp
运行

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

  1. using UnityEngine;
  2. using Assets;
  3. using System.Text;
  4. using System;
  5. using System.IO;
  6. using Utils;
  7. public class SaveAESFile : MonoBehaviour
  8. {
  9. public string FilePath = "";
  10. private People _people;
  11. private string info = "";
  12. /// <summary>
  13. /// AES 密码保存
  14. /// </summary>
  15. private const string _password = "qq123";
  16. /// <summary>
  17. /// 一次处理的明文字节数
  18. /// </summary>
  19. public static readonly int encryptSize = 10000000;
  20. /// <summary>
  21. /// 一次处理的密文字节数
  22. /// </summary>
  23. public static readonly int decryptSize = 10000016;
  24. void Awake()
  25. {
  26. FilePath = Application.dataPath + @"/Resources/SaveAESFile.json";
  27. }
  28. void OnGUI()
  29. {
  30. // 文本显示
  31. GUI.Label(new Rect(50, 200, 200, 50), info);
  32. // 第一个文字按钮
  33. GUI.color = Color.yellow; //按钮文字颜色
  34. GUI.backgroundColor = Color.red; //按钮背景颜色
  35. if (GUI.Button(new Rect(50, 250, 200, 30), "保存加密文件"))
  36. {
  37. info = "保存加密文件!";
  38. AESSaveFile();
  39. }
  40. // 第二个图片按钮
  41. GUI.color = Color.white; //按钮文字颜色
  42. GUI.backgroundColor = Color.red; //按钮背景颜色
  43. if (GUI.Button(new Rect(50, 300, 200, 30), "显示解密文件"))
  44. {
  45. ShowAESFile();
  46. info = "显示解密文件!";
  47. People temp = _people;
  48. info = "Ihttps://www.gofarlic.com" + _people.ID + " " + "Name:" + _people.Name + " " + "Age:" + _people.Age;
  49. }
  50. }
  51. void AESSaveFile()
  52. {
  53. AddData();
  54. byte[] texts = new byte[] { };
  55. try
  56. {
  57. string autoSaveJson = JsonUtility.ToJson(_people);
  58. //加密
  59. texts = Utils.AES.AESEncrypt(Encoding.UTF8.GetBytes(autoSaveJson), _password);
  60. }
  61. catch (Exception e)
  62. {
  63. Debug.LogError("Message:" + e.Message);
  64. }
  65. if (File.Exists(FilePath))
  66. {
  67. File.Delete(FilePath);
  68. }
  69. using (FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write))
  70. {
  71. if (fs != null)
  72. {
  73. fs.Write(texts, 0, texts.Length);
  74. fs.Flush();
  75. fs.Dispose();
  76. }
  77. }
  78. }
  79. void ShowAESFile()
  80. {
  81. try
  82. {
  83. string DecrypText = string.Empty;
  84. using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
  85. {
  86. if (fs.Length > 0)
  87. {
  88. int blockCount = ((int)fs.Length - 1) / decryptSize + 1;
  89. for (int i = 0; i < blockCount; i++)
  90. {
  91. int size = decryptSize;
  92. if (i == blockCount - 1) size = (int)(fs.Length - i * decryptSize);
  93. byte[] bArr = new byte[size];
  94. fs.Read(bArr, 0, size);
  95. //解密
  96. byte[] result = AES.AESDecrypt(bArr, _password);
  97. DecrypText += Encoding.UTF8.GetString(result);
  98. }
  99. fs.Close();
  100. fs.Dispose();
  101. }
  102. }
  103. _people = JsonUtility.FromJson<People>(DecrypText);
  104. }
  105. catch (Exception e)
  106. {
  107. Debug.LogError("Message:" + e.Message);
  108. }
  109. }
  110. void AddData()
  111. {
  112. _people = new People();
  113. _people.ID = 1;
  114. _people.Name = "小白兔";
  115. _people.Age = 18;
  116. }
  117. }
csharp
运行

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


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

2——0.png


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空