RSA加密解密,本例子是将java代码编写的私钥转换成C#的xml来实现RSA的加密解密操作算法,因为有时对接时,由于公钥和私钥都是java生成的,但是java生成秘钥C#直接是无法使用的,必须需要先通过转换成C#可用xml格式的字符串表示,然后再拿着对应的秘钥去做C#的RSA解密加密操作。
废话不多说,上代码:
public static string RSAEncryptMore(string xmlPublicKey, string m_strEncryptString) { if (string.IsNullOrEmpty(m_strEncryptString)) { return string.Empty; } if (string.IsNullOrEmpty(xmlPublicKey)) { throw new ArgumentException("Invalid Public Key"); } using (var rsaProvider = new RSACryptoServiceProvider()) { var inputBytes = Encoding.UTF8.GetBytes(m_strEncryptString);//有含义的字符串转化为字节流 rsaProvider.FromXmlString(ConvertToXmlPublicJavaKey(xmlPublicKey));//载入公钥 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());//转化为字节流方便传输 } } } /// <summary> /// RSA解密 /// </summary> /// <param name="privateKeyJava"></param> /// <param name="content"></param> /// <returns></returns> public static string DecryptJava(string privateKeyJava, string data, string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(ConvertToXmlPrivateKey(privateKeyJava)); cipherbytes = rsa.Decrypt(Convert.FromBase64String(data), false); return Encoding.GetEncoding(encoding).GetString(cipherbytes); } /// <summary> /// 把java的公钥转换成.net的xml格式 /// </summary> /// <param name="publicJavaKey">java提供的第三方公钥</param> /// <returns></returns> public static string ConvertToXmlPublicJavaKey(string publicJavaKey) { RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey)); string xmlpublicKey = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); return xmlpublicKey; } // <summary> /// 把java的私钥转换成.net的xml格式 /// </summary> /// <param name="privateJavaKey"></param> /// <returns></returns> public static string ConvertToXmlPrivateKey(string privateJavaKey) { RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey)); string xmlPrivateKey = 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())); return xmlPrivateKey; } }