RSASignHelper.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. 
  2. using System;
  3. using System.Text;
  4. using Org.BouncyCastle.Crypto.Parameters;
  5. using Org.BouncyCastle.Security;
  6. namespace MySystem
  7. {
  8. public class RSASignHelper
  9. {
  10. public readonly static RSASignHelper Instance = new RSASignHelper();
  11. private RSASignHelper()
  12. {
  13. }
  14. /// <summary>
  15. /// RSA签名
  16. /// </summary>
  17. /// <param name="content">数据</param>
  18. /// <param name="privateKey">RSA密钥</param>
  19. /// <returns></returns>
  20. public string RsaSign(string content, string privateKey)
  21. {
  22. var signer = SignerUtilities.GetSigner("SHA1withRSA");
  23. //将java格式的rsa密钥转换成.net格式
  24. var privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
  25. signer.Init(true, privateKeyParam);
  26. var plainBytes = Encoding.UTF8.GetBytes(content);
  27. signer.BlockUpdate(plainBytes, 0, plainBytes.Length);
  28. var signBytes = signer.GenerateSignature();
  29. return ByteToHexStr(signBytes);
  30. }
  31. /// <summary>
  32. /// RSA验签
  33. /// </summary>
  34. /// <param name="content">内容</param>
  35. /// <param name="publicKey">RSA公钥</param>
  36. /// <param name="signData">签名字段</param>
  37. /// <returns></returns>
  38. public bool VerifySign(string content, string publicKey, string signData)
  39. {
  40. try
  41. {
  42. var signer = SignerUtilities.GetSigner("SHA1withRSA");
  43. var publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(StrToToHexByte(publicKey));
  44. signer.Init(false, publicKeyParam);
  45. var signBytes = StrToToHexByte(signData);
  46. var plainBytes = Encoding.UTF8.GetBytes(content);
  47. signer.BlockUpdate(plainBytes, 0, plainBytes.Length);
  48. var ret = signer.VerifySignature(signBytes);
  49. return ret;
  50. }
  51. catch (Exception ex)
  52. {
  53. return false;
  54. }
  55. }
  56. /// <summary>
  57. /// 字符串转16进制字节数组
  58. /// </summary>
  59. /// <param name="hexString"></param>
  60. /// <returns></returns>
  61. private byte[] StrToToHexByte(string hexString)
  62. {
  63. hexString = hexString.Replace(" ", "");
  64. if ((hexString.Length % 2) != 0)
  65. hexString += " ";
  66. byte[] returnBytes = new byte[hexString.Length / 2];
  67. for (int i = 0; i < returnBytes.Length; i++)
  68. returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
  69. return returnBytes;
  70. }
  71. /// <summary>
  72. /// 字节数组转16进制字符串
  73. /// </summary>
  74. /// <param name="bytes"></param>
  75. /// <returns></returns>
  76. public string ByteToHexStr(byte[] bytes)
  77. {
  78. string returnStr = "";
  79. if (bytes != null)
  80. {
  81. for (int i = 0; i < bytes.Length; i++)
  82. {
  83. returnStr += bytes[i].ToString("X2");
  84. }
  85. }
  86. return returnStr;
  87. }
  88. }
  89. }