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() { }
}

Unity 中使用C#的序列化和反序列化处理游戏数据

这段时间在研究和学习C#的序列化和反序列化的东西。发现这是一个非常友好的数据本地store的方式。但是在使用过程中也有很多有意思的地方,我这里把我越到的问题列一下。我使用的是C#的二进制形式的序列化和...
  • liangZG_2011
  • liangZG_2011
  • 2013年09月04日 15:06
  • 2767

DES加密时代的终结者——AES加密算法

 转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     在前面的两篇文章中,我们介绍了DES算法,3DES算法以及他们的Android程序实现,并...
  • rsgzs
  • rsgzs
  • 2015年12月12日 23:58
  • 953

3DES 和 AES 加密算法的使用

3DES 介绍上篇文章已经介绍了 DES 算法的使用,并且也提到,在计算机计算速度特别快的今天,要破解 DES 加密过后的数据是完全有可能做到的,为什么呢?因为 DES 算法的密钥 也就64位,所有可...
  • Hwaphon
  • Hwaphon
  • 2016年08月12日 12:36
  • 4260

DES/3DES/AES 加密算法区别

DES DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解...
  • u010568345
  • u010568345
  • 2014年11月20日 23:48
  • 2059

crypto++ 中DES AES RC5 RC6 TEA XTEA XXTEA加密算法性能比较

AES,DES,RC5,RC6,TEA,XTEA,XXTEA加密算法性能比较,AES-NI指令对加密性能的影响。游戏服务器中加密算法的选择。...
  • m08090420
  • m08090420
  • 2015年06月27日 16:27
  • 2321

Android静态安全检测 -> AES/DES弱加密

AES/DES弱加密 - Cipher.getInstance方法 1. API 继承关系 java.lang.Object java.crypto.Cipher 主...
  • u013107656
  • u013107656
  • 2016年07月22日 19:52
  • 2318

MD5/DES/AES加密实现

三种加密方式,java版本实现代码如下:import java.io.UnsupportedEncodingException; import java.security.MessageDigest;...
  • liuzhoulong
  • liuzhoulong
  • 2016年12月23日 14:58
  • 1593

Unity中使用DES加密数据

/// /// 加密 /// /// 需要加密的原字符串 /// 秘钥 /// public string Encrypt_UTF8(string ...
  • lei0510
  • lei0510
  • 2017年03月04日 13:09
  • 555

Unity中JSON序列化与反序列化

一.JSON介绍         JSON是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的...
  • zhang_liujie
  • zhang_liujie
  • 2017年09月03日 16:22
  • 367

常用加密解密算法【RSA、AES、DES、MD5】介绍和使用

为了防止我们的数据泄露,我们往往会对数据进行加密,特别是敏感数据,我们要求的安全性更高。下面将介绍几种常用的加密算法使用。这些算法的加密对象都是基于二进制数据,如果要加密字符串就使用统一编码(如:ut...
  • u013565368
  • u013565368
  • 2016年11月08日 13:12
  • 9202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity DES AES加密数据 序列化和反序列化 通用方法
举报原因:
原因补充:

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