当前位置:   article > 正文

前端VUE后端JAVA,SM2加解密,一篇解决你的问题_gmsm-sm2js 前端加密后台无法解密

gmsm-sm2js 前端加密后台无法解密

一、后端JAVA

1、在pom.xml中添加

  1. <dependency>
  2. <groupId>cn.hutool</groupId>
  3. <artifactId>hutool-all</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.bouncycastle</groupId>
  7. <artifactId>bcprov-jdk15on</artifactId>
  8. <version>1.68</version>
  9. </dependency>
  10. <!-- bcprov-jdk15 加密工具-->
  11. <dependency>
  12. <groupId>org.bouncycastle</groupId>
  13. <artifactId>bcprov-jdk15to18</artifactId>
  14. <version>1.69</version>
  15. </dependency>

2、sm2工具类

  1. public class Sm2Util {
  2. //生成秘钥对
  3. public static MutablePair<String, String> createSM2Key(){
  4. SM2 sm2= SmUtil.sm2();
  5. sm2.setMode(SM2Engine.Mode.C1C3C2);
  6. String privateKey= HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
  7. String publicKey = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
  8. return MutablePair.of(publicKey,privateKey);
  9. }
  10. //加密
  11. public static String encrypt(String data, String publicKey){
  12. String publicKeyTmp = publicKey;
  13. if (publicKey.length() == 130) {
  14. //这里需要去掉开始第一个字节 第一个字节表示标记
  15. publicKeyTmp = publicKey.substring(2);
  16. }
  17. String xhex = publicKeyTmp.substring(0, 64);
  18. String yhex = publicKeyTmp.substring(64, 128);
  19. ECPublicKeyParameters ecPublicKeyParameters = BCUtil.toSm2Params(xhex, yhex);
  20. //创建sm2 对象
  21. SM2 sm2 = new SM2(null, ecPublicKeyParameters);
  22. sm2.usePlainEncoding();
  23. sm2.setMode(SM2Engine.Mode.C1C3C2);
  24. return sm2.encryptHex(data, KeyType.PublicKey);
  25. }
  26. //解密
  27. public static String decrypt(String data, String privateKey){
  28. SM2 sm2 = new SM2(ECKeyUtil.toSm2PrivateParams(privateKey), null);
  29. sm2.setMode(SM2Engine.Mode.C1C3C2);
  30. sm2.setEncoding(new PlainDSAEncoding());
  31. String encryptStr = sm2.decryptStr(data, KeyType.PrivateKey);
  32. return encryptStr;
  33. }

二、前端VUE

1.安装依赖 gm-crypto

npm install gm-crypto

2.加解密方法

  1. import { SM2} from "gm-crypto";
  2. //加密方法
  3. //plaintext为待加密数据
  4. //publicKey 为加密公钥
  5. const data =
  6. "04" +
  7. SM2.encrypt(plaintext, publicKey, {
  8. inputEncoding: "utf8",
  9. outputEncoding: "hex"
  10. });
  11. //解密方法
  12. // ciphertext :密文
  13. // privateKey :解密私钥
  14. data = SM2.decrypt(
  15. ciphertext.substring(2, ciphertext.length),
  16. privateKey,
  17. {
  18. inputEncoding: "hex",
  19. outputEncoding: "utf8"
  20. }
  21. );

三、避坑指南

1、后端加密后密文前两位为“04”,前端解密不了,所以在前端解密时要把“04”去掉,

2、前端加密后,密文没有“04”,所以前端加密完要在密文前面加上“04”

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/475187
推荐阅读
相关标签
  

闽ICP备14008679号