SM4算法过程

一、SM4算法介绍

​ 2012年3月,国家密码管理局正式公布了包含SM4分组密码算法在内的《祖冲之序列密码算法》等6项密码行业标准。与DES和AES算法类似,SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

​ SM4有很高的灵活性,所采用的S盒可以灵活地被替换,以应对突发性的安全威胁。算法的32轮迭代采用串行处理,这与AES中每轮使用代换和混淆并行地处理整个分组有很大不同。

二、SM4算法的完整过程

在这里插入图片描述

三、密钥处理

1、术法说明

加密密钥,SM4算法的加密密钥长度为128比特,将其分为四项,其中每一项都为为32位的字。表示为:
在这里插入图片描述
系统参数。其中每一项都为32位的字。表示为:
在这里插入图片描述
固定参数,用于密钥扩展算法。其中每一项都为32位的字。表示为:
在这里插入图片描述

轮密钥,其中每一项都为32位的字。轮密钥由加密密钥通过密钥扩展算法生成。表示为:
在这里插入图片描述

2、密钥扩展算法

将密钥的每个字分别与系统参数的每个字做异或运算得到(K0,K1,K2,K3),再将得到的后3个字与固定参数CK0做异或运算后进行函数T运算得到值C,最后将函数T运算得到的C与K0做异或运算就得到了第一轮的子密钥,也是下一轮密钥运算的K4。

所以密钥扩展算法可以有下面两个函数表示:

第一步:密钥与系统参数的异或:
在这里插入图片描述

第二步:获取子密钥:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1、函数T

如上图,可以大致分解为4步

1)、经过后3个字与固定参数异或后,得到的值A也为32位的字。

2)、将A拆分为4个8bit的字节进行S盒变换。该S盒是一个固定的8比特输入8比特输出的置换。

注:S盒变换与DES的类似,如下图,输入的8bit字节的前2位与后2位组合形成的值转换成16进制为S盒的行,也就是下标的x轴,中间的4位形成的值转换成的16进制为S盒的列,也就是下标的y轴。x,y轴确定的那一个值转换成的2进制为该S盒的输出。

例:输入01100101,取前4位0110转换成16进制为6,也就是对应的x轴为6。后4位的0101转换成16进制为5,对应的y轴也就为5。综合x,y找到S盒输出的值为58,即01011000
在这里插入图片描述

3)、将中间4个S盒的输出组成32位的值B。

4)、将B与左移13位及左移23位的B进行异或处理作为函数T的输出C。

四、明文处理

在这里插入图片描述

如上图,明文处理大致分解为3步:

1)、将128bit的明文分成4个32bit的字X1,X2,X3,X4。

2)、将上述得到的字进行32轮的轮操作。

3)、最后将进行过32轮操作的4个字进行反序变换后组成128bit的密文。

1、轮操作

在这里插入图片描述

该轮操作与密钥扩展算法类似,将明文拆分后的4个字的后3个字与该轮的子密钥进行异或处理,之后再经过一个函数T(函数T与密钥扩展中的函数T相同,只是后面的L处理变为B与左移2位及左移10位及左移18位及左移24位的B进行异或处理)得到C,之后再将明文拆分后的第一个字与C进行异或。

该轮操作的函数可简化成下面的函数:
在这里插入图片描述

