【Unity】Xml的加密读取保存

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

一、工具类

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

using UnityEngine;
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Xml;

namespace EncryptUtility
{
    public class EncryptXmlDocument
    {
        /// <summary>
        /// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的
        /// </summary>
        /// <param name="toE"></param>
        /// <returns></returns>
        private string Encrypt(string toE)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(EncryptKey);
            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 string Decrypt(string toD)
        {
            //加密和解密采用相同的key,具体值自己填,但是必须为32位//
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(EncryptKey);

            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 IsFileExist(string fileName)
        {
            return File.Exists(fileName);
        }

        public void Load(string filename)
        {
            if (IsFileExist(filename))
            {
                StreamReader sReader = File.OpenText(filename);
                string dataString = sReader.ReadToEnd();
                sReader.Close();
                string xxx = Decrypt(dataString);
                _doc.LoadXml(xxx);
            }
        }

        public void Save(string filename)
        {
            string xxx = Encrypt(_doc.InnerXml);
            StreamWriter writer;
            writer = File.CreateText(filename);
            writer.Write(xxx);
            writer.Close();
        }

        public XmlDocument Instance { get { return _doc; } }
        private XmlDocument _doc = new XmlDocument();
        string dataKey = SystemInfo.deviceUniqueIdentifier; // 设置秘钥,根据平台而定
        public string EncryptKey = "12348578902223367877723456789012"; // 有需要自己修改,必须为32位
    }
}

二、测试

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

using UnityEngine;
using System.Collections;
using System.Linq;
using System.Xml.Linq;
using System;
using System.IO;
using System.Xml;
using EncryptUtility;

public class XmlEncryptExample : MonoBehaviour
{
    public string xmlpath;

    // Use this for initialization
    void Start()
    {
         xmlpath = Application.persistentDataPath + "/Data/myXML.xml";
        var dir = Path.GetDirectoryName(xmlpath);
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        EncryptXmlDocument doc = new EncryptXmlDocument();
        if(File.Exists(xmlpath))
        {
            doc.Load(xmlpath);

        }
        else
        {
            XmlElement root = doc.Instance.CreateElement("XMLContent");
            root.AppendChild( doc.Instance.CreateElement("IsFirstPlayGame"));
            root.AppendChild(doc.Instance.CreateElement("Herb1"));
            root.AppendChild(doc.Instance.CreateElement("Herb2"));
            root.AppendChild(doc.Instance.CreateElement("Herb3"));
                                 
            doc.Instance.AppendChild(root);
        }
        Debug.Log(doc.Instance.InnerXml);
        doc.Save(xmlpath);
    }
}

运行结果如下:

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

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xml加密XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密xml的初始内容将被替换,但其xml格式仍然被完好的保留。 介绍 我们有3个加密xml的方法 1、仅仅使用对称加密的方法加密xml 这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密xml保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取。 2、使用对称加密和非对称加密相结合的方法来加密xml 这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存xml文档中。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。 本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。 (译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。) 3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。 方法 不管xml加密是如何完的,保存加密数据总是用两种方法之一。 1、加密后所有的元素都被命名为 2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值