架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 26938|回复: 0

[资料] c# RSA加密解密分段加密和分段解密

[复制链接]
发表于 2016-4-13 19:13:17 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;

  7. namespace YeMao.Common.Security
  8. {
  9.     public static class RSACryptoProvider
  10.     {
  11.         /// <summary>
  12.         /// RSA解密
  13.         /// </summary>
  14.         /// <param name="base64code">需要进行解密的密文字符串</param>
  15.         /// <param name="privateKey">私钥</param>
  16.         /// <returns>解密后的明文</returns>
  17.         public static string Decrypt(string base64code, string privateKey)
  18.         {
  19.             #region 自己加的
  20.             base64code = base64code.Replace(" ", "+");
  21.             int mod4 = base64code.Length % 4;
  22.             if (mod4 > 0)
  23.             {
  24.                 base64code += new string('=', 4 - mod4);
  25.             }
  26.             #endregion
  27.             UnicodeEncoding ByteConverter = new UnicodeEncoding();

  28.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
  29.             RSA.FromXmlString(privateKey);

  30.             byte[] encryptedData;
  31.             byte[] decryptedData;

  32.             encryptedData = Convert.FromBase64String(base64code);

  33.             decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

  34.             return ByteConverter.GetString(decryptedData);
  35.         }

  36.         /// <summary>
  37.         /// RSA分段解密;用于对超长字符串解密
  38.         /// </summary>
  39.         /// <param name="toEncryptString">需要进行解密的字符串</param>
  40.         /// <param name="publickKey">私钥</param>
  41.         /// <returns>解密后的明文</returns>
  42.         public static string SectionDecrypt(string base64code, string privateKey)
  43.         {
  44.             #region 自己加的
  45.             base64code = base64code.Replace(" ", "+");
  46.             int mod4 = base64code.Length % 4;
  47.             if (mod4 > 0)
  48.             {
  49.                 base64code += new string('=', 4 - mod4);
  50.             }
  51.             #endregion
  52.             UnicodeEncoding ByteConverter = new UnicodeEncoding();
  53.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
  54.             RSA.FromXmlString(privateKey);

  55.             Byte[] CiphertextData = Convert.FromBase64String(base64code);

  56.             int MaxBlockSize = RSA.KeySize / 8;

  57.             if (CiphertextData.Length <= MaxBlockSize)
  58.             {
  59.                 byte[] decryptedData;

  60.                 decryptedData = RSADecrypt(CiphertextData, RSA.ExportParameters(true), false);

  61.                 return ByteConverter.GetString(decryptedData);
  62.             }

  63.             MemoryStream CrypStream = new MemoryStream(CiphertextData);

  64.             MemoryStream PlaiStream = new MemoryStream();

  65.             Byte[] Buffer = new Byte[MaxBlockSize];

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

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

  71.                 Byte[] Plaintext = RSADecrypt(ToDecrypt, RSA.ExportParameters(true), false);
  72.                 PlaiStream.Write(Plaintext, 0, Plaintext.Length);

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

  75.             return ByteConverter.GetString(PlaiStream.ToArray());
  76.         }

  77.         /// <summary>
  78.         /// RSA加密
  79.         /// </summary>
  80.         /// <param name="toEncryptString">需要进行加密的字符串</param>
  81.         /// <param name="publicKey">公钥</param>
  82.         /// <returns>加密后的密文</returns>
  83.         public static string Encrypt(string toEncryptString, string publicKey)
  84.         {
  85.             UnicodeEncoding ByteConverter = new UnicodeEncoding();

  86.             byte[] dataToEncrypt = ByteConverter.GetBytes(toEncryptString);

  87.             byte[] encrytedData;

  88.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

  89.             RSA.FromXmlString(publicKey);

  90.             encrytedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

  91.             string base64code = Convert.ToBase64String(encrytedData);

  92.             return base64code;
  93.         }

  94.         /// <summary>
  95.         /// RSA分段加密;用于对超长字符串加密
  96.         /// </summary>
  97.         /// <param name="toEncryptString">需要进行加密的字符串</param>
  98.         /// <param name="publickKey">公钥</param>
  99.         /// <returns>加密后的密文</returns>
  100.         public static string SectionEncrypt(string toEncryptString, string publickKey)
  101.         {
  102.             string base64code = string.Empty;

  103.             UnicodeEncoding ByteConverter = new UnicodeEncoding();

  104.             byte[] dataToEncrypt = ByteConverter.GetBytes(toEncryptString);

  105.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

  106.             RSA.FromXmlString(publickKey);

  107.             int MaxBlockSize = RSA.KeySize / 8 - 11;

  108.             if (dataToEncrypt.Length <= MaxBlockSize)
  109.             {
  110.                 byte[] encrytedData;

  111.                 encrytedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

  112.                 base64code = Convert.ToBase64String(encrytedData);

  113.                 return base64code;
  114.             }

  115.             MemoryStream plaiStream = new MemoryStream(dataToEncrypt);

  116.             MemoryStream CrypStream = new MemoryStream();

  117.             Byte[] Buffer = new Byte[MaxBlockSize];

  118.             int BlockSize = plaiStream.Read(Buffer, 0, MaxBlockSize);

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

  123.                 Byte[] Cryptograph = RSAEncrypt(ToEncrypt, RSA.ExportParameters(false), false);
  124.                 CrypStream.Write(Cryptograph, 0, Cryptograph.Length);

  125.                 BlockSize = plaiStream.Read(Buffer, 0, MaxBlockSize);
  126.             }

  127.             base64code = Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);

  128.             return base64code;
  129.         }


  130.         private static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
  131.         {
  132.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

  133.             RSA.ImportParameters(RSAKeyInfo);

  134.             return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
  135.         }

  136.         private static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
  137.         {
  138.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

  139.             RSA.ImportParameters(RSAKeyInfo);

  140.             return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
  141.         }
  142.         /// <summary>
  143.         /// RSA生成公钥和私钥
  144.         /// </summary>
  145.         /// <returns></returns>
  146.         public static string[] GenerateKeys()
  147.         {
  148.             try
  149.             {
  150.                 string[] sKeys = new String[2];
  151.                 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  152.                 sKeys[0] = rsa.ToXmlString(true);
  153.                 sKeys[1] = rsa.ToXmlString(false);
  154.                 return sKeys;
  155.             }
  156.             catch (Exception)
  157.             {
  158.                 return null;
  159.             }
  160.         }
  161.     }
  162. }
复制代码






上一篇:asp.net获取服务器mac地址
下一篇:.net mvc 一个Action的 HttpGet 和 HttpPost
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-5-6 09:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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