SM4分组密码算法
1. SM4算法定义
SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。
-
该算法的分组长度为128比特,密钥长度为128比特。(十六进制表示则为32位,明文和密钥等长)
-
加密算法与密钥扩展算法都采用32轮非线性迭代结构。
-
密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
-
数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
2. SM4算法的优势
国密算法SM4有安全高效的特点,在设计与实现方面有以下优势:
- 对合运算:解密算法与加密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
- 子密钥生成算法与加密算法结构类似,在设计上做到资源重用。
- 加密算法与密钥扩展算法都采用32轮非线性迭代结构,将128位的明文、密钥通过32次循环的非线性迭代运算得到最终结果。
3. 加密算法流程
整体流程框架:
或者参考
北卡科技的博客中的流程图:
SM4算法结构:
轮密钥生成:
32次非线性迭代:
3.1. 密钥扩展算法
密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
轮密钥 生成方法:
。
合成置换 是一个可逆变换,由非线性变换 和线性变换 复合而成,即 。
线性变换 : ,其中 表示32位循环左移 位。
非线性变换 : , 由4个并行的S盒构成。
S盒为固定的8比特输入8比特输出的置换,记为 。
轮密钥由加密密钥生成。
为系统参数[^1], 为固定参数[^2],用于密钥扩展算法,其中 、 为字。
[^1]:系统参数 的取值为: 。
[^2]:固定参数 的取值方法为:设 为 的第 字节(),即 ,则 。
固定参数 具体值为:
00070E15 | 1C232A31 | 383F464D | 545B6269 |
70777E85 | 8C939AA1 | A8AFB6BD | C4CBD2D9 |
E0E7EEF5 | FC030A11 | 181F262D | 343B4249 |
50575E65 | 6C737A81 | 888F969D | A4ABB2B9 |
C0C7CED5 | DCE3EAF1 | F8FF060D | 141B2229 |
30373E45 | 4C535A61 | 686F767D | 848B9299 |
A0A7AEB5 | BCC3CAD1 | D8DFE6ED | F4FB0209 |
10171E25 | 2C333A41 | 484F565D | 646B7279 |
非线性变换
例如输入为 ,则该 变换应为:。()
3.2. 轮函数 · 32次迭代
轮函数 生成方法:
合成置换 是一个可逆变换,由非线性变换 和线性变换 复合而成,即 。
线性变换 : 。
非线性变换 : , 由4个并行的S盒构成。
3.3. 反序变换
4. 解密算法
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。
解密时,使用轮密钥序 。
5. 小结
先将128比特密钥 扩展为32个轮密钥 ,再将该轮密钥与128比特明文 经过轮函数进行32次迭代后,选取最后四次迭代生成的结果 进行反序变换,该变换结果作为最终的密文 输出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!