欢迎使用CSDN-markdown编辑器

来源:互联网 发布:超市购物篮数据下载 编辑:程序博客网 时间:2024/06/06 12:26

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 );}

}

“`


0 0
原创粉丝点击