BaseAsymmetricEncryptor.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. namespace PaySharp.Alipay.Util.Asymmetric
  3. {
  4. /// <summary>
  5. /// 非对称加密算法
  6. /// </summary>
  7. public abstract class BaseAsymmetricEncryptor : IAsymmetricEncryptor
  8. {
  9. /// <summary>
  10. /// 默认字符集编码。现在都推荐使用UTF-8,之前默认是GBK,保持向下兼容性
  11. /// </summary>
  12. private static readonly string DEFAULT_CHARSET = "GBK";
  13. public string Decrypt(string cipherTextBase64, string charset, string privateKey)
  14. {
  15. try
  16. {
  17. ArgumentValidator.CheckNotNull(cipherTextBase64, "密文不可为Null");
  18. ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(privateKey), "私钥不可为空");
  19. if (String.IsNullOrEmpty(charset))
  20. {
  21. charset = DEFAULT_CHARSET;
  22. }
  23. return DoDecrypt(cipherTextBase64, charset, privateKey);
  24. }
  25. catch (Exception ex)
  26. {
  27. String errorMessage = GetAsymmetricType() + "非对称解密遭遇异常,请检查私钥格式是否正确。" + ex.Message +
  28. " cipherTextBase64=" + cipherTextBase64 + ",charset=" + charset + ",privateKeySize=" + privateKey.Length;
  29. Console.WriteLine(errorMessage);
  30. throw new Exception(errorMessage, ex);
  31. }
  32. }
  33. public string Encrypt(string plainText, string charset, string publicKey)
  34. {
  35. try
  36. {
  37. ArgumentValidator.CheckNotNull(plainText, "密文不可为Null");
  38. ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(publicKey), "公钥不可为空");
  39. if (String.IsNullOrEmpty(charset))
  40. {
  41. charset = DEFAULT_CHARSET;
  42. }
  43. return DoEncrypt(plainText, charset, publicKey);
  44. }
  45. catch (Exception ex)
  46. {
  47. String errorMessage = GetAsymmetricType() + "非对称解密遭遇异常,请检查公钥格式是否正确。" + ex.Message +
  48. " plainText=" + plainText + ",charset=" + charset + ",publicKey=" + publicKey;
  49. Console.WriteLine(errorMessage);
  50. throw new Exception(errorMessage, ex);
  51. }
  52. }
  53. public string Sign(string content, string charset, string privateKey)
  54. {
  55. try
  56. {
  57. ArgumentValidator.CheckNotNull(content, "待签名内容不可为Null");
  58. ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(privateKey), "私钥不可为空");
  59. if (String.IsNullOrEmpty(charset))
  60. {
  61. charset = DEFAULT_CHARSET;
  62. }
  63. return DoSign(content, charset, privateKey);
  64. }
  65. catch (Exception ex)
  66. {
  67. String errorMessage = GetAsymmetricType() + "签名遭遇异常,请检查私钥格式是否正确。" + ex.Message +
  68. " content=" + content + ",charset=" + charset + ",privateKeySize=" + privateKey.Length;
  69. Console.WriteLine(errorMessage);
  70. throw new Exception(errorMessage, ex);
  71. }
  72. }
  73. public bool Verify(string content, string charset, string publicKey, string sign)
  74. {
  75. try
  76. {
  77. ArgumentValidator.CheckNotNull(content, "待验签内容不可为Null");
  78. ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(publicKey), "公钥不可为空");
  79. ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(sign), "签名串不可为空");
  80. if (String.IsNullOrEmpty(charset))
  81. {
  82. charset = DEFAULT_CHARSET;
  83. }
  84. return DoVerify(content, charset, publicKey, sign);
  85. }
  86. catch (Exception ex)
  87. {
  88. String errorMessage = GetAsymmetricType() + "验签遭遇异常,请检查公钥格式是否正确。" + ex.Message +
  89. " content=" + content + ",charset=" + charset + ",publicKey=" + publicKey + ",sign=" + sign;
  90. Console.WriteLine(errorMessage);
  91. throw new Exception(errorMessage, ex);
  92. }
  93. }
  94. protected abstract string DoDecrypt(string cipherTextBase64, string charset, string privateKey);
  95. protected abstract string DoEncrypt(string plainText, string charset, string publicKey);
  96. protected abstract string DoSign(string content, string charset, string privateKey);
  97. protected abstract bool DoVerify(string content, string charset, string publicKey, string sign);
  98. protected abstract string GetAsymmetricType();
  99. }
  100. }