using System; using System.Security.Cryptography; using System.Text; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; namespace BasePaySdk { /// /// Rsa签名工具类 /// public class RsaUtils { /// /// 使用指定私钥进行报文签名 /// /// /// 签名私钥 /// 待签名数据 /// 签名方法,默认SHA256 /// 字符集,默认UTF-8 /// /// 签名 /// public static string sign(string signaturePrivateKey, string signatureData, string hashAlgorithm = "SHA256", string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); // var privateJavaKey = signaturePrivateKey; // var privateCSharpKey = RSAPrivateKeyJava2DotNet(privateJavaKey); // rsa.FromXmlString(privateCSharpKey); rsa.FromPrivateKeyJavaString(signaturePrivateKey); byte[] signatureBytes = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(signatureData), hashAlgorithm); return Convert.ToBase64String(signatureBytes); } private static string RSAPrivateKeyJava2DotNet(string privateKey) { byte[] keyInfoByte = Convert.FromBase64String(privateKey); RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(keyInfoByte); return string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}
", 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())); } /// /// 使用指定公钥进行报文签名验证 /// /// /// 公钥 /// 签名串 /// 签名原文 /// 签名方法,默认SHA256 /// 字符集,默认UTF-8 /// /// 验签结果 /// public static bool verfySign(string publicKey, string signature, string content, string hashAlgorithm = "SHA256", string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //导入公钥,准备验证签名 rsa.FromPublicKeyJavaString(publicKey); //返回数据验证结果 byte[] Data = Encoding.GetEncoding(encoding).GetBytes(content); byte[] rgbSignature = Convert.FromBase64String(signature); return rsa.VerifyData(Data, hashAlgorithm, rgbSignature); } } public static class RSAExtensions { public static void FromPublicKeyJavaString(this RSA rsa, string publicJavaKey) { RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey)); string xmlpublicKey = string.Format("{0}{1}", Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); rsa.FromXmlString(xmlpublicKey); } public static void FromPrivateKeyJavaString(this RSA rsa, string privateKey) { byte[] keyInfoByte = Convert.FromBase64String(privateKey); RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(keyInfoByte); string xmlPrivateKey = string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}
", 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())); rsa.FromXmlString(xmlPrivateKey); } } }