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