ResourceFrom:http://www.unitymanual.com/thread-28231-1-1.html

问题:为什么要对xml加密,众所周知的对于一些客户端的游戏或者是单机游戏,xml存档如果不做特殊处理(加密和隐藏)那么玩家自己是可以打开并且修改的。玩过红色警戒的童鞋都知道,可以通过修改参数可以让自己无敌。玩游戏的时候这样固然很爽,但是对于我们开发的游戏可不希望杯别人随意修改参数,那么加密就显得至关重要啦。

解决方法:

1》解决对XML文档加密、解密、对数据的增删改查、对XML文档的存取。对于每一个操作都是有加密和解密处理,代码并没有做优化,反复的加密和解密是个不足之处。该类的代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Xml;
using System.Xml.Serialization;public class LinqToXMLAndEncrypt
{static string dataKey = SystemInfo.deviceUniqueIdentifier;//设置秘钥,根据平台而定//static string xmlpath = Application.persistentDataPath + @"\myXML";//平台相关的路径(移动端)static string xmlpath = Application.dataPath + @"\myXML";//电脑上的路径,移动端没有这个访问权限/// <summary>/// 初始化一个XML文件/// </summary>public static void CreateXMLDocument(){XElement root = new XElement("XMLContent",new XElement("IsFirstPlayGame", new XAttribute("MyVaule", "0")),new XElement("Herb1", new XAttribute("MyVaule", "0")),new XElement("Herb2", new XAttribute("MyVaule", "0")),new XElement("Herb3", new XAttribute("MyVaule", "0")),new XElement("Level01", new XAttribute("MyVaule", "0")),/*从level01到LevelDemo是用来表示这个关卡是否玩过,其中MyVaule=1表示玩过,0表示没有*/new XElement("Level02", new XAttribute("MyVaule", "0")),new XElement("Level03", new XAttribute("MyVaule", "0")),new XElement("Level04", new XAttribute("MyVaule", "0")),new XElement("Level05", new XAttribute("MyVaule", "0")),new XElement("Level06", new XAttribute("MyVaule", "0")),new XElement("LevelDemo", new XAttribute("MyVaule", "0")),new XElement("Level", new XAttribute("MyVaule", "0")),new XElement("Root", "root"));root.Save(xmlpath);EncrtyptSaveXML();}private static void  EncrtyptSaveXML(){StreamReader sReader = File.OpenText(xmlpath);string xmlData = sReader.ReadToEnd();sReader.Close();string xxx = Encrypt(xmlData);StreamWriter writer;writer = File.CreateText(xmlpath);writer.Write(xxx);writer.Close();}public static XElement DecrtyptLoadXML(){if (hasFile(xmlpath)){StreamReader sReader = File.OpenText(xmlpath);string xmlData = sReader.ReadToEnd();sReader.Close();string xxx = Decrypt(xmlData);StreamWriter writer;writer = File.CreateText(xmlpath);writer.Write(xxx);writer.Close();XElement root = XElement.Load(xmlpath);return root;}elsereturn null;}public static void SetElementValue(string name, string value){XElement root = DecrtyptLoadXML();root.Element(name).SetAttributeValue("MyVaule", value);root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 在根节点元素之前添加新的元素/// </summary>/// <param name="name">元素名字</param>/// <param name="value">元素的值</param>public static void AddElement(string name, string value){XElement root = DecrtyptLoadXML();root.Element("Root").AddBeforeSelf(new XElement(name, new XAttribute("MyValue", value)));root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 删除指定的元素/// </summary>/// <param name="name">要删除的元素名称</param>public static void RemoveElement(string name){XElement root = DecrtyptLoadXML();root.Element(name).Remove();root.Save(xmlpath);EncrtyptSaveXML();}/// <summary>/// 根据元素名查找元素对应的值/// </summary>/// <param name="name">元素名</param>/// <returns></returns>public static string GetElementValue(string name){XElement root = DecrtyptLoadXML();XAttribute xattr = root.Element(name).Attribute("MyVaule");string s = xattr.Value;EncrtyptSaveXML();return s;}/// <summary>/// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的/// </summary>/// <param name="toE"></param>/// <returns></returns>private static  string Encrypt(string toE){byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// <summary>/// 内容解密,千万记住解密和加密采用相同的key,必须是32位/// </summary>/// <param name="toD"></param>/// <returns></returns>private static  string Decrypt(string toD){//加密和解密采用相同的key,具体值自己填,但是必须为32位//byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateDecryptor();byte[] toEncryptArray = Convert.FromBase64String(toD);byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return UTF8Encoding.UTF8.GetString(resultArray);}/// <summary>/// 判断XML文档是否存在/// </summary>/// <param name="fileName"></param>/// <returns></returns>public static bool hasFile(string fileName){return File.Exists(fileName);}/// <summary>/// 读取XML,返回XML的字符串/// </summary>/// <returns>返回XML的一串字符</returns>public static  string LoadXMLForString(bool isDecrypt=true){if (hasFile(xmlpath)){StreamReader sReader = File.OpenText(xmlpath);string dataString = sReader.ReadToEnd();sReader.Close();if (isDecrypt){string xxx = Decrypt(dataString);return xxx;}else return dataString;}else{return null;}}
}

