欢迎使用CSDN-markdown编辑器

C# 基于Rijndael加密算法对XML文档加密和解密

参考资料

AES 和Des 对称加密
PaddingMode枚举详解
CipherMode 枚举详解

unity工程代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor ;
using System .Xml;
using System .Text ;
using System .Security .Cryptography ;
using System;
using System.IO;

public class StartXml {
static StartXml _instance;
public static StartXml Instance{
get {
if (_instance == null ){
_instance = new StartXml ();
}
return _instance;
}
}

/// <summary>
/// 创建XML文档
/// <param name="FileName">XML file Name.</param>
/// </summary>
public  void CreateXML(string FileName ){
    XmlDocument  doc;
    XmlDeclaration dec; 
    doc = new XmlDocument ();
    dec  =  doc.CreateXmlDeclaration ("1.0","UTF-8", null );
    doc .AppendChild (dec );
    XmlElement item = doc.CreateElement ("Levels");
    doc.AppendChild (item);
    string  SavePath = Application .dataPath + "/"+FileName +".xml";
    doc.Save (SavePath );
    AssetDatabase.Refresh ();
}

/// <summary>
/// 增加XML数据
/// </summary>
/// <param name="FileName">XML file Name.</param>
/// <param name="name"> 数据名称(第几关).</param>
/// <param name="value">数据的值(几颗星).</param>
public void SaveXMLData( string  FileName,string name,string   value){
    if (HasXMLData ( FileName ,name)) {
        ChangeXMLData (FileName ,name,value );
    } else {
        string v = RijndaelEncrypt (value);    //数据加密
        string  SavePath = Application .dataPath + "/"+FileName +".xml";
        XmlDocument  doc = new XmlDocument ();
        doc.Load (SavePath );
        XmlNode  root= doc.SelectSingleNode ("Levels");
        XmlElement LevelName =doc.CreateElement ( name);
        root .AppendChild (LevelName );
        XmlAttribute  LevelValue =doc .CreateAttribute  ( "StarNum");
        LevelValue.Value = v;
        LevelName.SetAttributeNode  (LevelValue );
        doc.Save (SavePath );
        AssetDatabase.Refresh ();
    }
}

/// <summary>
/// 更改数据
/// </summary>
/// <param name="FileName">XML file Name.</param>
/// <param name="name">Name.</param>
/// <param name="value">Value.</param>
public void ChangeXMLData(string FileName, string name, string value ){
    string v = RijndaelEncrypt (value);    //数据加密
    string  SavePath = Application .dataPath + "/"+FileName +".xml";
    XmlDocument  doc = new XmlDocument ();
    doc.Load (SavePath );
    XmlNode root = doc.SelectSingleNode ("Levels");
    XmlNodeList list = root.ChildNodes;
    foreach (XmlNode  item in list ) {
        XmlElement  Xe= (XmlElement ) item;
        if (Xe.Name == name ){
            Xe.Attributes ["StarNum"].Value = v;

// Debug.Log (Xe.GetAttribute (“StarNum”) );
}
}
doc.Save (SavePath );
AssetDatabase.Refresh ();
}

///
/// 查询是否存在这个值///
/// true if this instance has XML data the specified FileName name; otherwise, false.
/// XML file Name.
/// Name.
public bool HasXMLData(string FileName, string name ){
string SavePath = Application .dataPath + “/”+FileName +”.xml”;
XmlDocument doc = new XmlDocument ();
doc.Load (SavePath );
XmlNode root = doc.SelectSingleNode (“Levels”);
XmlNodeList list = root.ChildNodes;
foreach (XmlNode item in list ) {
XmlElement Xe= (XmlElement ) item;
if (Xe.Name == name ){
return true;
}
}
return false;
}

/// <summary>
/// 查询XML数据的条数
/// </summary>
/// <returns>The length of xml data .</returns>
/// <param name="FileName">XMLFile name.</param>
public int GetXmlLength(string FileName){
    string SavePath = Application .dataPath + "/"+FileName +".xml";
    XmlDocument doc = new XmlDocument ();
    doc.Load (SavePath );
    XmlNode root = doc.SelectSingleNode ("Levels");
    XmlNodeList list =  root.ChildNodes;
    return  list.Count;
}

/// <summary>
/// 读取Xml文档
/// </summary>
/// <returns> 星星的个数.</returns>
/// <param name="FileName">XML file Name.</param>
/// <param name="name"> 查找的关数.</param>
public int  ReadXMLData(string FileName,string name ){
    string SavePath = Application .dataPath + "/"+FileName +".xml";
    XmlDocument doc = new XmlDocument ();
    doc.Load (SavePath );
    XmlNode root = doc.SelectSingleNode ("Levels");
    XmlNodeList list = root.ChildNodes;
    foreach (XmlNode  item in list ) {
        XmlElement  Xe = (XmlElement) item;
        if(Xe.Name == name ){
            string j = RijndaelDecrypt(Xe.GetAttribute ("StarNum"));
            return int .Parse (j) ;
        }
    }
    return 0;
}

/// Rijndael加密算法
///
/// 待加密的明文
/// 密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
/// iv向量,长度为128(byte[16])
///
private  static string RijndaelEncrypt(string pString)
{
    //密钥
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
    //待加密明文数组
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);
    //Rijndael解密算法
    RijndaelManaged rDel = new RijndaelManaged();
    rDel.Key = keyArray;
    rDel.Mode = CipherMode.ECB;
    rDel.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = rDel.CreateEncryptor();
    //返回加密后的密文
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// Rijndaels the encrypt.
/// </summary>
/// <returns>The encrypt.</returns>
/// <param name="pString">待加密文本.</param>
/// <param name="mode">加密模式.</param>
public  static string RijndaelEncrypt(string pString,CipherMode mode)
{
    //密钥
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
    //待加密明文数组
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);
    //Rijndael解密算法
    RijndaelManaged rDel = new RijndaelManaged();
    rDel.Key = keyArray;
    rDel.Mode = mode;
    rDel.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = rDel.CreateEncryptor();
    //返回加密后的密文
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}


/// ijndael解密算法
///
/// 待解密的密文
/// 密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
/// iv向量,长度为128(byte[16])
///
private static String RijndaelDecrypt(string pString)
{
    //解密密钥
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
    //待解密密文数组
    byte[] toEncryptArray = Convert.FromBase64String(pString);
    //Rijndael解密算法
    RijndaelManaged rDel = new RijndaelManaged();
    rDel.Key = keyArray;
    rDel.Mode = CipherMode.ECB ;
    rDel.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = rDel.CreateDecryptor();
    //返回解密后的明文
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    return UTF8Encoding.UTF8.GetString(resultArray);
}

/// <summary>
/// 
/// </summary>
/// <returns>The decrypt.</returns>
/// <param name="pString">带解密的文本.</param>
/// <param name="mode">加密的模式.</param>
public static string RijndaelDecrypt(string pString ,CipherMode mode){
    byte[] toDecrypt =Convert.FromBase64String (pString );
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("12348578902223367877723456789012");
    RijndaelManaged rDel = new RijndaelManaged ();
    rDel.Key = keyArray;
    rDel.Mode = mode;
    rDel.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform =  rDel.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock (toDecrypt ,0,toDecrypt .Length );
    return UTF8Encoding.UTF8.GetString (resultArray );
}

}

“`


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值