当前位置: 首页 > web >正文

SM2——适用于前后端(java+vue)公用的SM2国密加解密传输

目录

    • 一、SM2国密加解密算法
      • 1.1、pom文件引入依赖包
      • 1.2、SM2加解密工具类
      • 1.3、测试类

一、SM2国密加解密算法

1.1、pom文件引入依赖包

 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version></dependency>

1.2、SM2加解密工具类

  • SM2加解密工具类

    package com.xz.utils;
    import org.bouncycastle.asn1.gm.GMNamedCurves;
    import org.bouncycastle.asn1.x9.X9ECParameters;
    import org.bouncycastle.crypto.engines.SM2Engine;
    import org.bouncycastle.crypto.params.*;
    import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
    import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.math.ec.ECPoint;
    import org.bouncycastle.util.encoders.Hex;import java.math.BigInteger;
    import java.security.*;
    import java.security.spec.ECGenParameterSpec;
    import java.util.HashMap;
    import java.util.Map;/*** 适用于前后端公用的SM2秘钥生成、加解密工具类*/
    public class SimpSM2Util {/*** 公钥常量*/public static final String KEY_PUBLIC_KEY = "publicKey";/*** 私钥返回值常量*/public static final String KEY_PRIVATE_KEY = "privateKey";/*** SM2加密算法* @param publicKey     公钥* @param data          明文数据* @return*/public static String encrypt(String publicKey, String data) {// 获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");// 构造ECC算法参数,曲线方程、椭圆曲线G点、大整数NECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());//提取公钥点ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(publicKey));// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为加密模式sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));byte[] arrayOfBytes = null;try {byte[] in = data.getBytes();arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);} catch (Exception e) {System.out.println("SM2加密时出现异常:"+e.getMessage());}return Hex.toHexString(arrayOfBytes);}/*** SM2解密算法* @param privateKey        私钥* @param cipherData        密文数据* @return*/public static String decrypt(String privateKey, String cipherData) {// 使用BC库加解密时密文以04开头,传入的密文前面没有04则补上if (!cipherData.startsWith("04")){cipherData = "04" + cipherData;}byte[] cipherDataByte = Hex.decode(cipherData);BigInteger privateKeyD = new BigInteger(privateKey, 16);//获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");//构造domain参数ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为解密模式sm2Engine.init(false, privateKeyParameters);String result = "";try {byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);return new String(arrayOfBytes);} catch (Exception e) {System.out.println("SM2解密时出现异常:"+e.getMessage());}return result;}/*** 生成密钥*/public static Map<String, String> createKey() throws Exception{ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2参数初始化生成器kpg.initialize(sm2Spec);// 获取密钥对KeyPair keyPair = kpg.generateKeyPair();PublicKey publicKey = keyPair.getPublic();BCECPublicKey p=(BCECPublicKey)publicKey;System.out.println("publicKey:"+Hex.toHexString(p.getQ().getEncoded(false)));PrivateKey privateKey = keyPair.getPrivate();BCECPrivateKey s=(BCECPrivateKey)privateKey;System.out.println("privateKey:"+Hex.toHexString(s.getD().toByteArray()));Map<String, String> result = new HashMap<>();result.put(KEY_PUBLIC_KEY, Hex.toHexString(p.getQ().getEncoded(false)));result.put(KEY_PRIVATE_KEY, Hex.toHexString(s.getD().toByteArray()));return result;}}
    

1.3、测试类

  • 测试类

    public static void main(String[] args) throws Exception {Map<String, String> key = createKey();String publicKey = key.get(KEY_PUBLIC_KEY);System.out.println("公钥:"+publicKey);String privateKey = key.get(KEY_PRIVATE_KEY);System.out.println("私钥:"+privateKey);String str="hello java123456";System.out.println("加密前结果:"+str);String encrypt = encrypt(publicKey, str);System.out.println("加密后结果:"+encrypt);String decrypt = decrypt(privateKey, encrypt);System.out.println("解密后结果:"+decrypt);
    }
    
  • 测试结果,如下图所示:
    在这里插入图片描述

http://www.xdnf.cn/news/11670.html

相关文章:

  • MXNet 相关函数详解
  • 电脑安装ubuntu系统详细教程
  • JDK安装教程
  • 000-搭建Gitea-自己的git服务器
  • SSM框架讲解(史上最详细的文章)
  • scrapy框架--快速了解
  • IDEA配置JavaFX
  • (一)PaddlePaddle(深度学习框架)的搭建、使用
  • DFS(深度优先搜索)入门介绍
  • shuffle
  • JSP详细基础教学
  • Python网络爬虫之Xpath详解
  • Python的包安装工具——pip命令大全
  • netstat详解
  • Linux-文件查找find命令
  • Echarts热力图配置项,一篇文章告诉你。
  • 神仙级Python入门教程(非常详细),从零基础入门到精通,看这篇就够了
  • 一文详细说明spring cloud和Spring Cloud Alibaba的各自组件以及联系和区别
  • Validate表单验证插件之常用参数介绍
  • 网关 GateWay 的使用详解、路由、过滤器、跨域配置
  • 神经网络(NN)网络构建及模型算法介绍
  • 从计网的角度讲明白什么是网关
  • Apollo入门使用手册
  • Java资源大全(更新中)
  • Keil(MDK)STM32和51版本详细安装
  • GPU 性能测试软件:GPU-Z,2023 年 9 月 12 日更新
  • 【19】linux进阶——后台运行()和nohup命令
  • ESFP型人格的特征,ESFP型人格的优势和劣势分析
  • react Native 环境安装配置——图解版一目了然
  • Netty基础入门和基本使用