SM2Util.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. using Org.BouncyCastle.Crypto;
  10. using Org.BouncyCastle.Crypto.Parameters;
  11. using Org.BouncyCastle.Math;
  12. using Org.BouncyCastle.Math.EC;
  13. using Org.BouncyCastle.Utilities.Encoders;
  14. namespace Admin.NET.Core;
  15. /// <summary>
  16. /// SM2工具类
  17. /// </summary>
  18. public class SM2Util
  19. {
  20. /// <summary>
  21. /// 加密
  22. /// </summary>
  23. /// <param name="publicKey_string"></param>
  24. /// <param name="data_string"></param>
  25. /// <returns></returns>
  26. public static string Encrypt(string publicKey_string, string data_string)
  27. {
  28. var publicKey = Hex.Decode(publicKey_string);
  29. var data = Encoding.UTF8.GetBytes(data_string);
  30. return Encrypt(publicKey, data);
  31. }
  32. /// <summary>
  33. /// 解密
  34. /// </summary>
  35. /// <param name="privateKey_string"></param>
  36. /// <param name="encryptedData_string"></param>
  37. /// <returns></returns>
  38. public static string Decrypt(string privateKey_string, string encryptedData_string)
  39. {
  40. var privateKey = Hex.Decode(privateKey_string);
  41. var encryptedData = Hex.Decode(encryptedData_string);
  42. var de_str = SM2Util.Decrypt(privateKey, encryptedData);
  43. string plainText = Encoding.UTF8.GetString(de_str);
  44. return plainText;
  45. }
  46. public static void GenerateKeyPair()
  47. {
  48. SM2 sm2 = SM2.Instance;
  49. AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair();
  50. ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private;
  51. ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public;
  52. BigInteger privateKey = ecpriv.D;
  53. ECPoint publicKey = ecpub.Q;
  54. Console.Out.WriteLine("公钥: " + Encoding.ASCII.GetString(Hex.Encode(publicKey.GetEncoded())).ToUpper());
  55. Console.Out.WriteLine("私钥: " + Encoding.ASCII.GetString(Hex.Encode(privateKey.ToByteArray())).ToUpper());
  56. }
  57. public static string Encrypt(byte[] publicKey, byte[] data)
  58. {
  59. if (null == publicKey || publicKey.Length == 0)
  60. {
  61. return null;
  62. }
  63. if (data == null || data.Length == 0)
  64. {
  65. return null;
  66. }
  67. byte[] source = new byte[data.Length];
  68. Array.Copy(data, 0, source, 0, data.Length);
  69. var cipher = new Cipher();
  70. SM2 sm2 = SM2.Instance;
  71. ECPoint userKey = sm2.ecc_curve.DecodePoint(publicKey);
  72. ECPoint c1 = cipher.Init_enc(sm2, userKey);
  73. cipher.Encrypt(source);
  74. byte[] c3 = new byte[32];
  75. cipher.Dofinal(c3);
  76. string sc1 = Encoding.ASCII.GetString(Hex.Encode(c1.GetEncoded()));
  77. string sc2 = Encoding.ASCII.GetString(Hex.Encode(source));
  78. string sc3 = Encoding.ASCII.GetString(Hex.Encode(c3));
  79. return (sc1 + sc2 + sc3).ToUpper();
  80. }
  81. public static byte[] Decrypt(byte[] privateKey, byte[] encryptedData)
  82. {
  83. if (null == privateKey || privateKey.Length == 0)
  84. {
  85. return null;
  86. }
  87. if (encryptedData == null || encryptedData.Length == 0)
  88. {
  89. return null;
  90. }
  91. string data = Encoding.ASCII.GetString(Hex.Encode(encryptedData));
  92. byte[] c1Bytes = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(0, 130)));
  93. int c2Len = encryptedData.Length - 97;
  94. byte[] c2 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130, 2 * c2Len)));
  95. byte[] c3 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130 + 2 * c2Len, 64)));
  96. SM2 sm2 = SM2.Instance;
  97. var userD = new BigInteger(1, privateKey);
  98. ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes);
  99. var cipher = new Cipher();
  100. cipher.Init_dec(userD, c1);
  101. cipher.Decrypt(c2);
  102. cipher.Dofinal(c3);
  103. return c2;
  104. }
  105. //[STAThread]
  106. //public static void Main()
  107. //{
  108. // GenerateKeyPair();
  109. // String plainText = "ererfeiisgod";
  110. // byte[] sourceData = Encoding.Default.GetBytes(plainText);
  111. // //下面的秘钥可以使用generateKeyPair()生成的秘钥内容
  112. // // 国密规范正式私钥
  113. // String prik = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";
  114. // // 国密规范正式公钥
  115. // String pubk = "04F6E0C3345AE42B51E06BF50B98834988D54EBC7460FE135A48171BC0629EAE205EEDE253A530608178A98F1E19BB737302813BA39ED3FA3C51639D7A20C7391A";
  116. // System.Console.Out.WriteLine("加密: ");
  117. // String cipherText = SM2Utils.Encrypt(Hex.Decode(pubk), sourceData);
  118. // System.Console.Out.WriteLine(cipherText);
  119. // System.Console.Out.WriteLine("解密: ");
  120. // plainText = Encoding.Default.GetString(SM2Utils.Decrypt(Hex.Decode(prik), Hex.Decode(cipherText)));
  121. // System.Console.Out.WriteLine(plainText);
  122. // Console.ReadLine();
  123. //}
  124. /// <summary>
  125. /// SM2加密
  126. /// </summary>
  127. /// <param name="plainText">明文</param>
  128. /// <returns>密文</returns>
  129. public static String 加密(String plainText)
  130. {
  131. // 国密规范正式公钥
  132. String pubk = "04F6E0C3345AE42B51E06BF50B98834988D54EBC7460FE135A48171BC0629EAE205EEDE253A530608178A98F1E19BB737302813BA39ED3FA3C51639D7A20C7391A";
  133. byte[] sourceData = Encoding.Default.GetBytes(plainText);
  134. String cipherText = SM2Util.Encrypt(Hex.Decode(pubk), sourceData);
  135. return cipherText;
  136. }
  137. /// <summary>
  138. /// SM2解密
  139. /// </summary>
  140. /// <param name="cipherText">密文</param>
  141. /// <returns>明文</returns>
  142. public static string 解密(String cipherText)
  143. {
  144. // 国密规范正式私钥
  145. String prik = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";
  146. String plainText = Encoding.Default.GetString(SM2Util.Decrypt(Hex.Decode(prik), Hex.Decode(cipherText)));
  147. return plainText;
  148. }
  149. }