<think>好的,我现在需要帮用户解决这个Java版本不兼容的问题。用户遇到的错误信息是“Caused by: java.lang.UnsupportedClassVersionError: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0”。首先,我得理解这个错误的原因。 根据错误提示,RepackageMojo这个类是用更高版本的Java编译的(class file version 61.0),而当前运行时环境只支持到版本52.0。Java的版本号对应关系我记得是,52对应Java 8,61对应Java 17。所以,问题应该是用户的项目使用了Spring Boot版本需要Java 17,但运行环境是Java 8。 接下来,我需要确定解决方案。可能的解决办法有两个方向:升级本地Java版本到17,或者降低Spring Boot版本使其兼容Java 8。但用户可能需要保持当前Java环境,或者项目必须使用特定Spring Boot版本,所以得提供两种选项。 首先,检查Java版本。用户需要确认JDK和JRE的环境变量是否正确。可能他们安装了多个版本,但默认使用的是旧版。需要指导他们如何通过命令行检查Java版本,比如`java -version`和`javac -version`。如果发现版本是8,就需要升级到17或更高。 其次,如果用户不能升级Java,可能需要降低Spring Boot的版本。需要查看Spring Boot版本与Java版本的对应关系。例如,Spring Boot 3.x需要Java 17+,而2.x支持Java 8。所以用户如果使用的是Spring Boot 3.x,降到2.x可能解决。同时,Maven插件版本也要对应调整,确保`spring-boot-maven-plugin`的版本与Spring Boot父POM一致。 此外,Maven的配置也可能影响构建工具使用的JDK版本。用户需要检查Maven的`pom.xml`中的`<java.version>`属性,确保设置为1.8,同时确认Maven本身使用的JDK是否为8。可能在IDE中,Maven配置了不同的JDK,需要检查设置。 最后,用户可能需要清理Maven缓存,因为旧的依赖可能残留导致问题。执行`mvn clean install -U`可以强制更新依赖。 总结步骤:检查并升级Java版本;或调整Spring Boot和Maven插件版本,确保兼容Java 8。同时验证环境变量和构建配置,确保一致性。可能还需要指导用户如何修改POM文件中的相关配置,并清理缓存。</think>### 错误原因分析 这个错误的核心是 **Java版本不兼容**,具体表现为: ``` Caused by: java.lang.UnsupportedClassVersionError: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 ``` 1. **版本号解读**: - `class file version 61.0` 对应 **Java 17**。 - `class file version 52.0` 对应 **Java 8**。 2. **根本原因**: - 你使用的 **Spring Boot Maven 插件**(`RepackageMojo`)是通过 **Java 17** 编译的。 - 但你的本地运行环境(JRE/JDK)版本是 **Java 8**,无法加载高版本编译的类文件。 --- ### 解决方案 #### 方法 1:升级本地 Java 版本 这是 **推荐方案**,因为 Spring Boot 3.0+ 已强制要求 Java 17+。 1. **步骤**: - 下载并安装 **JDK 17**([Oracle JDK](https://www.oracle.com/java/technologies/downloads/) 或 [OpenJDK](https://adoptium.net/))。 - 配置环境变量 `JAVA_HOME` 指向新 JDK 路径。 - 确保命令行中 `java -version` 和 `javac -version` 输出为 **17**。 - 清理项目并重新构建(`mvn clean install`)。 --- #### 方法 2:降级 Spring Boot 版本(兼容 Java 8) 如果因特殊原因必须使用 Java 8,需降低 Spring Boot 版本至 **2.x**。 1. **步骤**: - 在 `pom.xml` 中修改 Spring Boot 版本为 **2.7.x** 或更低: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <!-- 2.x 最后一个兼容 Java 8 的版本 --> </parent> ``` - 检查 Maven 插件版本是否兼容: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.18</version> <!-- 与父 POM 版本一致 --> </plugin> </plugins> </build> ``` - 清理项目并重新构建(`mvn clean install -U`)。 --- ### 验证环境配置 1. **检查 Java 版本**: ```bash java -version # 检查运行环境 javac -version # 检查编译环境 ``` 2. **检查 Maven 使用的 JDK**: - 在 Maven 的 `settings.xml` 或 IDE(如 IntelliJ/Eclipse)中确认 Maven 使用的 JDK 版本。 --- ### 常见问题排查 1. **多版本 JDK 冲突**: - 如果同时安装了多个 JDK,需确保 **PATH 环境变量优先级正确**(新版本路径在前)。 2. **IDE 配置问题**: - 在 IntelliJ/Eclipse 中,检查项目的 **Project SDK** 和 **Language Level** 是否匹配。 3. **Maven 缓存问题**: - 执行 `mvn clean install -U` 强制更新依赖。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值