远方蔚蓝
一刹那情真,相逢不如不见

文章数量 130

访问次数 611590

运行天数 2128

最近活跃 2026-08-05 15:50:46

进入后台管理系统

java使用SM2加解密及前端加密后端解密


加密工具类1

1、实现前端加密,后端解密,前端需要引入js文件

  1. <script src="/business/libs/crypto-js.js"></script>
  2. // js调用方式
  3. var encryptData = sm2Encrypt('明文', '公钥', 0);

2、后端SM2生成公私钥及解密

  1. package wst.st.site.tools;
  2. import java.math.BigInteger;
  3. import java.nio.charset.StandardCharsets;
  4. import java.security.SecureRandom;
  5. import org.apache.commons.codec.binary.Base64;
  6. import org.bouncycastle.asn1.gm.GMNamedCurves;
  7. import org.bouncycastle.asn1.x9.X9ECParameters;
  8. import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
  9. import org.bouncycastle.crypto.engines.SM2Engine;
  10. import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
  11. import org.bouncycastle.crypto.params.ECDomainParameters;
  12. import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
  13. import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
  14. import org.bouncycastle.crypto.params.ECPublicKeyParameters;
  15. import org.bouncycastle.crypto.params.ParametersWithRandom;
  16. import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
  17. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  18. import org.bouncycastle.jce.spec.ECParameterSpec;
  19. import org.bouncycastle.jce.spec.ECPrivateKeySpec;
  20. import org.bouncycastle.math.ec.ECPoint;
  21. import org.bouncycastle.util.encoders.Hex;
  22. import wst.st.site.constant.SiteWebConstant;
  23. /**
  24. * SM2工具类
  25. *
  26. * @author wst 2023年8月21日 上午10:32:33
  27. *
  28. */
  29. public class SM2Util {
  30. public static void main(String[] args) throws Exception {
  31. }
  32. /**
  33. * 生成密钥
  34. *
  35. * @author wst 2023年8月21日 上午10:37:37
  36. */
  37. public static void getPKs() {
  38. try {
  39. X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
  40. ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(),
  41. sm2ECParameters.getG(), sm2ECParameters.getN());
  42. ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
  43. keyPairGenerator
  44. .init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
  45. AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
  46. // 私钥,16进制格式,自己保存
  47. BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
  48. String privateKeyHex = privatekey.toString(16);
  49. System.out.println("private Key :" + privateKeyHex);
  50. // 公钥,16进制格式,发给前端
  51. ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
  52. String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
  53. System.out.println("public Key :" + publicKeyHex);
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. /**
  59. * 解密,前端登录信息解码及解码
  60. *
  61. * @author wst 2024年9月12日 下午1:41:47
  62. * @param cipherData
  63. * @return
  64. */
  65. public static String decrypt(String cipherData) {
  66. // 得到明文
  67. String data = null;
  68. try {
  69. byte[] cipherDataByte = Hex.decode(cipherData);
  70. // sm2私钥
  71. BigInteger privateKeyD = new BigInteger(SiteWebConstant.Common.Config.Sm2_Private_Key, 16);
  72. X9ECParameters sm2ECParameters1 = GMNamedCurves.getByName("sm2p256v1");
  73. ECDomainParameters domainParameters1 = new ECDomainParameters(sm2ECParameters1.getCurve(),
  74. sm2ECParameters1.getG(), sm2ECParameters1.getN());
  75. ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters1);
  76. // 用私钥解密
  77. SM2Engine sm2Engine = new SM2Engine();
  78. sm2Engine.init(false, privateKeyParameters);
  79. // 前端传入的密文解密后的processBlock得到Base64格式,记得解码
  80. // 如果只用下面给出的加密方法加密则不需要这个解码流程
  81. byte[] arrayOfBytes = Base64.decodeBase64(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));
  82. data = new String(arrayOfBytes);
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. }
  86. return data;
  87. }
  88. /**
  89. * 解密
  90. * @author wst 2024年9月12日 下午2:44:39
  91. * @param cipherData
  92. * @return
  93. */
  94. public static String sm2decrypt(String cipherData) {
  95. String result = null;
  96. try {
  97. // 加密算法
  98. String algorithm = "EC";
  99. // 私钥Hex,还原私钥
  100. BigInteger privateKeyD = new BigInteger(SiteWebConstant.Common.Config.Sm2_Private_Key, 16);
  101. // 使用标准名称创建EC参数生成的参数规范
  102. X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
  103. // 获取私钥的基本域参数
  104. ECParameterSpec ecParameterSpec = new ECParameterSpec(sm2ECParameters.getCurve(), sm2ECParameters.getG(),
  105. sm2ECParameters.getN());
  106. ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(privateKeyD, ecParameterSpec);
  107. // 获取私钥对象
  108. BCECPrivateKey bcecPrivateKey = new BCECPrivateKey(algorithm, ecPrivateKeySpec,
  109. BouncyCastleProvider.CONFIGURATION);
  110. byte[] cipherDataByte = Hex.decode(cipherData);
  111. ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(),
  112. ecParameterSpec.getG(), ecParameterSpec.getN());
  113. // 通过私钥值和私钥基本参数创建私钥参数对象
  114. ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(),
  115. ecDomainParameters);
  116. // 通过解密模式创建解密引擎并初始化
  117. SM2Engine sm2Engine = new SM2Engine();
  118. sm2Engine.init(false, ecPrivateKeyParameters);
  119. try {
  120. byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
  121. return new String(arrayOfBytes, StandardCharsets.UTF_8);
  122. } catch (Exception e) {
  123. }
  124. } catch (Exception e) {
  125. }
  126. return result;
  127. }
  128. /**
  129. * 加密
  130. * @author wst 2024年9月12日 下午2:42:21
  131. * @param data
  132. * @return
  133. */
  134. public static String encrypt(String data){
  135. // 获取一条SM2曲线参数
  136. X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
  137. // 构造ECC算法参数,曲线方程、椭圆曲线G点、大整数N
  138. ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
  139. //提取公钥点
  140. ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(SiteWebConstant.Common.Config.Sm2_Public_Key));
  141. // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04
  142. ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);
  143. SM2Engine sm2Engine = new SM2Engine();
  144. sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));
  145. byte[] arrayOfBytes = null;
  146. try {
  147. byte[] in = data.getBytes();
  148. arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
  149. } catch (Exception e) {
  150. e.printStackTrace();
  151. }
  152. return Hex.toHexString(arrayOfBytes);
  153. }
  154. }

