• 【Unity】Xml的加密读取保存


    前言:Unity中通过xml格式保存游戏数据是非常常见的,但是如果不进行加密则非常容易被别人在外部通过修改xml文件修改游戏数据,因此加密xml是非常必要的。

    一、工具类

    创建一个名叫EncryptXmlDocument的c#文件,并复制下面代码到其中,作为xml加密工具类。

    1. using UnityEngine;
    2. using System;
    3. using System.Security.Cryptography;
    4. using System.Text;
    5. using System.IO;
    6. using System.Xml;
    7. namespace EncryptUtility
    8. {
    9. public class EncryptXmlDocument
    10. {
    11. ///
    12. /// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的
    13. ///
    14. ///
    15. ///
    16. private string Encrypt(string toE)
    17. {
    18. byte[] keyArray = UTF8Encoding.UTF8.GetBytes(EncryptKey);
    19. RijndaelManaged rDel = new RijndaelManaged();
    20. rDel.Key = keyArray;
    21. rDel.Mode = CipherMode.ECB;
    22. rDel.Padding = PaddingMode.PKCS7;
    23. ICryptoTransform cTransform = rDel.CreateEncryptor();
    24. byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
    25. byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    26. return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    27. }
    28. ///
    29. /// 内容解密,千万记住解密和加密采用相同的key,必须是32位
    30. ///
    31. ///
    32. ///
    33. private string Decrypt(string toD)
    34. {
    35. //加密和解密采用相同的key,具体值自己填,但是必须为32位//
    36. byte[] keyArray = UTF8Encoding.UTF8.GetBytes(EncryptKey);
    37. RijndaelManaged rDel = new RijndaelManaged();
    38. rDel.Key = keyArray;
    39. rDel.Mode = CipherMode.ECB;
    40. rDel.Padding = PaddingMode.PKCS7;
    41. ICryptoTransform cTransform = rDel.CreateDecryptor();
    42. byte[] toEncryptArray = Convert.FromBase64String(toD);
    43. byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    44. return UTF8Encoding.UTF8.GetString(resultArray);
    45. }
    46. ///
    47. /// 判断XML文档是否存在
    48. ///
    49. ///
    50. ///
    51. public static bool IsFileExist(string fileName)
    52. {
    53. return File.Exists(fileName);
    54. }
    55. public void Load(string filename)
    56. {
    57. if (IsFileExist(filename))
    58. {
    59. StreamReader sReader = File.OpenText(filename);
    60. string dataString = sReader.ReadToEnd();
    61. sReader.Close();
    62. string xxx = Decrypt(dataString);
    63. _doc.LoadXml(xxx);
    64. }
    65. }
    66. public void Save(string filename)
    67. {
    68. string xxx = Encrypt(_doc.InnerXml);
    69. StreamWriter writer;
    70. writer = File.CreateText(filename);
    71. writer.Write(xxx);
    72. writer.Close();
    73. }
    74. public XmlDocument Instance { get { return _doc; } }
    75. private XmlDocument _doc = new XmlDocument();
    76. string dataKey = SystemInfo.deviceUniqueIdentifier; // 设置秘钥,根据平台而定
    77. public string EncryptKey = "12348578902223367877723456789012"; // 有需要自己修改,必须为32位
    78. }
    79. }

    二、测试

    创建一个名叫XmlEncryptExample 的c#文件,并复制下面代码到其中,新建一个场景并将XmlEncryptExample组件拖动到一个物体上,然后点击运行。

    1. using UnityEngine;
    2. using System.Collections;
    3. using System.Linq;
    4. using System.Xml.Linq;
    5. using System;
    6. using System.IO;
    7. using System.Xml;
    8. using EncryptUtility;
    9. public class XmlEncryptExample : MonoBehaviour
    10. {
    11. public string xmlpath;
    12. // Use this for initialization
    13. void Start()
    14. {
    15. xmlpath = Application.persistentDataPath + "/Data/myXML.xml";
    16. var dir = Path.GetDirectoryName(xmlpath);
    17. if (!Directory.Exists(dir))
    18. {
    19. Directory.CreateDirectory(dir);
    20. }
    21. EncryptXmlDocument doc = new EncryptXmlDocument();
    22. if(File.Exists(xmlpath))
    23. {
    24. doc.Load(xmlpath);
    25. }
    26. else
    27. {
    28. XmlElement root = doc.Instance.CreateElement("XMLContent");
    29. root.AppendChild( doc.Instance.CreateElement("IsFirstPlayGame"));
    30. root.AppendChild(doc.Instance.CreateElement("Herb1"));
    31. root.AppendChild(doc.Instance.CreateElement("Herb2"));
    32. root.AppendChild(doc.Instance.CreateElement("Herb3"));
    33. doc.Instance.AppendChild(root);
    34. }
    35. Debug.Log(doc.Instance.InnerXml);
    36. doc.Save(xmlpath);
    37. }
    38. }

    运行结果如下:

    正确加载了从加密xml中读取的内容。(若不存在加密xml文件则会在首次运行时自动创建)

     

  • 相关阅读:
    stl中vecter和pair组合达到字典的效果
    五、T100应收管理之销售开票立帐管理篇
    Java自学第5课:Java web开发环境概述,更换Eclipse版本
    教你轻松使用Fastjson
    比特米盒子刷CoreELEC
    C++:const用于函数重载
    牛客算法题——密码验证合格程序
    egg-swagger-doc 传对象数组参数解决方案
    springboot+敬老院管理系统 毕业设计-附源码161551
    Unity3D占用内存太大怎么解决呢? -补
  • 原文地址:https://blog.csdn.net/qq_42608732/article/details/126021278