1. 程式人生 > >C# unity 中關於RSA加密位元組太長的問題

C# unity 中關於RSA加密位元組太長的問題

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

列印如圖