开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

项目源码

关注:1272

当前位置:游戏蛮牛 资源专区 项目源码

查看: 1109|回复: 8

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

[复制链接]  [移动端链接]
5熟悉之中
655/1000
排名
6004
昨日变化
57

11

主题

135

帖子

655

积分

Rank: 5Rank: 5

UID
152229
好友
0
蛮牛币
2520
威望
0
注册时间
2016-6-16
在线时间
295 小时
最后登录
2017-11-19
发表于 2016-10-28 18:39:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 wtujoxk 于 2016-10-28 19:18 编辑

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

后的不对称加密方法


加密后的数据
QQ图片20161028183503.png


代码:

[C#] 纯文本查看 复制代码
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() { }
}





RSA密钥生成工具:
RsaKeys.rar (4.38 KB, 下载次数: 76)

回复

使用道具 举报

7日久生情
3065/5000
排名
242
昨日变化

0

主题

641

帖子

3065

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
115647
好友
0
蛮牛币
3034
威望
0
注册时间
2015-7-28
在线时间
785 小时
最后登录
2017-11-19
发表于 2016-10-31 23:54:53 | 显示全部楼层
楼主威武,多谢啊。。。

回复

使用道具 举报

排名
39649
昨日变化
13

0

主题

16

帖子

20

积分

Rank: 1

UID
155959
好友
0
蛮牛币
10
威望
0
注册时间
2016-7-8
在线时间
2 小时
最后登录
2016-11-27
发表于 2016-11-1 23:58:37 | 显示全部楼层
学习一下~

回复

使用道具 举报

排名
53168
昨日变化
21

1

主题

37

帖子

57

积分

Rank: 2Rank: 2

UID
173993
好友
0
蛮牛币
39
威望
0
注册时间
2016-10-8
在线时间
17 小时
最后登录
2017-9-15
QQ
发表于 2016-11-2 21:30:42 | 显示全部楼层
穷疯了,lzv587,多谢哈
[发帖际遇]: lenongku 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
356/500
排名
53168
昨日变化
21

0

主题

201

帖子

356

积分

Rank: 4

UID
115438
好友
0
蛮牛币
316
威望
0
注册时间
2015-7-27
在线时间
153 小时
最后登录
2017-11-18
QQ
发表于 2016-11-8 11:12:28 | 显示全部楼层
已mark ,留着慢慢看

回复 支持 反对

使用道具 举报

4四处流浪
336/500
排名
6197
昨日变化
2

1

主题

52

帖子

336

积分

Rank: 4

UID
15600
好友
0
蛮牛币
380
威望
0
注册时间
2014-2-25
在线时间
117 小时
最后登录
2017-11-2
发表于 2016-11-22 14:52:31 | 显示全部楼层
6666666的飞起

回复

使用道具 举报

5熟悉之中
785/1000
排名
3964
昨日变化
2

0

主题

339

帖子

785

积分

Rank: 5Rank: 5

UID
3796
好友
0
蛮牛币
879
威望
0
注册时间
2013-9-13
在线时间
158 小时
最后登录
2017-10-10
发表于 2017-1-7 10:52:22 | 显示全部楼层
研究一下看看

回复

使用道具 举报

7日久生情
2003/5000
排名
17661
昨日变化
6

2

主题

1675

帖子

2003

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2610
威望
0
注册时间
2016-11-22
在线时间
302 小时
最后登录
2017-11-15
发表于 2017-1-22 16:10:31 | 显示全部楼层
谢谢,研究一下

回复

使用道具 举报

5熟悉之中
522/1000
排名
10359
昨日变化
177

1

主题

374

帖子

522

积分

Rank: 5Rank: 5

UID
246489
好友
0
蛮牛币
882
威望
0
注册时间
2017-9-28
在线时间
73 小时
最后登录
2017-11-20

一贫如洗活力之星

发表于 2017-10-30 11:55:22 | 显示全部楼层
学习一下
[发帖际遇]: 一个袋子砸在了 ss_luck 头上,ss_luck 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表