.NET的RSA分段加解密

.NET的RSA分段加解密


一.调用

	//密钥对,请配合密钥生成工具使用
    private const string publicRsaKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAirNpPrqLwGt076pOCi1y4PbpQphSZBtgazqEqXJB99TrqQwKrEgENHFVVUQERg+8n628NdFynIZ3Hu93/YgbJ2qm2lsn5V3LDU5Jpwt7xbAr9GU/yk+/lrHGnU9CsqKiCB4V4XGyp97LgxKRiFzWVslJ7JZZ0BbcMparoyX17NjVBWO4liQm8AjE7Dz5QdSiJdZnnJeorFqWt1tO3q39bKeIz26WYIYWyKW3CTCb3ABvHTlZFrmXdd9Iyj31cVSPhlv84A0+vz6Rs9IIaIoJMX6eulE1zursqz8fXaFvg6HxCapGxiVSnOWSgU0iO9pxnmlB8To4DWTMiGy7O0KuwwIDAQAB";
    private const string privateRsaKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKs2k+uovAa3Tvqk4KLXLg9ulCmFJkG2BrOoSpckH31OupDAqsSAQ0cVVVRARGD7yfrbw10XKchnce73f9iBsnaqbaWyflXcsNTkmnC3vFsCv0ZT/KT7+WscadT0KyoqIIHhXhcbKn3suDEpGIXNZWyUnsllnQFtwylqujJfXs2NUFY7iWJCbwCMTsPPlB1KIl1mecl6isWpa3W07erf1sp4jPbpZghhbIpbcJMJvcAG8dOVkWuZd130jKPfVxVI+GW/zgDT6/PpGz0ghoigkxfp66UTXO6uyrPx9doW+DofEJqkbGJVKc5ZKBTSI72nGeaUHxOjgNZMyIbLs7Qq7DAgMBAAECggEALwlSyqwWkqWeXVyC5J6vE62IQ0ZGwp4qH5MTxCb0SiiR1p03zV8K1gINL0JGtL/HdttDNXkXBg/vu7T4GymaE87uUKSTLgyVvKhs/9I8IjlxXosri99pmKAnO9fSRaQzkM8rGm4laRp8J7IXWogpQ/s1L595S8FE4X8JK+XGtY//H3SncE/dqHtw4uUbGM/HltiRu3G1KQFsJRpip1mgvPoMSd+M/H6g7Lr+r8Re8Y1UobbvHYMsp1e1pUbT9mlZ2LYJEzd605y/zlnw8Ti3PjILfGQeqg50e4n0SOM2bXs+9nHEq9NBm7qKpuw7lq5mqTWHwzMhojW3Ecb1EUHW8QKBgQDDx5fy8MuxAmoIHhLrW4z09nOv62tIwlwv8N+kposta01ujBbTCytR8B6fs0p1RLX+33cSO5ZEC2WoMX24Gk/54NJpwdhVVwWCCeqruROrGLNeLXS3DR+CmPljfdWE32CfVJ8H+ui++YPY+jBkmud/dEsdMc4nYq8gzJMRRiplWQKBgQC1XTifqHasl14x3VWVQU0S96gw2wy83FCD+vePtOPonQ0BfM+Owx6OfE+f3ibC/aoh7RCa3gOozv5PTIEOu6nZkiQ5r1tw2lGxzy5EVVJyhTEaWYQfxd7rqrFF7/9X4x2eN5BXRog5wlGg/9nkhC/xvinhm/I5RA1etBkTSstFewKBgFxfrlgYOWN5aiIOXoriFW33Yrpcb7BS1EBifIMpeX2ipVRFkPdey7/LdgeQBs+x7dUmBv55UvskDYEAaPsWnymdZGo15ibN+nFS0IDZwGf4LZmABRPhgz6Rgwnoc3hQFTzYJnkTcAG7pPQZh//P/u5qJo7N0yFONKdbHwEFhDdxAoGBAI5OQiLMjamo78kSkZeWcIKEfp0vE5SRDkAwyNUiq32W1WCobTfok+5bTiLzrdhsL3WFTPUnZRmsqVDRh6Zmy8Qi7newx4AKXfW1yejmRdYD+l5hhNFlch/ahFSLFwD//PprQL+qYTNo7KH2fyLWMcRuYPBca7hRVGhNyisgEdVHAoGACCYj0btN88kS2sZRIFv61xKRGeW3aMRsK5yymCnfURh+YpPTPYkjQ9Vv1wE5at5ghGjsaikfo0288LfHWNn59Nhl08WMU0xyXzPoO5BTe65rPIYy+8y6LsGYTv0xy0vRimAXEoSyYqscN221IIc4a+IaNX2ZLIIZoTWw5HuRlvg=";
	
	//此处data尽量是一个JSON格式的字符串
	public void HelloWorld(string data)
    {
    	string encryptInfo = Encrypt(convertToXmlpublicKey(publicRsaKey), data);
       	Console.WriteLine("加密后的数据");
        string info = Decrypt(convertToXmlPrivateKey(privateRsaKey), encryptInfo );
        Console.WriteLine("解密后的数据");
    }       