加密工具类2

  1. import java.math.BigInteger;
  2. import java.security.KeyPair;
  3. import java.security.KeyPairGenerator;
  4. import java.security.PrivateKey;
  5. import java.security.PublicKey;
  6. import java.security.SecureRandom;
  7. import java.security.spec.ECGenParameterSpec;
  8. import org.apache.commons.net.util.Base64;
  9. import org.bouncycastle.asn1.gm.GMNamedCurves;
  10. import org.bouncycastle.asn1.x9.X9ECParameters;
  11. import org.bouncycastle.crypto.engines.SM2Engine;
  12. import org.bouncycastle.crypto.params.ECDomainParameters;
  13. import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
  14. import org.bouncycastle.crypto.params.ECPublicKeyParameters;
  15. import org.bouncycastle.crypto.params.ParametersWithRandom;
  16. import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
  17. import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
  18. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  19. import org.bouncycastle.jce.spec.ECParameterSpec;
  20. import org.bouncycastle.jce.spec.ECPrivateKeySpec;
  21. import org.bouncycastle.jce.spec.ECPublicKeySpec;
  22. import org.bouncycastle.math.ec.ECPoint;
  23. import org.bouncycastle.util.encoders.Hex;
  24. /**
  25. *
  26. * @author wst 2026年8月5日 下午3:44:15
  27. *
  28. */
  29. public class SM2Utils {
  30. /*
  31. // 前端调用sm2加密函数
  32. // 需要导入 crypto-js.js, sm2.js
  33. function sm2EncryptPwd(data) {
  34. <!--sm2公钥-->
  35. var publicKey = '你生成的公钥';
  36. return sm2Encrypt(data, publicKey, 1);
  37. }
  38. */
  39. public static final String PUBLIC_KEY = "0469b67671fca561ca5383adf320f42700a686034d6bc3ecafca4e27b0560870549288ccb36b6ca7326d9d0497f49a6ac4ee04fd302f0f29f6e942cc7edb6a8152";
  40. private static final String PRIVATE_KEY = "5f2382a0722be0df1983593d20fb32307f3524e58d4f58bddf8f6dd77cfe565d";
  41. private static final SM2Engine.Mode MODE = SM2Engine.Mode.C1C3C2;
  42. //椭圆曲线ECParameters ASN.1 结构
  43. private static X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1");
  44. //椭圆曲线公钥或私钥的基本域参数。
  45. private static ECParameterSpec ecDomainParameters = new ECParameterSpec(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());
  46. /**
  47. * 生成秘钥对
  48. * @author wst(shi-tao.wen) 2026年7月16日 16:51:10
  49. * @return
  50. */
  51. public static KeyPair createECKeyPair() {
  52. //使用标准名称创建EC参数生成的参数规范
  53. final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
  54. // 获取一个椭圆曲线类型的密钥对生成器
  55. final KeyPairGenerator kpg;
  56. try {
  57. kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
  58. // 使用SM2算法域参数集初始化密钥生成器(默认使用以最高优先级安装的提供者的 SecureRandom 的实现作为随机源)
  59. // kpg.initialize(sm2Spec);
  60. // 使用SM2的算法域参数集和指定的随机源初始化密钥生成器
  61. kpg.initialize(sm2Spec, new SecureRandom());
  62. // 通过密钥生成器生成密钥对
  63. return kpg.generateKeyPair();
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. return null;
  67. }
  68. }
  69. /**
  70. * 解密,并且获取解密后的字符串
  71. * @author wst(shi-tao.wen) 2026年7月16日 16:50:56
  72. * @param cipherData
  73. * @return
  74. */
  75. public static String sm2decrypt(String cipherData) {
  76. byte[] cipherDataByte = Hex.decode(cipherData);
  77. BigInteger privateKeyD = new BigInteger(PRIVATE_KEY, 16);
  78. X9ECParameters sm2ECParameters1 = GMNamedCurves.getByName("sm2p256v1");
  79. ECDomainParameters domainParameters1 = new ECDomainParameters(sm2ECParameters1.getCurve(), sm2ECParameters1.getG(), sm2ECParameters1.getN());
  80. ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters1);
  81. //用私钥解密,SM2Engine.Mode.C1C3C2得加,不然就会报错invalid cipher text
  82. SM2Engine sm2Engine = new SM2Engine(MODE);
  83. sm2Engine.init(false, privateKeyParameters);
  84. //processBlock得到Base64格式,记得解码
  85. byte[] arrayOfBytes = null;
  86. try {
  87. arrayOfBytes = Base64.decodeBase64(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));
  88. } catch (Exception e) {
  89. e.printStackTrace();
  90. return null;
  91. }
  92. //得到明文:SM2 Encryption Test
  93. return new String(arrayOfBytes);
  94. }
  95. /**
  96. * 加密
  97. * @author wst 2024年9月12日 下午2:42:21
  98. * @param data
  99. * @return
  100. */
  101. public static String sm2encrypt(String data){
  102. // 获取一条SM2曲线参数
  103. X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
  104. // 构造ECC算法参数,曲线方程、椭圆曲线G点、大整数N
  105. ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
  106. //提取公钥点
  107. ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(PUBLIC_KEY));
  108. // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04
  109. ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);
  110. SM2Engine sm2Engine = new SM2Engine(MODE);
  111. sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));
  112. byte[] arrayOfBytes = null;
  113. try {
  114. byte[] in = Base64.encodeBase64(data.getBytes());
  115. arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. return Hex.toHexString(arrayOfBytes);
  120. }
  121. /**
  122. * 公钥加密
  123. * @author wst(shi-tao.wen) 2026年7月16日 16:51:30
  124. * @param publicKeyHex 公钥
  125. * @param data 明文
  126. * @return
  127. */
  128. public static String encrypt(String publicKeyHex, String data) {
  129. return encrypt(getECPublicKeyByPublicKeyHex(publicKeyHex), data, 1);
  130. }
  131. /**
  132. * 公钥加密
  133. * @author wst(shi-tao.wen) 2026年7月16日 16:51:46
  134. * @param data 明文
  135. * @return
  136. */
  137. public static String encrypt(String data) {
  138. return encrypt(getECPublicKeyByPublicKeyHex(PUBLIC_KEY), data, 1);
  139. }
  140. /**
  141. * 公钥加密
  142. * @author wst(shi-tao.wen) 2026年7月16日 16:52:03
  143. * @param publicKey 公钥
  144. * @param data 明文
  145. * @param modeType 加密模式
  146. * @return
  147. */
  148. public static String encrypt(BCECPublicKey publicKey, String data, int modeType) {
  149. //加密模式
  150. SM2Engine.Mode mode = SM2Engine.Mode.C1C3C2;
  151. if (modeType != 1) {
  152. mode = SM2Engine.Mode.C1C2C3;
  153. }
  154. //通过公钥对象获取公钥的基本域参数。
  155. ECParameterSpec ecParameterSpec = publicKey.getParameters();
  156. ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(),
  157. ecParameterSpec.getG(), ecParameterSpec.getN());
  158. //通过公钥值和公钥基本参数创建公钥参数对象
  159. ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(publicKey.getQ(), ecDomainParameters);
  160. //根据加密模式实例化SM2公钥加密引擎
  161. SM2Engine sm2Engine = new SM2Engine(mode);
  162. //初始化加密引擎
  163. sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom()));
  164. byte[] arrayOfBytes = null;
  165. try {
  166. //将明文字符串转换为指定编码的字节串
  167. byte[] in = data.getBytes("utf-8");
  168. //通过加密引擎对字节数串行加密
  169. arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
  170. } catch (Exception e) {
  171. System.out.println("SM2加密时出现异常:" + e.getMessage());
  172. e.printStackTrace();
  173. }
  174. //将加密后的字节串转换为十六进制字符串
  175. return Hex.toHexString(arrayOfBytes);
  176. }
  177. /**
  178. * 私钥解密
  179. * @author wst(shi-tao.wen) 2026年7月16日 16:52:23
  180. * @param privateKeyHex 私钥
  181. * @param cipherData 密文
  182. * @return
  183. */
  184. public static String decrypt(String privateKeyHex, String cipherData) {
  185. return decrypt(getBCECPrivateKeyByPrivateKeyHex(privateKeyHex), cipherData, 1);
  186. }
  187. /**
  188. * 私钥解密
  189. * @author wst(shi-tao.wen) 2026年7月16日 16:52:52
  190. * @param cipherData 密文
  191. * @return
  192. */
  193. public static String decrypt(String cipherData) {
  194. return decrypt(getBCECPrivateKeyByPrivateKeyHex(PRIVATE_KEY), cipherData, 1);
  195. }
  196. /**
  197. * 私钥解密
  198. * @author wst(shi-tao.wen) 2026年7月16日 16:53:15
  199. * @param privateKey 私钥
  200. * @param cipherData 密文
  201. * @param modeType 解密模式
  202. * @return
  203. */
  204. public static String decrypt(BCECPrivateKey privateKey, String cipherData, int modeType) {
  205. //解密模式
  206. SM2Engine.Mode mode = SM2Engine.Mode.C1C3C2;
  207. if (modeType != 1) {
  208. mode = SM2Engine.Mode.C1C2C3;
  209. }
  210. //将十六进制字符串密文转换为字节数组(需要与加密一致,加密是:加密后的字节数组转换为了十六进制字符串)
  211. byte[] cipherDataByte = Hex.decode(cipherData);
  212. //通过私钥对象获取私钥的基本域参数。
  213. ECParameterSpec ecParameterSpec = privateKey.getParameters();
  214. ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(),
  215. ecParameterSpec.getG(), ecParameterSpec.getN());
  216. //通过私钥值和私钥钥基本参数创建私钥参数对象
  217. ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(privateKey.getD(),
  218. ecDomainParameters);
  219. //通过解密模式创建解密引擎并初始化
  220. SM2Engine sm2Engine = new SM2Engine(mode);
  221. sm2Engine.init(false, ecPrivateKeyParameters);
  222. String result = null;
  223. try {
  224. //通过解密引擎对密文字节串进行解密
  225. byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
  226. //将解密后的字节串转换为utf8字符编码的字符串(需要与明文加密时字符串转换成字节串所指定的字符编码保持一致)
  227. result = new String(arrayOfBytes, "utf-8");
  228. } catch (Exception e) {
  229. System.out.println("SM2解密时出现异常" + e.getMessage());
  230. }
  231. return result;
  232. }
  233. /**
  234. * 公钥字符串转换为 BCECPublicKey 公钥对象
  235. * @author wst(shi-tao.wen) 2026年7月16日 16:53:53
  236. * @param pubKeyHex 64字节十六进制公钥字符串(如果公钥字符串为65字节首个字节为0x04:表示该公钥为非压缩格式,操作时需要删除)
  237. * @return SM2公钥对象
  238. */
  239. public static BCECPublicKey getECPublicKeyByPublicKeyHex(String pubKeyHex) {
  240. //截取64字节有效的SM2公钥(如果公钥首个字节为0x04)
  241. if (pubKeyHex.length() > 128) {
  242. pubKeyHex = pubKeyHex.substring(pubKeyHex.length() - 128);
  243. }
  244. //将公钥拆分为x,y分量(各32字节)
  245. String stringX = pubKeyHex.substring(0, 64);
  246. String stringY = pubKeyHex.substring(stringX.length());
  247. //将公钥x、y分量转换为BigInteger类型
  248. BigInteger x = new BigInteger(stringX, 16);
  249. BigInteger y = new BigInteger(stringY, 16);
  250. //通过公钥x、y分量创建椭圆曲线公钥规范
  251. ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(x9ECParameters.getCurve().createPoint(x, y), ecDomainParameters);
  252. //通过椭圆曲线公钥规范,创建出椭圆曲线公钥对象(可用于SM2加密及验签)
  253. return new BCECPublicKey("EC", ecPublicKeySpec, BouncyCastleProvider.CONFIGURATION);
  254. }
  255. /**
  256. * 私钥字符串转换为 BCECPrivateKey 私钥对象
  257. * @author wst(shi-tao.wen) 2026年7月16日 16:54:17
  258. * @param privateKeyHex 32字节十六进制私钥字符串
  259. * @return SM2私钥对象
  260. */
  261. public static BCECPrivateKey getBCECPrivateKeyByPrivateKeyHex(String privateKeyHex) {
  262. //将十六进制私钥字符串转换为BigInteger对象
  263. BigInteger d = new BigInteger(privateKeyHex, 16);
  264. //通过私钥和私钥域参数集创建椭圆曲线私钥规范
  265. ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(d, ecDomainParameters);
  266. //通过椭圆曲线私钥规范,创建出椭圆曲线私钥对象(可用于SM2解密和签名)
  267. return new BCECPrivateKey("EC", ecPrivateKeySpec, BouncyCastleProvider.CONFIGURATION);
  268. }
  269. public static void main(String[] args) {
  270. String publicKeyHex = null;
  271. String privateKeyHex = null;
  272. KeyPair keyPair = createECKeyPair();
  273. PublicKey publicKey = keyPair.getPublic();
  274. if (publicKey instanceof BCECPublicKey) {
  275. //获取65字节非压缩缩的十六进制公钥串(0x04)
  276. publicKeyHex = Hex.toHexString(((BCECPublicKey) publicKey).getQ().getEncoded(false));
  277. System.out.println("---->SM2公钥:" + publicKeyHex);
  278. }
  279. PrivateKey privateKey = keyPair.getPrivate();
  280. if (privateKey instanceof BCECPrivateKey) {
  281. //获取32字节十六进制私钥串
  282. privateKeyHex = ((BCECPrivateKey) privateKey).getD().toString(16);
  283. System.out.println("---->SM2私钥:" + privateKeyHex);
  284. }
  285. /**
  286. * 公钥加密
  287. */
  288. String data = "=========待加密数据=========";
  289. //将十六进制公钥串转换为 BCECPublicKey 公钥对象
  290. String encryptData = encrypt(publicKeyHex, data);
  291. System.out.println("---->加密结果:" + encryptData);
  292. /**
  293. * 私钥解密
  294. */
  295. //将十六进制私钥串转换为 BCECPrivateKey 私钥对象
  296. data = decrypt(privateKeyHex, encryptData);
  297. System.out.println("---->解密结果:" + data);
  298. String mdata = "04d1a73aa9b169ceaaaefb242f444510958cf5d53f464588f05008cb2f9d3ccc9a9611518e90a425697003eff19bf00937a575851c09b1525aec472645442987135f48a0bf8b91300062b37dc274bc33555a06260c1def986bfb7f082b73921ca2572fe384f944bf3be0d76dcbaa25c40c879e7612d044511d";
  299. System.out.println(sm2decrypt(mdata));
  300. System.out.println(sm2decrypt(sm2encrypt("20260717_@_admin")));
  301. }
  302. }