SM2公钥加密与解密

article/2025/9/24 12:50:26

SM2加解密

    • 字符串公钥
    • SM2加解密工具类

始于我工作中的一个需求,在网上很少找到资料所以来写一下

字符串公钥

公钥是对接方给的,是一个长字符串类似于这种格式
在这里插入图片描述
工具类中也有生成公私钥的方法,我测试加解密也能成功

秘钥生成借鉴的是这个文章的内容
https://blog.csdn.net/Kevin_zhai/article/details/109351247

SM2加解密工具类

加解密的方法初版忘了是在哪借鉴的了见谅,初版是直接用PublicKey 和 PrivateKey 对象加解密的,我把它改为用字符串转为公钥和私钥的方式加解密。

加密方法因为需求是要返回加密后的base64字符串,本来是直接转为字符串返回的,后来又改为这样的,同样的解密的时候也改了先用base64解码,根据需求自己调一下吧。

package com.encrypt.utils.sm2;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
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.jce.spec.ECParameterSpec;
import sun.misc.BASE64Decoder;import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** @ClassName SM2Util* @Description //TODO* @Date 2022/2/18* @Author yangy* @Version 1.0**/
@Slf4j
public class SM2Util {/*** SM2加密算法* @param publicKeyStr     公钥* @param data          明文数据* @return*/public static String encrypt(String publicKeyStr, String data){Security.addProvider(new BouncyCastleProvider());PublicKey publicKey = null;try {log.info("开始转换字符串公钥,公钥值:{},数据值:{}",publicKeyStr,data);byte[] keyBytes;keyBytes = (new BASE64Decoder()).decodeBuffer(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);publicKey = keyFactory.generatePublic(keySpec);log.info("转换后的公钥:{}",publicKey);} catch (Exception e) {log.error("SM2字符串公钥转换异常:{}",e.getMessage());e.printStackTrace();}log.info("SM2开始加密数据");ECPublicKeyParameters ecPublicKeyParameters = null;if (publicKey instanceof BCECPublicKey) {BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey;ECParameterSpec ecParameterSpec = bcecPublicKey.getParameters();ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(),ecParameterSpec.getG(), ecParameterSpec.getN());ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters);}SM2Engine sm2Engine = new SM2Engine();sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom()));byte[] arrayOfBytes = null;try {byte[] in = data.getBytes("utf-8");arrayOfBytes = sm2Engine.processBlock(in,0, in.length);} catch (Exception e) {log.error("SM2加密时出现异常:",e.getMessage());System.out.println("SM2加密时出现异常:");}return  Base64.encodeBase64String(arrayOfBytes);}/*** SM2解密算法* @param privateKeyStr        私钥* @param cipherData        密文数据* @return*/public static String decrypt(String privateKeyStr, String cipherData){PrivateKey privateKey = null;byte[] keyBytes;try {keyBytes = (new BASE64Decoder()).decodeBuffer(privateKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);privateKey=keyFactory.generatePrivate(keySpec);}catch (Exception e){log.error("SM2字符串私钥转换异常:{}",e.getMessage());e.printStackTrace();}BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey;ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters();ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(),ecParameterSpec.getG(), ecParameterSpec.getN());ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(),ecDomainParameters);SM2Engine sm2Engine = new SM2Engine();sm2Engine.init(false, ecPrivateKeyParameters);String result = null;byte[] arrayOfBytes = null;try {byte[] in = Base64.decodeBase64(cipherData);arrayOfBytes = sm2Engine.processBlock(in,0, in.length);result=new String(arrayOfBytes, "utf-8");} catch (Exception e) {System.out.println("SM2解密时出现异常");}return result;}/*** SM2算法生成密钥对* @return 密钥对信息*/public static KeyPair generateSm2KeyPair() {try {final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());SecureRandom random = new SecureRandom();// 使用SM2的算法区域初始化密钥生成器kpg.initialize(sm2Spec, random);// 获取密钥对KeyPair keyPair = kpg.generateKeyPair();return keyPair;} catch (Exception e) {log.error("generate sm2 key pair failed:{}", e.getMessage(), e);return null;}}
}/*** main 方法测试**/public static void main(String[] args) {KeyPair keyPair = SM2Util.generateSm2KeyPair();String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded());String publicKey  = Base64.encodeBase64String(keyPair.getPublic().getEncoded());System.out.println("公钥:"+publicKey);System.out.println("私钥:"+privateKey);String data="123456";String encrypt = SM2Util.encrypt(publicKey,data);String decrypt = SM2Util.decrypt(privateKey, encrypt);System.out.println("加密后数据:"+encrypt);System.out.println("解密后数据:"+decrypt);}

http://chatgpt.dhexx.cn/article/Jg0n6JCE.shtml

相关文章

公钥加密算法-RSA

RSA算法 RSA算法是由它的三位开发者,即 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏的首字母组成的 (Rivest-Shamir-Adleman)。 RSA 可以被用于公钥加密、数字签名和密钥交换。 文章目录 RSA算法一、简介二、RSA算法流程1、 加密或者验签过程2、解密或者签名…

公钥加密与PKI实验

环境:安装openssl库和bless工具 1.openssl库 2.bless工具 一.成为数字证书认证机构 1.新建一个工作目录 2.为CA生成自签名证书 二.为PKILabServer.com生成证书 1.生成公开/私有密钥对 2.生成证书签名请求 3.生成证书 三.在网站中…

