常用加密算法之 SM4 简介及应用

2024-06-21 02:28

本文主要是介绍常用加密算法之 SM4 简介及应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、SM4 简介

SM4 是中国国家密码管理局提出的一种分组密码算法,也称为 SMS4。它属于对称加密算法,分组长度为 128 比特,密钥长度也为 128 比特。SM4 算法采用了与 AES 类似的轮函数结构,但具体的 S 盒和线性变换与 AES 不同,因此具有独特的加密性能。

1. 算法特点

分组长度:128 比特(16 字节)
密钥长度:128 比特(16 字节)
轮数:32 轮
安全强度:与 AES 相当,满足各种安全应用场景

2. 算法结构

SM4 算法主要由密钥扩展算法和轮函数(Round Function)组成。密钥扩展算法将 128 比特的密钥扩展成 32 个 32 比特的轮密钥。轮函数则通过非线性变换和线性变换对输入数据进行多轮迭代,最终输出加密结果。

3. 安全性

SM4 算法已经经过严格的数学分析和实际测试,证明了其具有较高的安全性。在同等密钥长度下,SM4 的安全性与 AES 相当,能够满足各种安全应用场景的需求。

二、Spring Boot集成SM4加密算法实战

1. 添加依赖

首先,需要在Spring Boot项目的 pom.xml 文件中添加Bouncy Castle库的依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version> <!-- 请使用最新版本 -->
</dependency>

2. 实现 SM4 帮助类

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;public class SM4Util {private static final String ALGORITHM = "SM4/CBC/PKCS5Padding";private static final String KEY = "your-128-bit-key-here"; // 密钥,长度必须是16字节private static final String IV = "your-iv-here"; // 初始化向量,长度必须是16字节/*** 生成SM4密钥** @return SecretKey 对象* @throws NoSuchAlgorithmException 如果找不到算法*/public static SecretKey generateKey() throws NoSuchAlgorithmException {KeyGenerator keyGenerator = KeyGenerator.getInstance("SM4");keyGenerator.init(128);return keyGenerator.generateKey();}/*** 加密数据** @param data 待加密的原始数据* @return 加密后的数据* @throws Exception 加密过程中可能抛出的异常*/public static String encrypt(String data) throws Exception {return encrypt(data, KEY, IV);}/*** 加密数据,允许自定义密钥和IV** @param data    待加密的原始数据* @param key     加密密钥* @param iv      初始化向量* @return 加密后的数据* @throws Exception 加密过程中可能抛出的异常*/public static String encrypt(String data, String key, String iv) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");SecureRandom random = new SecureRandom(key.getBytes());IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "SM4"), ivSpec);byte[] encryptedData = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedData);}/*** 解密数据** @param encryptedData 已加密的数据* @return 解密后的原始数据* @throws Exception 解密过程中可能抛出的异常*/public static String decrypt(String encryptedData) throws Exception {return decrypt(encryptedData, KEY, IV);}/*** 解密数据,允许自定义密钥和IV** @param encryptedData 已加密的数据* @param key           加密密钥* @param iv            初始化向量* @return 解密后的原始数据* @throws Exception 解密过程中可能抛出的异常*/public static String decrypt(String encryptedData, String key, String iv) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "SM4"), ivSpec);byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decryptedData);}
}
  1. 使用帮助类
    以下是如何使用SM4Util帮助类的示例:
public class SM4Demo {public static void main(String[] args) {try {// 待加密的原始数据String originalData = "Hello, World!";// 加密数据String encryptedData = SM4Util.encrypt(originalData);System.out.println("Encrypted: " + encryptedData);// 解密数据String decryptedData = SM4Util.decrypt(encryptedData);System.out.println("Decrypted: " + decryptedData);} catch (Exception e) {e.printStackTrace();}}
}

三、使用 Hutool 方式集成 SM4

  1. 引入 Hutool 工具 pom 依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version>
</dependency>
  1. 使用生成的随机密钥
String content = "test中文";// 随机生成密钥
SymmetricCrypto sm4 = SmUtil.sm4();String encryptHex = sm4.encryptHex(content);
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
  1. 使用自定义密钥
String content = "test中文frfewrewrwerwer---------------------------------------------------";// 生成自定义密钥
byte[] key = KeyUtil.generateKey(SM4.ALGORITHM_NAME, 128).getEncoded();SM4 sm4 = SmUtil.sm4(key);String encryptHex = sm4.encryptHex(content);
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

参考文献 :国密算法工具-SmUtil

这篇关于常用加密算法之 SM4 简介及应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079948

相关文章

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr