SM2Encryptor.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using Org.BouncyCastle.Crypto.Parameters;
  3. using Org.BouncyCastle.Crypto;
  4. using System.Text;
  5. using Org.BouncyCastle.Crypto.Engines;
  6. using Org.BouncyCastle.Crypto.Signers;
  7. using Org.BouncyCastle.Security;
  8. namespace PaySharp.Alipay.Util.Asymmetric
  9. {
  10. /// <summary>
  11. /// 国密SM2算法(ECC算法)加密器
  12. /// 签名部分采用SM3算法进行摘要计算
  13. /// </summary>
  14. public class SM2Encryptor : BaseAsymmetricEncryptor
  15. {
  16. /// <summary>
  17. /// SM2算法默认用户ID,目前开放平台不会使用非默认用户ID
  18. /// </summary>
  19. public const string DEFAULT_USER_ID = "1234567812345678";
  20. protected override string GetAsymmetricType()
  21. {
  22. return "SM2";
  23. }
  24. protected override string DoDecrypt(string cipherTextBase64, string charset, string privateKey)
  25. {
  26. //加载私钥参数
  27. ICipherParameters cipherParams = BuildPrivateKeyParams(privateKey).Parameters;
  28. //初始化SM2算法引擎
  29. SM2Engine sm2Engine = new SM2Engine();
  30. sm2Engine.Init(false, cipherParams);
  31. //对输入密文进行解密
  32. byte[] input = Convert.FromBase64String(cipherTextBase64);
  33. byte[] output = sm2Engine.ProcessBlock(input, 0, input.Length);
  34. //将解密后的明文按指定字符集编码后返回
  35. return Encoding.GetEncoding(charset).GetString(output);
  36. }
  37. protected override string DoEncrypt(string plainText, string charset, string publicKey)
  38. {
  39. //加载公钥参数
  40. ICipherParameters cipherParams = BuildPublickKeyParams(publicKey).Parameters;
  41. ParametersWithRandom parametersWithRandom = new ParametersWithRandom(cipherParams);
  42. //初始化SM2算法引擎
  43. SM2Engine sm2Engine = new SM2Engine();
  44. sm2Engine.Init(true, parametersWithRandom);
  45. //对输入明文进行加密
  46. byte[] input = Encoding.GetEncoding(charset).GetBytes(plainText);
  47. byte[] output = sm2Engine.ProcessBlock(input, 0, input.Length);
  48. //将密文Base64编码后返回
  49. return Convert.ToBase64String(output);
  50. }
  51. protected override string DoSign(string content, string charset, string privateKey)
  52. {
  53. //加载私钥参数
  54. ParametersWithID parametersWithID = BuildPrivateKeyParams(privateKey);
  55. //加载签名器
  56. SM2Signer signer = new SM2Signer();
  57. signer.Init(true, parametersWithID);
  58. //向签名器中输入原文
  59. byte[] input = Encoding.GetEncoding(charset).GetBytes(content);
  60. signer.BlockUpdate(input, 0, input.Length);
  61. //将签名结果转换为Base64
  62. return Convert.ToBase64String(signer.GenerateSignature());
  63. }
  64. protected override bool DoVerify(string content, string charset, string publicKey, string sign)
  65. {
  66. //加载公钥参数
  67. ParametersWithID parametersWithID = BuildPublickKeyParams(publicKey);
  68. //加载签名器
  69. SM2Signer signer = new SM2Signer();
  70. signer.Init(false, parametersWithID);
  71. //向签名器中输入原文
  72. byte[] input = Encoding.GetEncoding(charset).GetBytes(content);
  73. signer.BlockUpdate(input, 0, input.Length);
  74. //传入指定签名串进行验签并返回结果
  75. return signer.VerifySignature(Convert.FromBase64String(sign));
  76. }
  77. private ParametersWithID BuildPrivateKeyParams(string privateKey)
  78. {
  79. AsymmetricKeyParameter key = PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
  80. ParametersWithID parametersWithID = new ParametersWithID(key, Encoding.UTF8.GetBytes(DEFAULT_USER_ID));
  81. return parametersWithID;
  82. }
  83. private static ParametersWithID BuildPublickKeyParams(string publicKey)
  84. {
  85. AsymmetricKeyParameter key = PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
  86. ParametersWithID parametersWithID = new ParametersWithID(key, Encoding.UTF8.GetBytes(DEFAULT_USER_ID));
  87. return parametersWithID;
  88. }
  89. }
  90. }