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

打印如图

C# unity 中关于RSA加密字节太长的问题

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-31
  • 2022-12-23
  • 2021-12-13
  • 2022-12-23
  • 2022-02-21
  • 2022-12-23
相关资源
相似解决方案