SM4算法加密流程

本文详细介绍了SM4密码算法,包括数据分组长度128位,密钥长度128位,以及密码结构中的滑动窗口结构。加密过程分为明文加密和密钥扩展两部分,涉及32轮非线性迭代,S盒字节非线性替换,字线性部件L变换等操作。密钥扩展算法通过32个固定参数生成轮密钥,用于每轮加密。整个过程展示了SM4算法的安全性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分组长度

 

数据分组(明文,密文)长度=128位、密钥长度=128位
数据处理单位:字(32位)(32bit)

密码算法特点

对合运算:解密算法与加密算法相同 解密算法与加密算法相同
子密钥生成算法与加密算法结构类似 (加密算法与密钥扩展算法均采用32轮非线性迭代结构

密码结构

滑动窗口结构

SM4 密码算法结构

加密流程还是分为两部分:明文加密部分与密钥扩展部分(每次密钥的生成)

明文加密部分

  • 输入明文:(X0,X1,X2,X3),128位,四个字。
  • 输入轮密钥:rki ,i=0,1,…,31,共32个轮密钥。
  • 输出密文:(Y0,Y1,Y2,Y3),128位,四个字。

 Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)【F为轮函数】
= Xi ⊕T( Xi+1⊕ Xi+2⊕ Xi+3⊕rki), i = 0,1…31 
(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)【注意最后的反序】

 

F轮函数部分(经过32轮迭代)

1.S盒字节非线性替换(非线性变换τ)

  1. 把128bit明文分为4个32位字(X0,X1,X2,X3)
  2. X1,X2,X3,rK相互异或得到32位字
  3. 将这32位字并行输入5*4个S盒

输入的前半字节为行号,后半字节为列号,行列交叉点处的数据即为输出。(查S盒,与AES的字节替换类似

2.字线性部件L变换

  1. 输出的结果再进行循环左移;
  2. 最后与X0进行异或。

32位输入,32位输出。
设输入为B,输出为C,表为:
C=L(B)
运算规则:
C=L(B)
=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18) ⊕(B<<<24)

X4=C⊕X0

并将输出结果添加到明文的最后一个字后,进入第二次轮函数……直到第32轮函数执行完毕。最后四次经过轮函数得到的(X35 X34 X33 X32)4个32位字即为密文。

密钥扩展部分(密钥的生成)

常数FK
在密钥扩展中使用一些常数,4个常数
FK0=(A3B1BAC6) =(A3B1BAC6)
FK1=(56AA3350) =(56AA3350)
FK2=(677D9197 ) =(677D9197 )
FK3=(B27022DC) =(B27022DC)
三、SMS4密码算法20
⑹密钥扩展算法
32个固定参数Cki,i=0,1,2…31
00070e15, 1c232a31, 383f464d, 545b6269, 00070e15, 1c232a31, 383f464d, 545b6269,
70777e85, 8c939aa1, a8afb6bd, c4cbd2d9, 70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
e0e7eef5, fc030a11, 181f262d, 343b4249, e0e7eef5, fc030a11, 181f262d, 343b4249,
50575e65, 6c737a81, 888f969d, a4abb2b9, 50575e65, 6c737a81, 888f969d, a4abb2b9,
c0c7ced5, dce3eaf1, f8ff060d, 141b2229, c0c7ced5, dce3eaf1, f8ff060d, 141b2229,
30373e45, 4c535a61, 686f767d, 848b9299, 30373e45, 4c535a61, 686f767d, 848b9299,
a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209, a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209,
10171e25, 2c333a41, 484f565d, 646b7279 10171e25, 2c333a41, 484f565d, 646b7279

  • 输入加密密钥:MK=(MK0,MK1,MK2,MK3)
  • 输出轮密钥:rki ,i=0,1…,30,31
  • 中间数据:Ki,i=0,1, …, 34,35

输入加密密钥MK=(MK0,MK1,MK2,MK3)

  (K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)

  For  i=0,1…,30,31 Do

            rki=Ki+4=Ki⊕T’(Ki+1⊕Ki+2⊕Ki+3⊕CKi)

           说明:T’变换与加密算法轮函数中的T基本相同,只将其中的线性变换L修改为以下:L’(B)=B⊕(B<<<13)⊕(B<<<23)

rki就是我们每轮加密要的密钥

### SM4 加密解密流程 SM4 是一种分组密码算法,其加密和解密过程遵循特定的结构化流程。虽然具体的图形表示未直接提供,可以基于已知的信息描述该流程。 #### 加密阶段 1. **初始设置** - 使用固定的轮常量表初始化。 - 密钥扩展生成子密钥序列用于各轮变换[^1]。 2. **数据预处理** - 明文被分割成固定长度的数据块(通常为128位),如果最后一块不足,则需填充至满长。 3. **迭代变换** - 对每一个明文块执行多轮非线性转换操作,每一轮都涉及到S盒替换、移位以及异或运算等基本操作,并结合当前轮次对应的子密钥进行混合计算。 4. **最终输出** - 经过预定数量的轮次后得到密文块并按顺序组合形成完整的密文串。 #### 解密阶段 为了能够成功恢复原始消息,整个逆向工程必须严格匹配上述正向过程中的参数配置: - 同样的密钥调度机制来重新构建相同的子密钥集; - 反转所有应用于加扰步骤的操作顺序——即先做最后一步的反函数再逐步向前推进直至完全还原输入状态; - 特别的,在此过程中依然依赖于同一套定义好的数学模型完成必要的映射关系调整工作以确保唯一性和准确性。 对于更直观的理解,建议查阅专业的安全技术文档或者官方标准说明获取详细的图表资料。此外,也可以参考开源项目实现了解具体编码细节。 ```python def sm4_encrypt(plaintext, key): """模拟SM4加密过程""" # 初始化环境变量... def round_function(state, subkey): # 实现单轮变换逻辑... state = prepare_data(plaintext) keyschedule = expand_key(key) for i in range(number_of_rounds): state = round_function(state, keyschedule[i]) ciphertext = finalize_output(state) return ciphertext def sm4_decrypt(ciphertext, key): """模拟SM4解密过程""" # 类似于sm4_encrypt但反转了某些内部调用... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值