常用加密算法之 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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作