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

原创 2017年07月04日 16:19:21

不对称加密方法

using System;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Xml.Serialization;
 
///@brief
///文件名称:SerializeTest
///功能描述:
///数据表:
///作者:YuXianQiang
///日期:#CreateTime#
///R1:
///修改作者:
///修改日期:
///修改理由:
 
public class RSAEncryptionDecrypt : MonoBehaviour
{
    //公钥
    private const string PublicRsaKey =
        @"<RSAKeyValue><Modulus>zKNV1AEbvGrTQyuat8kDhx4Z7HBmRX38GLYlgF1MM0/FFnGyyEccMkMfZV3dcO62fFVRAmEhgsvjAHwiJEL6sae73p5w/mxfRowkqZPm/bJaSwj5C1Z8cYqNwzu9AD+t3WVFvloL6wuRMH8G56XDb6tL7Q34VV0+zjGILpBRM0k=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
 
    //私钥
    private const string PrivateRsaKey =
        @"<RSAKeyValue><Modulus>zKNV1AEbvGrTQyuat8kDhx4Z7HBmRX38GLYlgF1MM0/FFnGyyEccMkMfZV3dcO62fFVRAmEhgsvjAHwiJEL6sae73p5w/mxfRowkqZPm/bJaSwj5C1Z8cYqNwzu9AD+t3WVFvloL6wuRMH8G56XDb6tL7Q34VV0+zjGILpBRM0k=</Modulus><Exponent>AQAB</Exponent><P>zOM8liykU3k3QUkXoLh6K++iEvCddVepn8f37ws3BTgO7ErH0o3B2Xbip+b5kP80Xv5kAAL3PVPy7KnCXZz8Iw==</P><Q>/7AoTIoGw9sIqUdNaSxOPEQLiN1Y+O9UTecoCJHIasHb6VizoptSYHAiX2g7mbFuUrjLPaAfLuqhIiecn1rDow==</Q><DP>cKCxm3Pq2SAXKcI+RNFkB2bxVywBwpFv4y+PsU4e7rWELoxlD+9xElPyAI5NvlErvtRksETxGDtfnI0tFTzItQ==</DP><DQ>hthdeHg2tyYV/EiZX8U5AXmVZ7nsyWRW3rrxFwvjWcIhe4AHRNOLb0bUKeLrw9Oabk/9B+QhbfnZvwyLAlO45w==</DQ><InverseQ>rOGwQPcRCGeKEqnL/isp+8+wyj8vQ2naxcemI8swK4FX4VUTl78ZTq/2Z+HfuEGIrosUJUCQ3lFWDr0K8ucDeg==</InverseQ><D>Czh7iMvkwvCSk/DMo34sqNiAMGQ7X10YmRxHsyGqf3fExUXHuU6Y37KpgovijAIy1F9zOS+tQDhAwrKLxrQ7fbAFKKOgBFi56YurjxSIKXbe5ivpvFQ9NhEobghavuCkq8yvZ36YZ5IIhCik1G8GKWIYA05sli5txkJIBtq8AWc=</D></RSAKeyValue>";
 
    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, PublicRsaKey);
        List<Information> serTest = GeneralDeserialize<List<Information>>(path, PrivateRsaKey);
 
        //输出返回的值
        foreach (var temp in serTest)
        {
            Debug.Log(temp.name);
            Debug.Log(temp.age);
        }
    }
 
    /// <summary>
    /// 加密序列化  
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="obj">要序列化的对象</param>
    /// <param name="path">保存路径</param>
    /// <param name="publicKey">公钥</param>
    void GeneralSerialize<T>(T obj, string path, string publicKey)
    {
        if (string.IsNullOrEmpty(path)) return;
        string data = null; //最后要保存的数据
 
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //rsa类
        rsa.FromXmlString(publicKey); //使用公钥加密
 
        MemoryStream msMax = new MemoryStream();
        MemoryStream msSub = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(typeof(T));
 
        xs.Serialize(msMax, obj); //序列化到内存
 
        byte[] maxSize = msMax.GetBuffer();
        msMax.Flush();
        msMax.Position = 0;  //如果没有,就不能Read
        msMax.Read(maxSize, 0, maxSize.Length);
        int maxLength = rsa.KeySize/8 - 11; //加密块最大长度限制
 
        //如果数据超出maxLength,就要切割数据进行加密
        if (maxSize.Length <= maxLength)
        {
            data = Convert.ToBase64String(rsa.Encrypt(maxSize, true)); //加密
        }
        else
        {
            byte[] buffer = new byte[maxLength];
            msMax.Flush();
            msMax.Position = 0;
            int blockSize = msMax.Read(buffer, 0, maxLength);
            while (blockSize > 0)
            {
                byte[] toEncrypt = new byte[blockSize];
                Array.Copy(buffer, 0, toEncrypt, 0, blockSize);
 
                byte[] crypToGraph = rsa.Encrypt(toEncrypt, false);
                msSub.Write(crypToGraph, 0, crypToGraph.Length);//加密
                blockSize = msMax.Read(buffer, 0, maxLength);
            }
            data = Convert.ToBase64String(msSub.ToArray());
        }
 
        Stream fs = File.Create(path);
        StreamWriter sw = new StreamWriter(fs);
        sw.Write(data); //写入XML文本保存
        sw.Close();
        fs.Close();
        msSub.Close();
        msMax.Close();
        rsa.Clear();
    }
 
    /// <summary>
    /// 加密反序列化  
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="path">保存路径</param>
    /// <param name="privateKey">私钥</param>
    /// <returns></returns>
    T GeneralDeserialize<T>(string path, string privateKey)
    {
        if (string.IsNullOrEmpty(path)) return default(T);
        string data = null;
        byte[] decData = null;
        XmlSerializer xs = new XmlSerializer(typeof(T));
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(privateKey);//使用私钥解密
 
        Stream fs = File.OpenRead(path);
        StreamReader sr = new StreamReader(fs);
        data = sr.ReadToEnd(); //读入数据
 
        byte[] strTobyte = Convert.FromBase64String(data);
        int maxSize = rsa.KeySize/8; //解密块最大长度限制
        MemoryStream msMax = new MemoryStream(strTobyte);
        MemoryStream msSub = new MemoryStream();
 
        //如果数据超出maxLength,就要切割数据进行解密
        if (strTobyte.Length <= maxSize)
        {
            decData = rsa.Decrypt(strTobyte, false); //解密
        }
        else
        {
            byte[] buffer = new byte[maxSize];
            int blockSize = msMax.Read(buffer, 0, maxSize);
 
            while (blockSize > 0)
            {
                byte[] toDecrypt = new byte[blockSize];
                Array.Copy(buffer, 0, toDecrypt, 0, blockSize);
 
                byte[] plainText = rsa.Decrypt(toDecrypt, false);//解密
                msSub.Write(plainText, 0, plainText.Length);
                blockSize = msMax.Read(buffer, 0, maxSize);
            }
            decData = msSub.ToArray();
        }
 
        MemoryStream msDes = new MemoryStream(decData); //将要反序列化的数据写入内存
        T retObj = (T)xs.Deserialize(msDes); //反序列化
        rsa.Clear();
        msDes.Close();
        msMax.Close();
        msSub.Close();
        return retObj;
    }
}
 
 
[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 RSA 加密数据 序列化和反序列化 通用方法

不对称加密方法 using System; using UnityEngine; using System.Collections.Generic; using System.IO; using S...
  • yuhijk2055
  • yuhijk2055
  • 2017年07月04日 16:19
  • 191

unity3d 获取cpu序列号,硬盘ID,网卡MAC地址等硬件可用于加密

首先在添加引用中选中System.Management using System.Management; using System.Management.Instrumentation; ...
  • mysouling
  • mysouling
  • 2016年02月24日 10:52
  • 3127

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

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

Unity中JSON序列化与反序列化

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

Unity 数据保存加密

IOHelperusing UnityEngine; using System; using System.IO; using System.Text; using System.Security.C...
  • qq_35471779
  • qq_35471779
  • 2017年08月12日 13:41
  • 162

Unity之SerializeField(序列化字段)和Serializable的一点理解

[HideInInspector]表示将原本显示在面板上的序列化值隐藏起来。       [SerializeField]表示将原本不会被序列化的私有变量和保护变量变成可以被序列化的,那么它们在下次读...
  • Momo_Da
  • Momo_Da
  • 2017年05月08日 18:19
  • 4599

Unity XML的序列化和反序列化

开始学习了,要不断的积累才能产生质变,加油吧!!! 今天学习一下XML的读取和写入,XML作为常用的数据存储,了解并掌握是必须的。using UnityEngine; using System.C...
  • liujunjie612
  • liujunjie612
  • 2017年01月06日 10:59
  • 1090

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

将下面的脚本挂到任意物体 using UnityEngine; using System.Collections.Generic; using System.IO; using System.Lin...
  • yuhijk2055
  • yuhijk2055
  • 2017年07月04日 16:17
  • 85

【Unity3D】存档文件加密代码

原文地址:http://zgame.blog.51cto.com/6144241/1103043 存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改pl...
  • canglang_123
  • canglang_123
  • 2014年12月23日 19:08
  • 920

Unity中使用序列化来保存本地游戏数据

Unity中使用序列化来保存本地游戏数据 游戏中常常会遇到需要保存玩家数据的情况,如果是简单的数据,unity已经提供一种非常方便的数据存储的方式:PlayerPrefs类。但是这样存储简单的数据还好...
  • goodboy31985
  • goodboy31985
  • 2017年10月17日 21:23
  • 103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity RSA 加密数据 序列化和反序列化 通用方法
举报原因:
原因补充:

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