using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
//RSA加密字节太长的问题
public class SegmentedEncryption : MonoBehaviour
{
private string PublicKey = "<RSAKeyValue><Modulus>1BvOhmh3vFawBxSpRTCqPY+VTXS/OiAFmA+J+llggZM9v10fybycXP52sQkfpwI4eSkOBajzqvhNno0Yt1dXU4dL8Dt1BACfLHcaY/kUB0xBAqZWEHytlrFdvh28NrIcQrXusUXQ606gYCGTgv4Bn4mb2Rpb8Mw0UXKN/su9aWc=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
private string RawInput = "在刚刚过去的2017年中, 云栖社区坚守在开发者身边。2017年, 云栖大会在全国8个城市成功举办了300余场的技术主题论坛, 涵盖人工智能、大数据、金融科技、量子计算、生命科学、IoT、政务、多媒体、VR等多个前沿科技领域。2017年, 云栖社区联合多个及团队伙伴主办了10余场在线技术峰会, 分享了来自阿里巴巴最贴地气的实战经验。2017年, 云栖社区举办了200余场在线技术分享, 陪伴着无数技术爱好者走过一个又一个漫漫长夜。这些技术和产品思维迸发出的火花, 照亮了开发者前进的道路。如今,2017已经离我们远去, 但是如钻石般闪耀的技术灵感也都在云栖社区中得以沉淀, 我们为大家整理了全年千余份技术分享的PPT, 希望能够在2018年中给大家带来新的灵感启发。挥手告别2017, 2018云栖社区将一如既往地与各位技术同仁一道拥抱前沿科技, 让计算发挥出无法计算的价值。云计算随着2017年的结束, 云计算即将迈入第二个十年, 云计算行业的产业格局也将更加风起云涌, 各个云计算厂商, 在技术上和技术上不断推陈出新, 迅猛地成长和发展。阿里云, 作为中国第一、世界前列的云计算厂商, 不断地用技术实践攀登一个有一个技术高峰, 在时代的浪潮中砥砺前行。在2017年, 阿里云和无数的企业碰撞出了创新的火花, 不断为各个行业赋能, 让云计算发挥出了远远超过计算本身的价值。未来,阿里云也会与广大的云计算用户一道, 将云计算变成赋能业务的“水电煤”。本部分精选了一些与云计算紧密结合的实践经验。";
//分段加密
public string RsaEncrypt(string rawInput, string publicKey)
{
if (string.IsNullOrEmpty(rawInput))
{
return string.Empty;
}
if (string.IsNullOrWhiteSpace(publicKey))
{
throw new ArgumentException("Invalid Public Key");
}
using (var rsaProvider = new RSACryptoServiceProvider())
{
var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流
rsaProvider.FromXmlString(publicKey);//载入公钥
int bufferSize = (rsaProvider.KeySize / 8) - 11;//单块最大长度
var buffer = new byte[bufferSize];
using (MemoryStream inputStream = new MemoryStream(inputBytes),
outputStream = new MemoryStream())
{
while (true)
{ //分段加密
int readSize = inputStream.Read(buffer, 0, bufferSize);
if (readSize <= 0)
{
break;
}
var temp = new byte[readSize];
Array.Copy(buffer, 0, temp, 0, readSize);
var encryptedBytes = rsaProvider.Encrypt(temp, false);
outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);
}
return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输
}
}
}
//分段解密
public string RsaDecrypt(string encryptedInput, string privateKey)
{
if (string.IsNullOrEmpty(encryptedInput))
{
return string.Empty;
}
if (string.IsNullOrWhiteSpace(privateKey))
{
throw new ArgumentException("Invalid Private Key");
}
using (var rsaProvider = new RSACryptoServiceProvider())
{
var inputBytes = Convert.FromBase64String(encryptedInput);
rsaProvider.FromXmlString(privateKey);
int bufferSize = rsaProvider.KeySize / 8;
var buffer = new byte[bufferSize];
using (MemoryStream inputStream = new MemoryStream(inputBytes),
outputStream = new MemoryStream())
{
while (true)
{
int readSize = inputStream.Read(buffer, 0, bufferSize);
if (readSize <= 0)
{
break;
}
var temp = new byte[readSize];
Array.Copy(buffer, 0, temp, 0, readSize);
var rawBytes = rsaProvider.Decrypt(temp, false);
outputStream.Write(rawBytes, 0, rawBytes.Length);
}
return Encoding.UTF8.GetString(outputStream.ToArray());
}
}
}
// Use this for initialization
void Start ()
{
print("分段加密:"+RsaEncrypt(RawInput, PublicKey));
}
// Update is called once per frame
void Update () {
}
}
打印如图