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

Java实现国密算法 SM2 /SM3 /SM4(基于 BouncyCastle)

密码学算法分类指南[
国密算法全解析
环境要求:

  • JDK 17
  • Maven 3
  • BouncyCastle(1.78 )

1. Maven 依赖配置

pom.xml 中添加如下依赖:

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

2. 基础设置:注册 BouncyCastle 提供者

初始化加密环境,必须提前注册 BouncyCastle,否则密钥从数据库或者配置加载会报错。如果生成就直接使用那不会报错。

import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.security.Security;
import java.util.Objects;/**** * @date 2025/11/5**/
public class SmBaseUtils {// 推荐 12 字节 IV(96位)public static final int IV_LENGTH = 12;// 128位 = 16字节public static final int KEY_LENGTH = 16;// GCM认证标签长度(位)public static final int GCM_TAG_LENGTH = 128;static {// 注册 BouncyCastle 提供者if (Objects.isNull(Security.getProvider(BouncyCastleProvider.PROVIDER_NAME))) {Security.addProvider(new BouncyCastleProvider());}}
}

3. SM2 密钥对对象

用于保存生成的公钥和私钥。

/**** * @date 2025/11/5**/
public class Sm2KeyPair {private final String publicKey;private final String privateKey;public Sm2KeyPair(final String publicKey, final String privateKey) {this.publicKey = publicKey;this.privateKey = privateKey;}public String getPublicKey() {return publicKey;}public String getPrivateKey() {return privateKey;}
}

4. 密钥生成工具类

支持 SM2 非对称密钥和 SM4 对称密钥的生成、校验。

import com.example.sm.dto.Sm2KeyPair;import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
import java.util.Base64;
import java.util.Objects;/**** * @date 2025/11/5**/
public class SmKeyGenUtils extends SmBaseUtils {/*** 生成 SM4 密钥(对称加密).** @return 密钥*/public static String generateSM4Key(int length) {byte[] key = new byte[length];new SecureRandom().nextBytes(key);return Base64.getEncoder().encodeToString(key);// return Hex.toHexString(key);}/*** 生成 SM2 密钥对(非对称加密).** @return 包含公钥和私钥的对象*/public static Sm2KeyPair generateSM2KeyPair() {try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1"), new SecureRandom());KeyPair keyPair = keyPairGenerator.generateKeyPair();String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());return new Sm2KeyPair(publicKey, privateKey);} catch (Exception e) {throw new RuntimeException("Failed to generate SM2 key pair", e);}}/*** 校验 SM4 密钥合法性(必须是 32 位十六进制).** @param key key* @return 校验sm4key是否有效*/public static boolean isValidSM4KeyHex(final String key) {return Objects.nonNull(key) && key.matches("^[0-9a-fA-F]{32}$");}/*** 校验 SM4 密钥合法性(Base64 编码,必须解码后为 16 字节).** @param key Base64 编码的密钥* @param length 秘钥长度* @return 是否为合法的 SM4 密钥*/public static boolean isValidSM4Key(final String key,final int length) {if (Objects.isNull(key)) {return false;}try {byte[] decodedKey = Base64.getDecoder().decode(key);return decodedKey.length == length;} catch (IllegalArgumentException e) {return false;}}
}

5. 加解密与摘要工具类

包含 SM2/SM3/SM4/AES-GCM 的加解密实现。支持 CBC 模式、GCM 模式、AEAD 等。

支持功能

  • SM2 公钥加密 / 私钥解密
  • SM3 摘要计算
  • SM4 对称加密(支持 CBC 和 GCM)
  • AES-GCM 加密解密
  • Base64 编码
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.digests.SM3Digest;
http://www.dtcms.com/a/573890.html

相关文章:

  • 文件网站建设高新公司网站建设哪家好
  • Zabbix企业级分布式监控系统(上)
  • 深度解析:接口性能优化实战指南
  • 站点创建成功html代码hr表示
  • 一、Netty-高并发IO底层原理(5种主要的IO模型)
  • 网站开发外包 验收c2c有哪些网站
  • Jenkins是什么
  • 建网站公司浩森宇特大连网络营销师招聘网
  • LeetCode - 杨辉三角 / 二叉树的最大深度
  • RV1126 NO.39:OPENCV查找图形轮廓并画框
  • 【第1章>第3节】基于FPGA的图像腐蚀处理算法的Verilog实现
  • 西安电子科技大学信息化建设处网站模板建站排版跟没缓存好似的
  • 神经网络—— 学习与感知器(细节补充)
  • tensorflow 图像分类 之一
  • 自己网站上做淘宝搜索引擎网站开发属于什么行业
  • 查询网站备案号网站如何做免费的推广
  • 编写一个DXE driver 提供遍历pcie设备配置空间的protocol
  • 随笔之工作方法的“术”
  • 淘宝上做进出口网站有哪些我男同同性做视频网站
  • LLM中的选择性注意:从人类聚焦到模型聚焦
  • 从成本到战略:金仓 KingbaseES 的多维度优势与企业数据库选型的核心考量
  • 做pc网站排wordpress载入慢
  • Java注解在Spring Boot中的详细原理与使用情况解析
  • Python + WebSocket 实现实时体育比分系统(含数据库设计与前端演示)
  • 揭阳智能模板建站网站转应用
  • 多个网站 备案吗工作室网站建设要多大内存
  • 借助 TX Text Control:在 .NET C# 中验证 PDF/UA 文档
  • 高光谱成像系统赋能烟叶分选(烟叶除杂、烟叶霉变、烟叶烟梗区分、烟叶等级分选)
  • Java NIO 深度解析:从 BIO 到 NIO 的演进与实战​
  • 聊聊AIoT开发效率与安全:从ARMINO IDK框架说起