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

Java 实现 SM4 加密解密

一、SM4 算法简介
SM4 是中国国家密码管理局于 2012 年发布的一种对称加密算法,属于分组密码算法。它的分组长度为 128 位(16 字节),密钥长度同样为 128 位(16 字节)。SM4 算法具有较高的安全性和性能,在国内多个领域得到广泛应用。
二、依赖库
要在 Java 中使用 SM4 算法,可借助 Bouncy Castle 库。在 Maven 项目里,需在 pom.xml 文件添加如下依赖:
xml

<dependency>   <groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version>
</dependency>

三、示例代码
java

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;public class SM4Example {private static final String ALGORITHM_NAME = "SM4";private static final String ALGORITHM_MODE = "SM4/ECB/PKCS5Padding";
static {Security.addProvider(new BouncyCastleProvider());
}/*** 生成 SM4 密钥* @return 密钥的 Base64 编码字符串* @throws Exception 异常*/
public static String generateKey() throws Exception {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, "BC");kg.init(128);SecretKey secretKey = kg.generateKey();return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}/*** SM4 加密* @param plainText 明文* @param key 密钥的 Base64 编码字符串* @return 密文的 Base64 编码字符串* @throws Exception 异常*/
public static String encrypt(String plainText, String key) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(key);SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC");cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedBytes);
}/*** SM4 解密* @param cipherText 密文的 Base64 编码字符串* @param key 密钥的 Base64 编码字符串* @return 明文* @throws Exception 异常*/
public static String decrypt(String cipherText, String key) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(key);SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);byte[] cipherBytes = Base64.getDecoder().decode(cipherText);byte[] decryptedBytes = cipher.doFinal(cipherBytes);return new String(decryptedBytes, StandardCharsets.UTF_8);
}public static void main(String[] args) {try {// 生成密钥String key = generateKey();System.out.println("生成的密钥: " + key);// 明文String plainText = "Hello, SM4!";System.out.println("明文: " + plainText);// 加密String cipherText = encrypt(plainText, key);System.out.println("密文: " + cipherText);// 解密String decryptedText = decrypt(cipherText, key);System.out.println("解密后的明文: " + decryptedText);} catch (Exception e) {e.printStackTrace();}
}

}
四、代码解释
依赖引入:借助 Bouncy Castle 库实现 SM4 算法,在代码开头添加该库的提供者。
常量定义:定义了算法名称 ALGORITHM_NAME 和算法模式 ALGORITHM_MODE。
生成密钥:generateKey 方法用于生成 128 位的 SM4 密钥,并将其转换为 Base64 编码的字符串。
加密方法:encrypt 方法接收明文和密钥,先对密钥进行 Base64 解码,再用 Cipher 类进行加密操作,最后把加密结果转换为 Base64 编码的字符串。
解密方法:decrypt 方法接收密文和密钥,对密文和密钥进行 Base64 解码,使用 Cipher 类进行解密操作,最终返回解密后的明文。
主方法:在 main 方法中,生成密钥,对明文进行加密,然后对密文进行解密,最后输出相关信息。
五、运行示例
运行上述代码,输出结果类似如下:
plaintext
生成的密钥: 8Q+J8p5J+6x6J8l7J8p5J8=
明文: Hello, SM4!
密文: 4a7j8J8l7J8p5J8=
解密后的明文: Hello, SM4!

通过上述步骤,你可以在 Java 中实现 SM4 加密解密功能。

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

相关文章:

  • SpringAI实现AI应用-搭建知识库
  • GPU集群搭建
  • BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来
  • Compose笔记(二十)--TextField
  • (31)VTK C++开发示例 ---绘制立方体
  • 第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
  • C++好用的打印日志类
  • 2025.4.24 JavaScript 基础学习笔记
  • [特殊字符] 蓝桥杯省赛全解析:含金量、获奖难度、参赛意义与发展价值全面剖析
  • 精华贴分享|【零敲碎打12】类筹码数据构建-散户行为倾向
  • react初学踏坑记录-if(number)到底过滤了什么
  • leetcode0075. 颜色分类-medium
  • 数学:拉马努金如何想出计算圆周率的公式?
  • 大连理工大学选修课——机器学习笔记(3):KNN原理及应用
  • 【中间件】bthread效率为什么高?
  • 12.Three.js 中的 DirectionalLight(平行光)详解指南
  • Python第四周作业
  • 软件系统验收报告:功能、性能稳定性如何?数据导出卡顿咋回事?
  • SpringBoot使用Mybatis-Plus分页无效
  • 云蝠智能大模型呼叫,音色升级啦!
  • 这些是什么充电模块调试手段,对USB、Thermal、DP
  • 【Agent】MCP协议 | 用高德MCP Server制作旅游攻略
  • Compose Multiplatform+Kotlin Multiplatfrom 第六弹跨平台 AI应用
  • 大屏/门户页面兼容各种分辨率或电脑缩放
  • C++初阶-string类1
  • 手动实现二叉搜索树
  • AGI时代来临?2030年AI将如何改变人类社会?
  • Spark SQL 之 DAG
  • Linux容器大师:K8s集群部署入门指南
  • 校平机:金属板材加工的核心设备