问题:使用OPENSSL生成的公钥和私钥,需要使用RSA算法对AES密钥和参数进行加密、签名,java中可以直接识别pem格式的公钥和私钥文件,但是C#中只能识别XML格式的,所以需要进行转换
注意:pem转XML时。需要依赖一个第三方库,叫BouncyCastle。官网地址:BouncyCastle(如果从官网下载太慢或无法下载可通过百度网盘下载:https://pan.baidu.com/s/1I7URHC7C89MlqT2OfZUSig
提取码:ri2v )
1.公钥pem格式文件转XML
注意:传递的私钥需要剔除开头"-----BEGIN PUBLIC KEY-----“和结尾”-----END PUBLIC KEY-----“以及密文中的”\n"和"\r"
/// <summary>
/// RSA公钥pem-->XML格式转换,
/// </summary>
/// <param name="publicKey">pem公钥</param>
/// <returns></returns>
public static string RSAPublicKey(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;
}
2.私钥pem格式文件转XML
注意:传递的私钥需要剔除开头"-----BEGIN PRIVATE KEY-----“和结尾”-----END PRIVATE KEY-----“以及密文中的”\n"和"\r"
/// <summary>
/// 私钥转XML
/// </summary>
/// <param name="privateJavaKey"></param>
/// <returns></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()));
}
3.RSA算法使用公钥对数据加密
/// <summary>
/// RSA使用公钥对数据加密
/// </summary>
/// <param name="strText">加密数据</param>
/// <param name="strPublicKey">公钥密文</param>
/// <returns></returns>
public static string RSAEncrypt(string strText, string strPublicKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(RSAPublicKey(strPublicKey));
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(strText), false);
return Convert.ToBase64String(cipherbytes);
}
4.RSA算法使用公钥对数据加密
/// <summary>
/// RSA使用私匙对签名内容加签名
/// </summary>
/// <param name="privateKeyCSharp">私钥密文</param>
/// <param name="data">待签名的内容</param>
/// <returns></returns>
public static string RSASignCSharp(string data, string privateKeyCSharp, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(ConvertToXmlPrivateKey(privateKeyCSharp));//加载私钥
var dataBytes = Encoding.GetEncoding(encoding).GetBytes(data);
var HashbyteSignature = rsa.SignData(dataBytes, hashAlgorithm);
return Convert.ToBase64String(HashbyteSignature);
}