二.将秘钥转换为xml格式

公钥转换

	/// <summary>    
    /// RSA公钥-->XML格式转换, 
    /// </summary>    
    /// <param name="publicKey">公钥</param>    
    /// <returns>xml格式的公钥</returns>   
	public static string convertToXmlpublicKey(string publicKey)
    {
    	RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
		string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
		Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
		Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
		return XML;
    }

私钥转换

	/// <summary>
    /// 私钥转XML
    /// </summary>
    /// <param name="privateJavaKey">私钥</param>
    /// <returns>xml格式的私钥</returns>
	public static string convertToXmlPrivateKey(string privateJavaKey)
    {
		RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey));
		return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
            Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
    }

三.加解密

		private static readonly Encoding Encoder = Encoding.UTF8;

        /// <summary>
        /// 公钥加密
        /// </summary>
        /// <param name="xmlPublicKey">公钥</param>
        /// <param name="EncryptString">加密字符串</param>
        /// <returns></returns>
        public static String Encrypt(string xmlPublicKey, string EncryptString)
        {
            using (RSACryptoServiceProvider RSACryptography = new RSACryptoServiceProvider())
            {

                RSACryptography.FromXmlString(xmlPublicKey);
                Byte[] PlaintextData = Encoder.GetBytes(EncryptString);
                int MaxBlockSize = RSACryptography.KeySize / 8 - 11;//加密块最大长度限制

                if (PlaintextData.Length <= MaxBlockSize)
                    return Convert.ToBase64String(RSACryptography.Encrypt(PlaintextData, false));

                using (MemoryStream PlaiStream = new MemoryStream(PlaintextData))
                using (MemoryStream CrypStream = new MemoryStream())
                {
                    Byte[] Buffer = new Byte[MaxBlockSize];
                    int BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);

                    while (BlockSize > 0)
                    {
                        Byte[] ToEncrypt = new Byte[BlockSize];
                        Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize);

                        Byte[] Cryptograph = RSACryptography.Encrypt(ToEncrypt, false);
                        CrypStream.Write(Cryptograph, 0, Cryptograph.Length);

                        BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);
                    }

                    return Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);
                }
            }
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="xmlPublicKey"></param>
        /// <param name="EncryptString"></param>
        /// <returns></returns>
        public static String Decrypt(string xmlPrivateKey, string EncryptString)
        {
            using (RSACryptoServiceProvider RSACryptography = new RSACryptoServiceProvider())
            {
                RSACryptography.FromXmlString(xmlPrivateKey);
                Byte[] CiphertextData = Convert.FromBase64String(EncryptString);
                int MaxBlockSize = RSACryptography.KeySize / 8;    //解密块最大长度限制

                if (CiphertextData.Length <= MaxBlockSize)
                    return Encoder.GetString(RSACryptography.Decrypt(CiphertextData, false));

                using (MemoryStream CrypStream = new MemoryStream(CiphertextData))
                using (MemoryStream PlaiStream = new MemoryStream())
                {
                    Byte[] Buffer = new Byte[MaxBlockSize];
                    int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);

                    while (BlockSize > 0)
                    {
                        Byte[] ToDecrypt = new Byte[BlockSize];
                        Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize);

                        Byte[] Plaintext = RSACryptography.Decrypt(ToDecrypt, false);
                        PlaiStream.Write(Plaintext, 0, Plaintext.Length);

                        BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);
                    }

                    return Encoder.GetString(PlaiStream.ToArray());
                }
            }
        }


  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值