2》测试如下:
简单的建立一个场景Text,可以只有一个主摄像机就行。在建立一个Text脚本,托给摄像机,Text的代码如下:

using UnityEngine;
using System.Collections;
using System.Linq;
using System.Xml.Linq;
using System;
public class Text : MonoBehaviour {bool isDecrypt = false;// Use this for initializationvoid Start () {Debug.Log ("path =" + Application.dataPath);LinqToXMLAndEncrypt.CreateXMLDocument();NGUIDebug.Log(LinqToXMLAndEncrypt.LoadXMLForString(isDecrypt));LinqToXMLAndEncrypt.SetElementValue("Herb1", "100");NGUIDebug.Log(LinqToXMLAndEncrypt.LoadXMLForString(isDecrypt));LinqToXMLAndEncrypt.AddElement("ZHangXiaob", "10000");NGUIDebug.Log(LinqToXMLAndEncrypt.LoadXMLForString(isDecrypt));NGUIDebug.Log("ssssss:"+ LinqToXMLAndEncrypt.GetElementValue("Herb1"));}// Update is called once per framevoid Update () {}
}

注意:新增加的元素在一个方法里面是不会立马读出来的,因为XML的操作都是延迟执行的。比如说上面的代码
GUIDebug.Log("ssssss:"+ LinqToXMLAndEncrypt.GetElementValue("Herb1"));处换成GUIDebug.Log("ssssss:"+ LinqToXMLAndEncrypt.GetElementValue("ZHangXiaob "));就会报错。
核心代码中的  public static  string LoadXMLForString(bool isDecrypt=true)方法是为了方便测试用的,它可以将整个XML读出成为一串字符串
我定义一个参数 bool isDecrypt=true,为true的时候读出来的是解密的也就是正常的,为false的时候读出来是加密的。

运行效果:

未加密:


加密:

自己可以打开生成的存储文件,数据已经是加密的了,(文件位置:Application.dataPath的值处)如图:

