常用加密算法之 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中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和