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

国密SM2 非对称加解密前后端工具

1.依赖

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk18on</artifactId><version>1.78.1</version></dependency>

2.java工具类


import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;public class Sm2Util {private static final String SM2_PUBLIC_KEY = "043bfa6294c822f76cdaf6ffaecc16a0fb49d4c8252a55944720a589c8276cc2d0d42b85e7659da7367dcaeab619e45d59793d72657eadc3e443f8f5bf9efea136";private static final String SM2_PRIVATE_KEY = "009f10794a9478e31715fe6f11fafb9a5954705a2e76ec018ad7fcac8ddd8caccc";/*** 获取SM2加密工具对象** @param privateKey 加密私钥* @param publicKey  加密公钥* @return 处理结果*/public static SM2 getSM2(String privateKey, String publicKey) {ECPrivateKeyParameters ecPrivateKeyParameters = null;ECPublicKeyParameters ecPublicKeyParameters = null;if (StringUtils.isNotBlank(privateKey)) {ecPrivateKeyParameters = BCUtil.toSm2Params(privateKey);}if (StringUtils.isNotBlank(publicKey)) {if (publicKey.length() == 130) {//这里需要去掉开始第一个字节 第一个字节表示标记publicKey = publicKey.substring(2);}String xhex = publicKey.substring(0, 64);String yhex = publicKey.substring(64, 128);ecPublicKeyParameters = BCUtil.toSm2Params(xhex, yhex);}//创建sm2 对象SM2 sm2 = new SM2(ecPrivateKeyParameters, ecPublicKeyParameters);sm2.usePlainEncoding();sm2.setMode(SM2Engine.Mode.C1C2C3);return sm2;}public static String encrypt(String data) {SM2 sm2 = getSM2(null, SM2_PUBLIC_KEY);return sm2.encryptBcd(data, KeyType.PublicKey);}public static String decrypt(String data) {SM2 sm2 = getSM2(SM2_PRIVATE_KEY, null);return StrUtil.utf8Str(sm2.decryptFromBcd(data, KeyType.PrivateKey));}public static JSONObject genSm2Keys() {SM2 sm2 = SmUtil.sm2();byte[] privateKeyByte = BCUtil.encodeECPrivateKey(sm2.getPrivateKey());//这里公钥不压缩  公钥的第一个字节用于表示是否压缩  可以不要byte[] publicKeyByte = ((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false);String privateKey = HexUtil.encodeHexStr(privateKeyByte);System.out.println("私钥:" + privateKey);String publicKey = HexUtil.encodeHexStr(publicKeyByte);System.out.println("公钥:" + publicKey);return new JSONObject().set("privateKey", privateKey).set("publicKey", publicKey);}
}

3  vue+ts工具类

// src/utils/crypto.ts
import * as sm from 'sm-crypto';const publicKey = '043bfa6294c822f76cdaf6ffaecc16a0fb49d4c8252a55944720a589c8276cc2d0d42b85e7659da7367dcaeab619e45d59793d72657eadc3e443f8f5bf9efea136';
const privateKey = '009f10794a9478e31715fe6f11fafb9a5954705a2e76ec018ad7fcac8ddd8caccc';export function encryptWithSM2(data: string): string {const encrypted = sm.sm2.doEncrypt(data, publicKey, 0);return '04'+encrypted;
}export function decryptWithSM2(dataHex: string): string {dataHex = dataHex.substring(2).toLocaleLowerCase()const decrypted = sm.sm2.doDecrypt(dataHex, privateKey, 0, { output: 'string' });return decrypted;
}

 参考链接:Vue + Springboot 前后端完整使用国密算法 SM2 数据加密 传输 交互 完整解决方案_国密sm2加密算法 前后端加密互通实现-CSDN客文章浏览阅读8k次,点赞5次,收藏48次。该博文介绍了如何在SpringBoot项目中实现国密SM2算法的加解密功能,包括依赖引入、加密解密方法创建、拦截器处理,以及前后端数据交互的加密流程。主要涉及SM2非对称加密和SM4对称加密,通过自定义拦截器对请求和响应数据进行加解密处理,确保数据传输的安全性。https://blog.csdn.net/yssa1125001/article/details/121208118


http://www.mrgr.cn/news/63939.html

相关文章:

  • 【1】Elasticsearch 30分钟快速入门
  • EtherCAT转ModbusTCP相关技术
  • flinksql-Queries查询相关实战
  • HTTP与HTTPS协议
  • gin框架可以构建微服务吗?
  • 泡泡玛特行至巅峰,又顷刻“瓦解”?
  • 在 openEuler 22.03 服务器上搭建 web 服务教程
  • 100种算法【Python版】第34篇——PageRank算法
  • 构建高效信息学科平台:Spring Boot实践
  • 小区搜索和SSB简介
  • 华为机试HJ17 坐标移动
  • 基于java+SpringBoot+Vue的美容院管理系统设计与实现
  • 【华为HCIP实战课程三十】中间到中间系统协议IS-IS路由渗透及TAG标识详解,网络工程师
  • 【第几小】
  • 华为 HCIP-Datacom H12-821 题库 (40)
  • (undone) MIT6.S081 2023 一个月速通 (Day1: 了解 xv6 结构) (TODO: fs.img 生成方式不清楚)
  • ‌5G SSB(同步信号块)位于物理层‌
  • 微模型开发迫在眉睫
  • 职场中记住对方的名字很重要
  • 【星闪EBM-H63开发板】小熊派的开发板实物
  • 李红《复变函数与积分变换》第五版课后习题答案PDF
  • Linux中的rm命令详解
  • 【专有网络VPC】IPv4网关
  • 探索 Move 编程语言:智能合约开发的新纪元
  • 反射,注解
  • 基于JavaWeb+MySQL实现口算题卡