SignUtils.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Text;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using Org.BouncyCastle.Crypto;
  6. using Org.BouncyCastle.Crypto.Parameters;
  7. using Org.BouncyCastle.Math;
  8. using Org.BouncyCastle.Utilities.Encoders;
  9. namespace AnHuiMI.Common
  10. {
  11. class SignUtils
  12. {
  13. public static string signSm3WithSm2(string chnlId, string sm4key, string prvkey, string data)
  14. {
  15. ECPrivateKeyParameters privatekeyFromD = GmUtil.GetPrivatekeyFromD(new BigInteger(Convert.FromBase64String(prvkey)));
  16. return Convert.ToBase64String(GmUtil.SignSm3WithSm2(Encoding.UTF8.GetBytes(data), Encoding.UTF8.GetBytes(sm4key), privatekeyFromD));
  17. }
  18. public static bool verifySm3WithSm2(string msg, string sm4key, string signData, string pubKey)
  19. {
  20. byte[] array = Convert.FromBase64String(pubKey);
  21. BitConverter.ToString(array);
  22. AsymmetricKeyParameter publickeyFromXY = GmUtil.GetPublickeyFromXY(array);
  23. byte[] rs = Convert.FromBase64String(signData);
  24. return GmUtil.VerifySm3WithSm2(Encoding.UTF8.GetBytes(msg), Encoding.UTF8.GetBytes(sm4key), rs, publickeyFromXY);
  25. }
  26. public static string getSignText(string chnlId, string sm4key, string data,long ts)
  27. {
  28. JObject jobject = new JObject();
  29. jobject.Add("appId", chnlId);
  30. jobject.Add("data", data);
  31. jobject.Add("encType", "SM4");
  32. jobject.Add("signType", "SM2");
  33. jobject.Add("timestamp", ts); ;
  34. jobject.Add("version", "2.0.1");
  35. string value = StringUtils.SortJson(jobject.ToString());
  36. return StringUtils.Json2sign(value) + "&key=" + sm4key;
  37. }
  38. public static string encryptMsg(string chnlId, string sm4key, string prvkey, string data, ref string rtSignPlain)
  39. {
  40. long ts = StringUtils.CurrentTimeStamp();
  41. string signText = SignUtils.getSignText(chnlId, sm4key, data,ts);
  42. string signData = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
  43. string encData = SignUtils.sm4Encrypt(chnlId, sm4key, data);
  44. JObject jobject = new JObject();
  45. jobject.Add("appId", chnlId);
  46. jobject.Add("encData", encData);
  47. jobject.Add("encType", "SM4");
  48. jobject.Add("signData", signData);
  49. jobject.Add("signType", "SM2");
  50. jobject.Add("timestamp", ts);
  51. jobject.Add("version", "2.0.1");
  52. rtSignPlain = signData;
  53. return jobject.ToString(Formatting.None, null);
  54. }
  55. public static string encryptMsg(string chnlId, string sm4key, string prvkey, string data)
  56. {
  57. long ts = StringUtils.CurrentTimeStamp();
  58. string signText = SignUtils.getSignText(chnlId, sm4key, data, ts);
  59. string value = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
  60. string value2 = SignUtils.sm4Encrypt(chnlId, sm4key, data);
  61. return new JObject
  62. {
  63. {
  64. "appId",
  65. chnlId
  66. },
  67. {
  68. "encData",
  69. value2
  70. },
  71. {
  72. "encType",
  73. "SM4"
  74. },
  75. {
  76. "signData",
  77. value
  78. },
  79. {
  80. "signType",
  81. "SM2"
  82. },
  83. {
  84. "timestamp",
  85. ts
  86. },
  87. {
  88. "version",
  89. "2.0.1"
  90. }
  91. }.ToString(Formatting.None, null);
  92. }
  93. public static string sm4Encrypt(string chnlId, string sm4key, string message)
  94. {
  95. byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
  96. byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
  97. byte[] bytes3 = Encoding.UTF8.GetBytes(message);
  98. string text = Hex.ToHexString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding")).ToUpper();
  99. return Hex.ToHexString(GmUtil.Sm4EncryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), bytes3, "SM4/ECB/PKCS7Padding"));
  100. }
  101. public static string sm4Decrypt(string chnlId, string sm4key, string message)
  102. {
  103. byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
  104. byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
  105. byte[] cipher = Hex.Decode(message);
  106. string text = BitConverter.ToString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding"), 0).Replace("-", string.Empty).ToUpper();
  107. byte[] bytes3 = GmUtil.Sm4DecryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), cipher, "SM4/ECB/PKCS7Padding");
  108. return Encoding.UTF8.GetString(bytes3);
  109. }
  110. }
  111. }