Unity DES AES加密数据 序列化和反序列化 通用方法

原创 2017年07月04日 16:18:31
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml.Serialization;
 
public class SerializeTest : MonoBehaviour
{
    //keyVal输入32位,ivVal为16位
    static string keyVal = "qsedcvfrgthjuiklopoiuytrfgbvcdew";
    static string ivVal = "124578963axswedr";
 
    void Start()
    {
        List<Information> serList = new List<Information>();
        string path = @"Test.xml";
 
        //赋值
        for (int i = 0; i < 5; i++)
        {
            serList.Add(new Information("名字" + i, 20 + i));
        }
 
        GeneralSerialize(serList, path, keyVal, ivVal);
        //XMLSerialize(serList, path);
        //List<Information> serTest = XMLDeserialize<List<Information>>(path);
        List<Information> serTest = GeneralDeserialize<List<Information>>(path, keyVal, ivVal);
 
        //输出返回的值
        foreach (var temp in serTest)
        {
            Debug.Log(temp.name);
            Debug.Log(temp.age);
        }
    }
 
    /// <summary>  
    /// 加密序列化  
    /// </summary>  
    /// <param name="obj">要序列化的对象</param>  
    /// <param name="path">保存路径</param>  
    /// <param name="key">密钥值</param>  
    /// <param name="iv">加密辅助向量</param> 
    /// <returns></returns>  
 
    void GeneralSerialize<T>(T obj, string path, string key, string iv)
    {
        if (string.IsNullOrEmpty(path)) return;
        //32位
        key = "qwertyuiopasdfghqwertyuiopasdfgh";
        //16位
        iv = "qwertyuiopasdfgh";
         
        using (var fileStream = File.Create(path))
        {
            //AES加密
            Rijndael aes = Rijndael.Create();
            aes.Key = Encoding.UTF8.GetBytes(ivVal.Length >= 32 ? ivVal.Substring(0, 32) : key);
            aes.IV = Encoding.UTF8.GetBytes(ivVal.Length >= 16 ? ivVal.Substring(0, 16) : iv);
 
            //DES加密
            //DESCryptoServiceProvider des = new DESCryptoServiceProvider()
            //{
            //    Key = Encoding.ASCII.GetBytes(keyVal.Length > 8 ? keyVal.Substring(0, 8) : key.Substring(0, 8)),
            //    IV = Encoding.ASCII.GetBytes(ivVal.Length > 8 ? ivVal.Substring(0, 8) : iv.Substring(0, 8))
            //};
 
            //加密流,如果是AES加密aes.CreateEncryptor(),DES加密des.CreateEncryptor()
            CryptoStream crStream = new CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
            XmlSerializer xs = new XmlSerializer(typeof(T));
            xs.Serialize(crStream, obj);
            aes.Clear();
            crStream.Close();
            fileStream.Close();
        }
    }
 
    /// <summary>  
    /// 加密反序列化  
    /// </summary>  
    /// <param name="path">路径</param>  
    /// <param name="key">密钥值</param>  
    /// <param name="iv">加密辅助向量</param> 
    /// <returns></returns>  
 
    T GeneralDeserialize<T>(string path, string key, string iv)
    {
        if (string.IsNullOrEmpty(path)) return default(T);
        //32位
        key = "qwertyuiopasdfghqwertyuiopasdfgh";
        //16位
        iv = "qwertyuiopasdfgh";
         
        using (var fileStream = File.OpenRead(path))
        {
            //AES加密
            Rijndael aes = Rijndael.Create();
            aes.Key = Encoding.UTF8.GetBytes(ivVal.Length >= 32 ? ivVal.Substring(0, 32) : key);
            aes.IV = Encoding.UTF8.GetBytes(ivVal.Length >= 16 ? ivVal.Substring(0, 16) : iv);
 
            //DES加密
            //DESCryptoServiceProvider des = new DESCryptoServiceProvider()
            //{
            //    Key = Encoding.ASCII.GetBytes(keyVal.Length > 8 ? keyVal.Substring(0, 8) : key.Substring(0, 8)),
            //    IV = Encoding.ASCII.GetBytes(ivVal.Length > 8 ? ivVal.Substring(0, 8) : iv.Substring(0, 8))
            //};
 
            //加密流,如果是AES加密aes.CreateEncryptor(),DES加密des.CreateEncryptor()
            CryptoStream crStream = new CryptoStream(fileStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
            XmlSerializer xs = new XmlSerializer(typeof(T));
            T retObj = (T)xs.Deserialize(crStream);
            aes.Clear();
            crStream.Close();
            fileStream.Close();
            return retObj;
        }
    }
 
 
    //未加密序列化
    void XMLSerialize<T>(T obj, string path)
    {
        if (string.IsNullOrEmpty(path)) return;
 
        XmlSerializer xs = new XmlSerializer(typeof(T));
        Stream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
        xs.Serialize(fs, obj);
        fs.Flush();
        fs.Close();
        fs.Dispose();
    }
 
    //未加密反序列化
    T XMLDeserialize<T>(string path)
    {
        if (string.IsNullOrEmpty(path)) return default(T);
 
        XmlSerializer xs = new XmlSerializer(typeof(T));
        Stream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
        T serTest = (T)xs.Deserialize(fs);
        fs.Flush();
        fs.Close();
        fs.Dispose();
        return serTest;
    }
}
 
[XmlType("人员信息")]
public class Information
{
    [XmlAttribute("名字")]
    public string name;
 
    [XmlAttribute("年龄")]
    public int age;
    public Information(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
 
    //必须要有
    public Information() { }
}

MaNGOS 下载,编译,配置和运行的基本步骤

1.MaNGOS 下载,编译,配置和运行的基本步骤(基本)           下载和安装msysgit,用于代码管理。我使用的是Git-1.6.5.1-preview20091022.exe。...

Mangos服务器框架设计分析(一)

距离上次写博客已经大半年了,这大半年中经历了很多的人和事,并且也收获了很多,所在的项目组游戏已经成功上线运营了,在此稍微花点时间记录一下这大半年在业余时间做的一些技术积累吧,在此就以堪称是“大魔兽私服...
  • zmyer
  • zmyer
  • 2015年01月22日 20:41
  • 1061

Unity RSA 加密数据 序列化和反序列化 通用方法

不对称加密方法 using System; using UnityEngine; using System.Collections.Generic; using System.IO; using S...

Java反序列化漏洞通用利用分析

 1 背景 2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogi...

反序列化作用

  • 2013年07月04日 07:12
  • 104KB
  • 下载

Java反序列化漏洞通用利用分析

原文出处: https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/#h4.1_利用过程概述1 背景2015年11月6日,FoxGlove S...

Xml反序列化

  • 2013年09月15日 12:02
  • 25KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity DES AES加密数据 序列化和反序列化 通用方法
举报原因:
原因补充:

(最多只允许输入30个字)