.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());
}
}
}