java公钥加密私钥解密_公钥加密,私钥解密示例程序(JAVA)详解

公钥与私钥机制属于非对称加密的范畴,非对称是相对于对称加密而言的,对称加密用于加密与解密的密钥是同一把,而非对称加密则用于加密与解密的密钥不相同,一个公开,称为公钥;一个保密,称为私钥&a…

c#加密:四、公钥加密和签名

一、公钥加密 1、概述 公钥加密是非对称的,因此加密和解密需要使用不同的密钥。对称加密的密钥可以是一串长度合适的任意字节串。但非对称加密则需要专门制作一对密钥。 这个密钥对包含一个公钥和一个私钥。它们将一起完成如下工作: 公钥加密消息&#…

为什么用公钥加密却不能用公钥解密?

本文为掘金社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 一直以来我都在逃避写HTTPS。 毕竟。 HTTPS里名词太多。概念又巨繁琐。 实在是太难解释了,能不写我尽量不写。。。。 但为了让图解网…

公钥加密算法

3 公钥加密算法 加密工具使用 运行RSA-Tool,点击Start按钮,滑动鼠标生成一个随机数。点击Generate生成一对大质数p、q及Npq。 自己选定一个可用的整数e(可使用默认的10001,也可以使用其他的)。点击Calc.D生成d。 3 将公钥(N,e)发送给小伙…

2021-05-05

5.5 实训主题:密码学(后续) 公钥加密算法 RSA算法的数学原理 阅读RSA.cpp中的代码,了解其实现方法。调试运行RSA.cpp,选择两个不同的素数。根据生成的d和e验证公式de ≡ 1 (mod (p-1)(q-1))。输入要加密的数。验证…

公钥密钥加密原理

转载自:https://www.jianshu.com/p/0bf1c3c047e5 第6章 网络编程与网络框架 6.1 公钥密钥加密原理 6.1.1 基础知识 密钥:一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。对称加密算法:加密和解密都是使用的同…

公钥密码体制及RSA公钥加密算法(上)

一.公钥密码体制 (1)公钥(非对称)密码概述: 优点:免去密钥分发,密钥管理简单 (2)公钥加密的设计原则: 已知公私钥,进行加密解密是简单容易的 单…

网关与路由器的区别!!

自我认识: “网关” :让两个不同网络相互之间进行通信,可以使具有不同协议的网络相互连接。 “路由器”:能在计算机网络之间发送和接收数据包的设备,并且提供最佳路由路径的一种网络互联设备。但是只能在使用相同协议…

什么是网关和网关的作用

什么是网关? 网关(Gateway)指的是这一个网络连接到另一个网络的“关口”,它又称网间连接器、协议转换器。在Internet网里,网关的作用是一种连接内部网与Internet上其它网的一种中间设备,通俗来说,也叫做“路由器”。网关地址是能…

微服务——API网关

什么是API网关 API网关(API Gateway)是应用服务之前的系统,用来代理业务系统的服务API,在网关层处理所有的非业务功能,实现管理授权、访问控制和流量限制等功能。这样业务系统就可以专注于业务,而不用去处…

网关和路由器的区别

摘要:网关是逻辑概念,路由器是物理设备,路由器可以作为网关来使用。路由器是一个设备,而网关是一个结点(概念层)。应该说:路由器可以实现网关的功能。另外,网关的功能还可以由局域网中一台双网卡的机器&…

PowerBI Server端管理数据网关

作为企业PowerBI的管理员,日常工作除了分发报表,可能就是管理网关了,目前国际版的Server端已经更新了网关管理的页面,但是入口没变,仍然是设置—管理网关。 新建数据源 进入管理网关页面后,左上角有一个新…

守护企业网关

相比UTM、防毒墙等概念,用户关注的只是网关处如何确保网络安全以及对病毒攻击的拦截。 有一天,在一家大型外企工作的小王,利用午休空挡通过MSN将一个名为Dancing Skeleton的游戏小程序传给朋友分享,当消息发过去后,屏…

网关介绍

网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用…

微服务网关——需求篇

概念 API Gateway(API GW / API 网关),顾名思义,是企业 软件系统在系统边界上提供给外部访问内部接口服务的统一入口。网关并不是微服务所特有的,实际上网关在微服务之前就已经存在很久了,例如银行、证券等…

网关是什么?工业网关是什么?

网关是什么?工业网关是什么? 网关(Gateway)又称网间衔接器、协议转化器。网关在传输层上以完结网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器相似,不同的是互连层。网关既…

守护企业网关

相比UTM、防毒墙等概念,用户关注的只是网关处如何确保网络安全以及对病毒攻击的拦截。 有一天,在一家大型外企工作的小王,利用午休空挡通过MSN将一个名为Dancing Skeleton的游戏小程序传给朋友分享,当消息发过去后,屏…

B2B网关支付方案介绍

B2B网关支付方案介绍 目录 一、B2B网关概述 二、B2B网关方案 一、B2B网关概述 业务背景:近年来,随着互联网支付业务逐步进化,C端已成红海,而B端成为群蓝海。市场上普遍存在的对B端支付需求又得不到满足。 业务场景&#xff1a…