RsaUtils.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. using Org.BouncyCastle.Crypto.Parameters;
  5. using Org.BouncyCastle.Security;
  6. namespace BasePaySdk
  7. {
  8. /// <summary>
  9. /// Rsa签名工具类
  10. /// </summary>
  11. public class RsaUtils
  12. {
  13. /// <summary>
  14. /// 使用指定私钥进行报文签名
  15. /// </summary>
  16. ///
  17. /// <param name="signaturePrivateKey">签名私钥</param>
  18. /// <param name="signatureData">待签名数据</param>
  19. /// <param name="hashAlgorithm">签名方法,默认SHA256</param>
  20. /// <param name="encoding">字符集,默认UTF-8</param>
  21. ///
  22. /// <returns>签名</returns>
  23. ///
  24. public static string sign(string signaturePrivateKey, string signatureData, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
  25. {
  26. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  27. // var privateJavaKey = signaturePrivateKey;
  28. // var privateCSharpKey = RSAPrivateKeyJava2DotNet(privateJavaKey);
  29. // rsa.FromXmlString(privateCSharpKey);
  30. rsa.FromPrivateKeyJavaString(signaturePrivateKey);
  31. byte[] signatureBytes = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(signatureData), hashAlgorithm);
  32. return Convert.ToBase64String(signatureBytes);
  33. }
  34. private static string RSAPrivateKeyJava2DotNet(string privateKey)
  35. {
  36. byte[] keyInfoByte = Convert.FromBase64String(privateKey);
  37. RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(keyInfoByte);
  38. 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>",
  39. Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
  40. Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
  41. Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
  42. Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
  43. Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
  44. Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
  45. Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
  46. Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
  47. }
  48. /// <summary>
  49. /// 使用指定公钥进行报文签名验证
  50. /// </summary>
  51. ///
  52. /// <param name="publicKey">公钥</param>
  53. /// <param name="signature">签名串</param>
  54. /// <param name="content">签名原文</param>
  55. /// <param name="hashAlgorithm">签名方法,默认SHA256</param>
  56. /// <param name="encoding">字符集,默认UTF-8</param>
  57. ///
  58. /// <returns>验签结果</returns>
  59. ///
  60. public static bool verfySign(string publicKey, string signature, string content, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
  61. {
  62. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  63. //导入公钥,准备验证签名
  64. rsa.FromPublicKeyJavaString(publicKey);
  65. //返回数据验证结果
  66. byte[] Data = Encoding.GetEncoding(encoding).GetBytes(content);
  67. byte[] rgbSignature = Convert.FromBase64String(signature);
  68. return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);
  69. }
  70. }
  71. public static class RSAExtensions {
  72. public static void FromPublicKeyJavaString(this RSA rsa, string publicJavaKey)
  73. {
  74. RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey));
  75. string xmlpublicKey = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
  76. Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
  77. Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
  78. rsa.FromXmlString(xmlpublicKey);
  79. }
  80. public static void FromPrivateKeyJavaString(this RSA rsa, string privateKey)
  81. {
  82. byte[] keyInfoByte = Convert.FromBase64String(privateKey);
  83. RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(keyInfoByte);
  84. 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>",
  85. Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
  86. Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
  87. Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
  88. Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
  89. Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
  90. Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
  91. Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
  92. Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
  93. rsa.FromXmlString(xmlPrivateKey);
  94. }
  95. }
  96. }