SignUtils.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Text;
  3. using GMCrypto.Lib;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. using Org.BouncyCastle.Crypto;
  7. using Org.BouncyCastle.Crypto.Parameters;
  8. using Org.BouncyCastle.Math;
  9. using Org.BouncyCastle.Utilities.Encoders;
  10. namespace AnHuiMI.Common
  11. {
  12. class SignUtils
  13. {
  14. public static string signSm3WithSm2(string sm4key, string prvkey, string data)
  15. {
  16. ECPrivateKeyParameters privatekeyFromD = GmUtil.GetPrivatekeyFromD(new BigInteger(Convert.FromBase64String(prvkey)));
  17. return Convert.ToBase64String(GmUtil.SignSm3WithSm2(Encoding.UTF8.GetBytes(data), Encoding.UTF8.GetBytes(sm4key), privatekeyFromD));
  18. }
  19. public static bool verifySm3WithSm2(string msg, string sm4key, string signData, string pubKey)
  20. {
  21. byte[] array = Convert.FromBase64String(pubKey);
  22. BitConverter.ToString(array);
  23. AsymmetricKeyParameter publickeyFromXY = GmUtil.GetPublickeyFromXY(array);
  24. byte[] rs = Convert.FromBase64String(signData);
  25. return GmUtil.VerifySm3WithSm2(Encoding.UTF8.GetBytes(msg), Encoding.UTF8.GetBytes(sm4key), rs, publickeyFromXY);
  26. }
  27. public static long CurrentTimeStamp(bool isMinseconds = false)
  28. {
  29. TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  30. return Convert.ToInt64(isMinseconds ? timeSpan.TotalMilliseconds : timeSpan.TotalSeconds);
  31. }
  32. public static string encryptMsg(string appId, string appSecret, string prvkey, string data, ref string rtSignPlain)
  33. {
  34. string ts = Convert.ToString(CurrentTimeStamp());
  35. JObject jobject = new JObject();
  36. jobject.Add("appId", appId);
  37. jobject.Add("data", JObject.Parse(data));
  38. jobject.Add("encType", "SM4");
  39. jobject.Add("signType", "SM2");
  40. jobject.Add("timestamp", ts); ;
  41. jobject.Add("version", "2.0.1");
  42. string signData = SMUtil.sign(jobject, appSecret, prvkey);
  43. string encData = SMUtil.encrypt(data, appId, appSecret);
  44. jobject.Add("encData", encData);
  45. jobject.Add("signData", signData);
  46. // 删除明文
  47. jobject.Remove("data");
  48. rtSignPlain = signData;
  49. return jobject.ToString(Formatting.None, null);
  50. }
  51. public static string sm4Encrypt(string chnlId, string sm4key, string message)
  52. {
  53. byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
  54. byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
  55. byte[] bytes3 = Encoding.UTF8.GetBytes(message);
  56. string text = Hex.ToHexString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding")).ToUpper();
  57. return Hex.ToHexString(GmUtil.Sm4EncryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), bytes3, "SM4/ECB/PKCS7Padding"));
  58. }
  59. public static string sm4Decrypt(string chnlId, string sm4key, string message)
  60. {
  61. byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
  62. byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
  63. byte[] cipher = Hex.Decode(message);
  64. string text = BitConverter.ToString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding"), 0).Replace("-", string.Empty).ToUpper();
  65. byte[] bytes3 = GmUtil.Sm4DecryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), cipher, "SM4/ECB/PKCS7Padding");
  66. return Encoding.UTF8.GetString(bytes3);
  67. }
  68. }
  69. }