Unity对XML文件加密相关推荐

  1. xml文件加密和解密

    XML介绍 Extensible Markup Language(XML),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言. XML文件特征如下: a) XML第一行是声明, 格式如下 ...

  2. Unity中实现文件加密

    一:前言 常用的文件加密算法有:DES.AES.RSA.SHA-1.MD5..... .Net自带了安全类库,在System.Security.Cryptography下有一些常用的加密算法 其中MD ...

  3. XML 文件加密与解密

    做这个小程序实属无奈,客户担心文件泄露,要求我们加密,其实都不是什么重要的文件,纯属是客户给我们加工作量,但是也算是学到了一些东西,因此博主对客户的感情掺杂这爱与恨吧.下面看看我的程序吧,其实很简单, ...

  4. Unity(C#)读写xml文件详解

    目录 什么是xml文件? xml文件的结构 如何读写xml文件 什么是xml文件? xml文件是一种可拓展标记语言,由于简单易用,常被应用程序用于保存数据,unity也是如此,在我们需要控制读写用户的 ...

  5. 将xml文件打包进dll(或exe)

    经常,为了安全,我们需要将xml文件加密或者打包进dll文件中,那么如何将xml文件打包进dll中呢?在.net中,为我们提供了很好的方式: 选中该xml文件,将其属性中的"生成操作&quo ...

  6. unity向服务器发送xml文件格式,Unity读取Excel文件转换XML格式文件的方法

    Unity读取Excel文件转换XML格式文件的方法 发布时间:2020-06-23 09:34:33 来源:亿速云 阅读:107 作者:清晨 不懂Unity读取Excel文件转换XML格式文件的方法 ...

  7. Unity xml文件制作及导入

    对于初学者而言,在Unity中嵌入xml文件来存储管理游戏数据,游戏质量肯定会有一个飞跃. 1.首先要做的就是创建一个xml文件 (1)新建一个文本文档,文件-另存为- 把文件后缀名改为.xml,保存 ...

  8. 跨域策略文件crossdomain.xml文件

    使用crossdomain.xml让Flash可以跨域传输数据 一.crossdomain.xml文件的作用     跨域,顾名思义就是需要的资源不在自己的域服务器上,需要访问其他域服务器.跨域策略文 ...

  9. IO操作Dex文件加密,APK加固项目实战

    APK加固原理分析 1.1 APK文件结构 首先让我们先了解一下一个完整的Android应用程序都由哪些文件组成.解压一个apk包,我们可以看到一下的这些文件及文件夹: 每个文件及文件夹的作用如下表所 ...

最新文章

  1. 因买不到RTX 3090,小哥自己搭建了一个专业级机器学习工作站
  2. keepalived+LVS的实现
  3. centos6 mysql 导出sql_centos环境下如何导出数据库
  4. python常用包有哪些品牌_python 常用包总结
  5. 分享|涨薪必备的Python接口自动化测试资源技能一键get
  6. 数学建模-3.插值算法
  7. MiniTable 16 网络版安装部署
  8. 酷我音乐在计算机其他的图标怎么去掉,酷我音乐这个快捷方式怎么删除?
  9. 现汇买入价/现钞买入价/卖出价/基准价/中行折算价的概念
  10. 如何提升w ndows10系统网速,Win10更新后网速变慢怎么办?教你一招提升Win10网速...
  11. 使用python中的Selenium爬取百度文库word文章
  12. 汤小丹计算机操作系统慕课版课后题答案第五章:储存器管理
  13. 国家历史文化名城(zz)
  14. 值得收藏!VScode 中这 15 个神仙插件写代码必备!
  15. Pandas学习笔记
  16. 什么是CUDA、什么是GPU?
  17. Win7 64位下使用masm
  18. 开博尔智能android播放器C3,Kaiboer开博尔C3第九代双核智能机顶盒KIUI 7.0安卓4.4.2线刷固件 电视盒固件 开博尔...
  19. 小米“铁大”机器人大秀架子鼓,网友:有节奏没灵魂
  20. 信息与计算科学有哪些SCI期刊推荐? - 易智编译EaseEditing

热门文章

  1. WebRTC 基于GCC的拥塞控制(下)
  2. 3D API,快速展示模型,实现3D模型在线可视化展示,还能进行各种测量视图等操作......
  3. bootstrap按钮下拉菜单
  4. [转] 《我的助理辞职了》
  5. MLU的服务器测试消息,tomcat 启动服务器日志小结
  6. C语言——婚礼上的谎言
  7. 想成为高级PHP程序员,需要掌握哪些技术呢
  8. python 评分卡建模记录---使用到的各种函数(1)
  9. PHP图片加水印,然后将加水印的图片上传到七牛云
  10. PMP软件开发规模估算——代码行估算、功能点估算、PERT加权估算