概述
SM4算法是国密算法中的对称算法.
术语和定义
分组长度 block length
一个信息分组的比特位数
密钥长度
密钥的比特位数 key length
密钥扩展算法 key expansion algorithm
将密钥变换为轮密钥的运算单元
轮数 rounds
轮函数的迭代次数
字 word
长度为32比特的组(串)
S盒 S-box
固定的8比特输入8比特输出的置换记为Sbox(⋅).
符号和缩略语
⨁ 32比特异或
«<i 32比特循环左移i位
算法结构
SM4密码算法是一个分组算法,分组长度为126比特,密钥长度为128比特.加密算法与密钥扩展算法都采用32轮非线性迭代结构.数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序.
密钥及密钥参量
加密密钥长度为128比特,表示为 MK=(MK0,MK1,MK2,MK3)
轮密钥表示为 (rk0,rk1,rk2…rk31,) ,其中rki(i=0,1,2…31) 为32比特字.轮密钥由加密密钥生成.
FK=(FK0,FK1,FK2,FK3) 为系统参数, CK=(CK0,CK1…CK31) 为字.
轮函数 F
轮函数结构
设输入为 (X0,X1,X2,X3)∈(Z232)4,轮密钥为rk∈(Z232),则轮函数F为:F=(X0,X1,X2,X3,rk)=X0⨁(X1⨁X2⨁X3⨁rk)
合成置换T
T:Z232 -> Z232是一个可逆变换,由非线性变换t和线性变换L符合而成.即T(⋅) = L(t(⋅)
非线性变换 t
t由4个并行的S盒构成:
算法描述
加密算法
本加密算法由32次迭代运算和1次反序变换R组成.
设明文输入为 (X0,X1,X2,X3)∈(Z232)4,密文输出为 (Y0,Y1,Y2,Y3)∈(Z232)4,轮密钥为 rki∈Z232,i=0,1…31,加密算法的运算过程如下:
- 32次迭代运算: Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1…31;
- 反序变换: (Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32).
解密算法
解密变换和加密变换结构相同,不同的是轮密钥的使用顺序.解密时的轮密钥序 (rk31,rk30…rk0).
密钥扩展算法
轮密钥由加密密钥通过密钥扩展算法生成. 加密密钥MK=(MK0,MK1,MK2,MK3)∈(Z232)4,轮密钥生成方法为:(K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3),
rki=Ki+4=Ki⨁T`(Ki+1⨁Ki+2⨁Ki+3,Ki+4⨁CKi), i=0,1,…31.
其中:
-
T` 是将合成置换中的T的线性变换L置换为 L`
L`(B)=B⨁(B«<13)⨁(B«<23);
-
系统参数FK的取值为:
FK<sub>0</sub>=(A3B1BAC6)
FK<sub>1</sub>=(56AA3350)
FK<sub>2</sub>=(677D9197)
FK<sub>3</sub>=(B27022DC)
- 固定参数CK的取值方法为:
设 cki,j 为 CKi 的第 j字节(i=0,1..31,j=0,1,2,3),即CKi=(cki,0,cki,1,cki,2,cki,3)∈(Z28)4, 则 cki,j=(4i+j)X7(mod256).
固定参数*CKi(i=0,1…31)具体值为:
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。
示例
输入参数以及固定参数
输入明文:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
(X0,X1,X2,X3)= (01234567,89ABCDEF,FEDCBA98,76543210) 4比特*8*4 = 128比特
输入密钥:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 > *MK=(MK<sub>0</sub>,MK<sub>1</sub>,MK<sub>2</sub>,MK<sub>3</sub>)=(01234567,89ABCDEF,FEDCBA98,76543210)* 4比特\*8*4 = 128比特
系统参数:
FK0=(A3B1BAC6),FK1=(A3B1BAC6),FK2=(A3B1BAC6),FK3*=(A3B1BAC6).
固定参数:
CKi(i=0,1…31) 由公式生成,见上面.
加密流程:
加密准备
(K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3)=(a292ffa1,df01febf,99a12b0f,c42410cc).
初始化轮密钥
rki=Ki+4=Ki⨁T`(Ki+1⨁Ki+2⨁Ki+3,Ki+4⨁CKi), i=0,1,…31.
T`(A)=L`(t(A))
L`(A)=A⨁(A«<13)⨁(A«<23)
A=(a0,a1,a2,a3)∈(Z28)4
t(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))
rk0=K4=f12186f9
…
rk31=K35=9124A012
生成加密结果
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1…31;
F=(X0,X1,X2,X3,rk)=X0⨁T(X1⨁X2⨁X3⨁rk)
T(A)=L(t(A))
L(A)=A⨁(A«<2)⨁(A«<10)⨁(A«<18)⨁(A«<24)
A=(a0,a1,a2,a3)∈(Z28)4
t(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))
X4=27FAD345
…
X35=681EDF34
取反得到结果
(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)=(681EDF34 D206965E 86B3E94F 536E4246).
加密模式
IV
IV,Initialization Vector是许多任务作模式中用于将加密随机化的一个位块,由此即使同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程。
初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。
对于CBC和CFB,重用IV会导致泄露明文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。
另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。
填充
有的模式支持对非128比特整的数据进行加密,有的模式不支持,填充是用各种可以恢复的方法把数据流填充为128比特整.
设数据流还差n字节
在数据流结尾填充n字节n(如果n=0,填充16字节16)
ECB模式
最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密:
在特定情况下ecb模式会有风险,例如:
CBC模式
1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量.
加密过程:
Ci=EK(Pi⨁Ci-1)
C0=IV
解密过程: Pi=DK(Ci)⨁Ci-1
C0=IV
ps:加密时先异或再加密,解密时先解密再异或
缺点: 加密无法并行,解密可以.
PCBC模式
和CBC模式的区别是,使用上一组的明文和密文异或作为下一组的IV.
CFB模式
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作模式亦非常相似.加解密过程如下:
Ci=EK(Ci-1)⨁Pi
Pi=EK(Ci-1)⨁Ci
C0=IV 块密码变为流密码是指这个模式可以对非128比特的数据进行加密
cfb有cfb128 cfg8 cfb1 3个模式,主要区别是每隔1 8 128位即对数据进行一次加密
- 使用加密器加密IV的数据;
- 将明文的最高1/8/128位与IV的最高1/8/128位异或得到1/8/128位密文;
- 将IV数据左移1/8/128位,最低1位用刚刚计算得到的1/8/128位密文补上。
ofb模式
output feedback ofb模式是先用块加密器生成密钥流,然后将密钥流和明文流异或得到密文流,解密过程是重新异或一次.
加密不能并行,解密可以
可以一次计算出所有的密钥流,每次加解密只需要做异或操作.
如果已经计算出所有的密钥流,可以并行的进行加解密.
ctr模式
Counter mode,CM ctr模式是使用随机数等方式产生一个IV`和IV拼接成一个串,对这个串加密,然后和明文做异或操作.
使用计数器是常用的做法,但有人评价说计数器比其他随机算法风险更高.
ctr模式支持并行的加解密.