SpringBoot中SM2公钥加密、私钥解密的实现示例详解

 更新时间:2025年07月03日 14:12:10   作者:DarLing丶张皇  
本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化了SM2加密的实现过程,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

版权声明:文为博主原创文章,未经博主允许不得转载。原创不易,希望大家尊重原创!
Copyright © 2025 DarLing丶张皇 保留所有权利

一、前言

Hutool提供了对国密算法的完整支持,我们可以利用它简化SM2加密实现。

使用前准备:在Maven中引入HutoolBouncyCastle依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.72</version>
</dependency>

1、加密信息(示例)

姓名:ikun
兴趣爱好:唱、跳、RAP、篮球
练习时长:两年半
代表作:《鸡你太美》

2、加密结果(示例)

8cf9ea5813efb097d1f9c25191085db861e857e3056f6ef905f1f9a1667d00151c0d8cf026ca76c1812fc8937bcea9b5ec1d5546e3c4ce953a89e8305bc0a00526ce49108bd3bf750c12b203caf55548dce2129b748e87ad1991d2e26b88282b658e7ac3624ed86e6e23179a34511b81916e9c8745d0754d75d9b46c9f8ba6ee3f37e4915aadc9111fd805c5e7020fc98da713c87c2d9fa0d27c2554784e7cf189b64241e2aadb59751c2c2e1ccd7f3129e771893a9dc887c8942b409b0364b45a8ed9266ecf6d953e4cc1c522

二、实现代码

公钥与私钥可通过浏览器搜索:SM2密钥在线生成

在这里插入图片描述

生成后添加至配置文件中

1、yml文件配置

统一在.yml文件中配置SM2公钥SM2私钥,方便维护。
1.1、开发环境下,在application-dev.yml中配置:

sm2:
public-key: “你的BASE64公钥”
private-key: “你的BASE64私钥”

1.2、生产环境下,在application-prod.yml中配置:

sm2:
public-key: “你的BASE64公钥”
private-key: “你的BASE64私钥”

2、创建SM2工具类

package org.jeecg.common.util;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import java.nio.charset.StandardCharsets;
/**
 * 基于Hutool的SM2加密工具类
 */
public class SM2HutoolUtil {
    /**
     * SM2加密
     * @param publicKey  公钥(BASE64或HEX格式)
     * @param plaintext  明文
     * @return Base64编码的密文
     */
    public static String encrypt(String publicKey, String plaintext) {
        SM2 sm2 = SmUtil.sm2(null, publicKey);
        return sm2.encryptBase64(plaintext, StandardCharsets.UTF_8, KeyType.PublicKey);
    }
    /**
     * SM2解密
     * @param privateKey 私钥(BASE64或HEX格式)
     * @param ciphertext Base64编码的密文
     * @return 解密后的明文
     */
    public static String decrypt(String privateKey, String ciphertext) {
        SM2 sm2 = SmUtil.sm2(privateKey, null);
        return sm2.decryptStr(ciphertext, KeyType.PrivateKey, StandardCharsets.UTF_8);
    }
    /**
     * 生成SM2密钥对
     * @return 包含BASE64编码公私钥的数组,[0]为私钥,[1]为公钥
     */
    public static String[] generateKeyPair() {
        SM2 sm2 = SmUtil.sm2();
        return new String[]{
            sm2.getPrivateKeyBase64(),
            sm2.getPublicKeyBase64()
        };
    }
}

3、自动注入

@Configuration
public class Sm2Config {
    @Value("${sm2.public-key}")
    private String publicKey;
    @Value("${sm2.private-key}")
    private String privateKey;
    @Bean
    public SM2 sm2() {
        return SmUtil.sm2(privateKey, publicKey);
    }
}

4、使用示例

/**SM2公钥*/
@Value("${sm2.public-key}")
private String publicKey;
/**SM2私钥*/
@Value("${sm2.private-key}")
private String privateKey;
public void demo() {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("姓名", "ikun");
    map.put("兴趣爱好", "唱、跳、RAP、篮球");
    map.put("练习时长", "两年半");
    map.put("代表作", "《鸡你太美》");
    // 加密(公钥)
    /**
     * SM2加密
     * @param publicKey 公钥
     * @param map 明文内容(实际开发替换为自己的内容)
     * @return Base64编码的密文
     */
    String encrypted = SM2HutoolUtil.encrypt(publicKey, map);
    /**
     * SM2解密
     * @param privateKey 私钥
     * @param encrypted Base64编码的密文内容(实际开发替换为自己的内容)
     * @return 解密后的明文
     */
    String encrypted = SM2HutoolUtil.decrypt(privateKey, encrypted);
}

三、说明

以上示例仅展示通过SM2对数据进行公钥加密,私钥解密。
此示例中未使用签名,如需使用签名,可通过国密算法工具-SmUtil,结合需求再具体实现。
前往Hutool参考。

到此这篇关于SpringBoot中SM2公钥加密、私钥解密的实现的文章就介绍到这了,更多相关SpringBoot SM2加密解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何实现数字逆序

    Java如何实现数字逆序

    这篇文章主要介绍了Java如何实现数字逆序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MyBatis配置与CRUD超详细讲解

    MyBatis配置与CRUD超详细讲解

    这篇文章主要介绍了MyBatis配置与CRUD,CRUD是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能
    2023-02-02
  • SpringBoot实现PDF转图片的代码示例

    SpringBoot实现PDF转图片的代码示例

    在本文中,我们使用SpringBoot演示了如何将PDF文件转换为一张或多张图片,这些示例演示了如何使用Java编程语言与其他开源技术集成,以实现各种文件格式之间的转换,感兴趣的小伙伴跟着小编一起来看看吧
    2024-08-08
  • 如何将Java对象转换成JSON

    如何将Java对象转换成JSON

    这篇文章主要介绍了如何将Java对象转换成JSON,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • IDEA部署Tomcat的超详细图文教程

    IDEA部署Tomcat的超详细图文教程

    最近迫于无奈从我哪破旧的Eclipse转换到了IDEA,然后就是超多的不习惯,下面这篇文章主要给大家介绍了关于IDEA部署Tomcat的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数

    使用AOP拦截Controller获取@PathVariable注解传入的参数

    这篇文章主要介绍了使用AOP拦截Controller获取@PathVariable注解传入的参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java利用trueLicense实现项目离线证书授权操作步骤

    Java利用trueLicense实现项目离线证书授权操作步骤

    文章介绍了如何使用trueLicense实现离线授权控制,包括生成公私钥、创建证书校验模块、生成证书模块和测试模块,通过这种方式,可以控制用户使用的项目模块、授权周期、使用的设备和服务器,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 在Java 中操作 Map时高效遍历和安全删除数据的方法

    在Java 中操作 Map时高效遍历和安全删除数据的方法

    本文介绍Java中高效遍历和安全删除Map的四种方式及三种删除策略,强调避免并发修改异常需使用Iterator或removeIf,性能优化建议根据Map类型选择遍历方法,并提供完整示例代码,感兴趣的朋友一起看看吧
    2025-06-06
  • Java如何计算两个时间段内的工作日天数

    Java如何计算两个时间段内的工作日天数

    这篇文章主要介绍了Java如何计算两个时间段内的工作日天数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot中如何启动Tomcat流程

    SpringBoot中如何启动Tomcat流程

    这篇文章主要介绍了SpringBoot中如何启动Tomcat流程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论