using UnityEngine;
using System.Xml;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System;
public class XmlProcess:IDisposable
{
public string original_filepath;
public string encode_filepath;
public string decode_filepath;
public string info;
public XmlProcess() { }
public XmlProcess(string filepath)
{
original_filepath = filepath;
string path = Path.GetDirectoryName(filepath);
string filename = Path.GetFileName(filepath);
encode_filepath = path + "/en" + filename;
decode_filepath = path + "/de" + filename;
}
public string GetIPAddress()
{
string filepath = Application.dataPath + @"/xml/LoginSetting.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//根据路径将XML读取出来
xmlDoc.Load(filepath);
XmlNodeList nodeList = xmlDoc.SelectSingleNode("assets").ChildNodes;
//遍历所有节点
foreach (XmlElement cus in nodeList)
{
if (cus.GetAttribute("id") == "1")
{
//遍历所有子节点
foreach (XmlElement xe in cus)
{
//拿到ip的节点
if (xe.Name == "ip")
return xe.InnerText.Trim();
}
}
}
}
return string.Empty;
}
public string GetPort()
{
string filepath = Application.dataPath + @"/xml/LoginSetting.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//根据路径将XML读取出来
xmlDoc.Load(filepath);
XmlNodeList nodeList = xmlDoc.SelectSingleNode("assets").ChildNodes;
//遍历所有节点
foreach (XmlElement cus in nodeList)
{
if (cus.GetAttribute("id") == "1")
{
//遍历所有子节点
foreach (XmlElement xe in cus)
{
//拿到ip的节点
if (xe.Name == "port")
return xe.InnerText.Trim();
}
}
}
}
return string.Empty;
}
public bool CheckUnique(string root, string info)
{
string uniqueID = SystemInfo.deviceUniqueIdentifier;//获取机器唯一识别码
if (File.Exists(original_filepath))//证明这次是第一次运行该程序,获取当前配置文件
{
SetInfo(root, info, elem_value: uniqueID);
GenerateEncodeXML1(root);
return true;
}
else if (File.Exists(encode_filepath))
{
fileDcryption(encode_filepath);
if (File.Exists(decode_filepath))
{
var id = GetInfo(decode_filepath, root, info);
File.Delete(decode_filepath);
if (id == uniqueID)
return true;//验证合格
else
return false;
}
}
//没有找到相关文件
return false;
}
///
/// 唯一识别号匹配,匹配成功返回true
///
///
///
///
public void GetMode(string root,ref bool smart,ref bool unique,ref bool validity)
{
if (File.Exists(original_filepath))//证明这次是第一次运行该程序,获取当前配置文件
{
smart = bool.Parse(GetInfo(original_filepath, "assets", "SmartX1"));//
unique = bool.Parse(GetInfo(original_filepath, "assets", "Unique"));
validity = bool.Parse(GetInfo(original_filepath, "assets", "Validity"));
GenerateEncodeXML1(root);
}
else if (File.Exists(encode_filepath))
{
fileDcryption(encode_filepath);
if (File.Exists(decode_filepath))
{
smart = bool.Parse(GetInfo(decode_filepath, "assets", "SmartX1"));//
unique = bool.Parse(GetInfo(decode_filepath, "assets", "Unique"));
validity = bool.Parse(GetInfo(decode_filepath, "assets", "Validity"));
File.Delete(decode_filepath);
}
}
else
{
smart = true;
}
//没有找到相关文件,全部不启用
}
public void SmartControlXML(ref string appid,string elem1= "SmartX1", string elem2= "BaseInfo", string elem3= "AppID")
{
if (File.Exists(original_filepath))//证明这次是第一次运行该程序,获取当前配置文件
{
appid = GetInfo(original_filepath, elem1, elem2, elem3);
//StartCoroutine(GenerateEncodeXML());
GenerateEncodeXML1(elem1);
}
else if (File.Exists(encode_filepath))
{
fileDcryption(encode_filepath);
if (File.Exists(decode_filepath))
{
appid = GetInfo(decode_filepath, elem1, elem2, elem3);
File.Delete(decode_filepath);
}
}
else
{
//没有找到加密文件
appid = null;
}
}
public ValidityEntiy GetValidityEntiy(string rootstr )
{
if (File.Exists(original_filepath))//证明这次是第一次运行该程序,获取当前时间,写入配置文件
{
string validity = GetInfo(original_filepath, rootstr, "validity");
ValidityEntiy vali = new ValidityEntiy(validity);
string time = GetInfo(original_filepath, rootstr, "time");
vali.time = time;
if (string.IsNullOrEmpty(time))
{
SetInfo(original_filepath, rootstr, "time", elem_value: Convert.ToString(DateTime.Now));
}
GenerateEncodeXML1(rootstr);
return vali;
}
else if (File.Exists(encode_filepath))
{
fileDcryption(encode_filepath);
if (File.Exists(decode_filepath))
{
string validity = GetInfo(decode_filepath, rootstr, "validity");
ValidityEntiy vali = new ValidityEntiy(validity);
string time = GetInfo(decode_filepath, rootstr, "time");
vali.time = time;
File.Delete(decode_filepath);
return vali;
}
}
return ValidityEntiy.UnValidity();
}
///
/// 获取需要的信息
///
/// 文件路径
/// 根节点名
/// 子节点名
///
public string GetInfo(string filepath, string root, string info1 = null, string info2 = null, string info3 = null)
{
string value = "";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNode rootNdoe = xmlDoc.SelectSingleNode(root);
XmlNodeList nodeList = rootNdoe.ChildNodes;
foreach (XmlElement elem1 in nodeList)
{
if (elem1.Name == info1)
{
if (string.IsNullOrEmpty(info2))
{
value = elem1.InnerText;
break;
}
else
{
foreach (XmlElement elem2 in elem1.ChildNodes)
{
if (elem2.Name == info2)
{
if (string.IsNullOrEmpty(info3))
{
value = elem2.InnerText;
break;
}
else
{
foreach (XmlElement elem3 in elem2.ChildNodes)
{
if (elem3.Name == info3)
{
value = elem3.InnerText;
break;
}
}
}
}
}
}
}
}
}
return value;
}
public void SetInfo(string filepath,string rootstr, string elem1_ = null, string elem2_ = null, string elem3_ = null, string elem_value = null)
{
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(original_filepath);
XmlNode root = xmlDoc.SelectSingleNode(rootstr);
XmlNodeList nodeList = root.ChildNodes;
foreach (XmlElement elem1 in nodeList)
{
if (elem1.Name == elem1_)
{
if (string.IsNullOrEmpty(elem2_))
{
elem1.InnerText = elem_value;
break;
}
else
{
foreach (XmlElement elem2 in elem1.ChildNodes)
{
if (elem2.Name == elem2_)
{
if (string.IsNullOrEmpty(elem3_))
{
elem2.InnerText = elem_value;
break;
}
else
{
foreach (XmlElement elem3 in elem2.ChildNodes)
{
if (elem3.Name == elem3_)
{
elem3.InnerText = elem_value;
break;
}
}
}
}
}
}
}
}
xmlDoc.Save(filepath);
}
}
///
/// 生成加密的xml文件
///
public void GenerateEncodeXML1(string root)
{
fileEncryption(original_filepath,root);
if (File.Exists(encode_filepath))
{
File.Delete(original_filepath);
}
}
///
/// 加密xml文件
///
///
///
///
private void Encrypt(XmlDocument doc, string ElementName, SymmetricAlgorithm key)
{
XmlElement elementEncrypt = doc.GetElementsByTagName(ElementName)[0] as XmlElement;
EncryptedXml eXml = new EncryptedXml();
byte[] encryptElement = eXml.EncryptData(elementEncrypt, key, false);//
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
string encryptionMethod = null;
if (key is TripleDES)
{
encryptionMethod = EncryptedXml.XmlEncTripleDESUrl;
}
else if (key is DES)
{
encryptionMethod = EncryptedXml.XmlEncDESUrl;
}
if (key is Rijndael)
{
switch (key.KeySize)
{
case 128:
encryptionMethod = EncryptedXml.XmlEncAES128Url;
break;
case 192:
encryptionMethod = EncryptedXml.XmlEncAES192Url;
break;
case 256:
encryptionMethod = EncryptedXml.XmlEncAES256Url;
break;
}
}
edElement.EncryptionMethod = new EncryptionMethod(encryptionMethod);
edElement.CipherData.CipherValue = encryptElement;
EncryptedXml.ReplaceElement(elementEncrypt, edElement, false);
}
///
/// XML文件解密
///
///
///
private void Decrypt(XmlDocument doc, SymmetricAlgorithm Alg)
{
XmlElement encryptedElement = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
EncryptedData edElement = new EncryptedData();
edElement.LoadXml(encryptedElement);
EncryptedXml exml = new EncryptedXml();
byte[] rgbOutput = exml.DecryptData(edElement, Alg);
exml.ReplaceData(encryptedElement, rgbOutput);
}
///
/// 举例,对某个XML文件加密
///
///
private void fileEncryption(string filename,string root)
{
RijndaelManaged key = new RijndaelManaged();
//设置密钥:key为32位=数字或字母16个=汉子8个
byte[] byteKey = Encoding.Unicode.GetBytes("1111111111111111");
key.Key = byteKey;
XmlDocument xmldoc = new XmlDocument();
xmldoc.PreserveWhitespace = true;
xmldoc.Load(original_filepath);//想要加密的xml文件
Encrypt(xmldoc, root, key);//需要加密的节点
if (key != null)
{
key.Clear();
}
xmldoc.Save(encode_filepath);//生成加密后的xml文件
}
///
/// 举例,对某个xml文件解密
///
///
private void fileDcryption(string filename)
{
RijndaelManaged key = new RijndaelManaged();
byte[] byteKey = Encoding.Unicode.GetBytes("1111111111111111");
key.Key = byteKey;
XmlDocument xmldoc = new XmlDocument();
xmldoc.PreserveWhitespace = true;
xmldoc.Load(encode_filepath);//加载要解密的xml文件
Decrypt(xmldoc, key);
if (key != null)
{
key.Clear();
}
xmldoc.Save(decode_filepath);//生成解密后的文件
}
public void Dispose()
{
}
}