SM2Util.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using Org.BouncyCastle.Crypto;
  2. using Org.BouncyCastle.Crypto.Parameters;
  3. using Org.BouncyCastle.Math;
  4. using Org.BouncyCastle.Math.EC;
  5. using Org.BouncyCastle.Utilities.Encoders;
  6. namespace Admin.NET.Core;
  7. /// <summary>
  8. /// SM2工具类
  9. /// </summary>
  10. public class SM2Util
  11. {
  12. /// <summary>
  13. /// 加密
  14. /// </summary>
  15. /// <param name="publicKey_string"></param>
  16. /// <param name="data_string"></param>
  17. /// <returns></returns>
  18. public static string Encrypt(string publicKey_string, string data_string)
  19. {
  20. var publicKey = Hex.Decode(publicKey_string);
  21. var data = Encoding.UTF8.GetBytes(data_string);
  22. return Encrypt(publicKey, data);
  23. }
  24. /// <summary>
  25. /// 解密
  26. /// </summary>
  27. /// <param name="privateKey_string"></param>
  28. /// <param name="encryptedData_string"></param>
  29. /// <returns></returns>
  30. public static string Decrypt(string privateKey_string, string encryptedData_string)
  31. {
  32. var privateKey = Hex.Decode(privateKey_string);
  33. var encryptedData = Hex.Decode(encryptedData_string);
  34. var de_str = SM2Util.Decrypt(privateKey, encryptedData);
  35. string plainText = Encoding.UTF8.GetString(de_str);
  36. return plainText;
  37. }
  38. public static void GenerateKeyPair()
  39. {
  40. SM2 sm2 = SM2.Instance;
  41. AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair();
  42. ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private;
  43. ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public;
  44. BigInteger privateKey = ecpriv.D;
  45. ECPoint publicKey = ecpub.Q;
  46. Console.Out.WriteLine("公钥: " + Encoding.ASCII.GetString(Hex.Encode(publicKey.GetEncoded())).ToUpper());
  47. Console.Out.WriteLine("私钥: " + Encoding.ASCII.GetString(Hex.Encode(privateKey.ToByteArray())).ToUpper());
  48. }
  49. public static string Encrypt(byte[] publicKey, byte[] data)
  50. {
  51. if (null == publicKey || publicKey.Length == 0)
  52. {
  53. return null;
  54. }
  55. if (data == null || data.Length == 0)
  56. {
  57. return null;
  58. }
  59. byte[] source = new byte[data.Length];
  60. Array.Copy(data, 0, source, 0, data.Length);
  61. var cipher = new Cipher();
  62. SM2 sm2 = SM2.Instance;
  63. ECPoint userKey = sm2.ecc_curve.DecodePoint(publicKey);
  64. ECPoint c1 = cipher.Init_enc(sm2, userKey);
  65. cipher.Encrypt(source);
  66. byte[] c3 = new byte[32];
  67. cipher.Dofinal(c3);
  68. string sc1 = Encoding.ASCII.GetString(Hex.Encode(c1.GetEncoded()));
  69. string sc2 = Encoding.ASCII.GetString(Hex.Encode(source));
  70. string sc3 = Encoding.ASCII.GetString(Hex.Encode(c3));
  71. return (sc1 + sc2 + sc3).ToUpper();
  72. }
  73. public static byte[] Decrypt(byte[] privateKey, byte[] encryptedData)
  74. {
  75. if (null == privateKey || privateKey.Length == 0)
  76. {
  77. return null;
  78. }
  79. if (encryptedData == null || encryptedData.Length == 0)
  80. {
  81. return null;
  82. }
  83. string data = Encoding.ASCII.GetString(Hex.Encode(encryptedData));
  84. byte[] c1Bytes = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(0, 130)));
  85. int c2Len = encryptedData.Length - 97;
  86. byte[] c2 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130, 2 * c2Len)));
  87. byte[] c3 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130 + 2 * c2Len, 64)));
  88. SM2 sm2 = SM2.Instance;
  89. var userD = new BigInteger(1, privateKey);
  90. ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes);
  91. var cipher = new Cipher();
  92. cipher.Init_dec(userD, c1);
  93. cipher.Decrypt(c2);
  94. cipher.Dofinal(c3);
  95. return c2;
  96. }
  97. //[STAThread]
  98. //public static void Main()
  99. //{
  100. // GenerateKeyPair();
  101. // String plainText = "ererfeiisgod";
  102. // byte[] sourceData = Encoding.Default.GetBytes(plainText);
  103. // //下面的秘钥可以使用generateKeyPair()生成的秘钥内容
  104. // // 国密规范正式私钥
  105. // String prik = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";
  106. // // 国密规范正式公钥
  107. // String pubk = "04F6E0C3345AE42B51E06BF50B98834988D54EBC7460FE135A48171BC0629EAE205EEDE253A530608178A98F1E19BB737302813BA39ED3FA3C51639D7A20C7391A";
  108. // System.Console.Out.WriteLine("加密: ");
  109. // String cipherText = SM2Utils.Encrypt(Hex.Decode(pubk), sourceData);
  110. // System.Console.Out.WriteLine(cipherText);
  111. // System.Console.Out.WriteLine("解密: ");
  112. // plainText = Encoding.Default.GetString(SM2Utils.Decrypt(Hex.Decode(prik), Hex.Decode(cipherText)));
  113. // System.Console.Out.WriteLine(plainText);
  114. // Console.ReadLine();
  115. //}
  116. /// <summary>
  117. /// SM2加密
  118. /// </summary>
  119. /// <param name="plainText">明文</param>
  120. /// <returns>密文</returns>
  121. public static String 加密(String plainText)
  122. {
  123. // 国密规范正式公钥
  124. String pubk = "04F6E0C3345AE42B51E06BF50B98834988D54EBC7460FE135A48171BC0629EAE205EEDE253A530608178A98F1E19BB737302813BA39ED3FA3C51639D7A20C7391A";
  125. byte[] sourceData = Encoding.Default.GetBytes(plainText);
  126. String cipherText = SM2Util.Encrypt(Hex.Decode(pubk), sourceData);
  127. return cipherText;
  128. }
  129. /// <summary>
  130. /// SM2解密
  131. /// </summary>
  132. /// <param name="cipherText">密文</param>
  133. /// <returns>明文</returns>
  134. public static string 解密(String cipherText)
  135. {
  136. // 国密规范正式私钥
  137. String prik = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";
  138. String plainText = Encoding.Default.GetString(SM2Util.Decrypt(Hex.Decode(prik), Hex.Decode(cipherText)));
  139. return plainText;
  140. }
  141. }