在分组密码(一)(分组密码(一))中介绍了分组密码的基础知识,在该章节中,我将介绍具体的密码方案,希望通过具体方案的学习,对分组密码有更深的认识。对于使用到的基础知识,在该章不再累述,有需要的朋友请看一下分组密码(一)中的基础知识。
在前面部分已有介绍,感兴趣的朋友可以看一下.
AES直通车:AES
DES直通车:DES
中华人民共和国国密行业标准 GM/T 0002-2012
SM4分组密码算法是一种迭代分组密码算法,采用非平衡Feistel结构,分组长度为128bit,密钥长度为128bit。该算法由初始变量算法和密钥扩展算法组成,都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。SM4分组密码算法可以抵抗穷举攻击、差分攻击、线性攻击等攻击手段。
密钥及密钥参量
加密密钥长度是128bit,表示为
M
K
=
(
M
K
0
,
M
K
1
,
M
K
2
,
M
K
3
)
MK=\left (MK_{0},MK_{1},MK_{2},MK_{3} \right )
MK=(MK0,MK1,MK2,MK3), ,其中
M
K
i
i
=
0
,
1
,
2
,
3
MK_{i} i=0,1,2,3
MKii=0,1,2,3为字(字为32比特字符串)。
轮密钥表示为
(
r
k
0
,
r
k
1
,
r
k
2
,
r
k
3
)
\left (rk_{0},rk_{1},rk_{2},rk_{3} \right )
(rk0,rk1,rk2,rk3),其中
r
k
i
i
=
0
,
1
,
2
,
3
rk_{i} i=0,1,2,3
rkii=0,1,2,3为32比特字。轮密钥由加密密钥生成。
F
K
=
(
F
K
0
,
F
K
1
,
F
K
2
,
F
K
3
)
FK=\left (FK_{0},FK_{1},FK_{2},FK_{3} \right )
FK=(FK0,FK1,FK2,FK3)为系统参数,
C
K
=
(
C
K
0
,
C
K
1
,
.
.
.
,
C
K
31
)
CK=\left (CK_{0},CK_{1},...,CK_{31} \right )
CK=(CK0,CK1,...,CK31)为固定参数,用于密钥扩展算法,其中
F
K
i
i
=
0
,
1
,
2
,
3
FK_{i} i=0,1,2,3
FKii=0,1,2,3,
C
K
i
i
=
0
,
.
.
.
,
31
CK_{i} i=0,...,31
CKii=0,...,31为字。
轮函数F
轮函数结构:
输入:
(
X
0
,
X
1
,
X
2
,
X
3
)
∈
(
Z
2
32
)
4
\left (X_{0},X_{1},X_{2},X_{3} \right )\in \left (Z_{2}^{32} \right )^{4}
(X0,X1,X2,X3)∈(Z232)4,轮密钥为
r
k
∈
Z
2
32
rk\in Z_{2}^{32}
rk∈Z232,
输出:
F
(
X
0
,
X
1
,
X
2
,
X
3
,
r
k
)
=
X
0
⊕
T
(
X
1
⊕
X
2
⊕
X
3
⊕
r
k
)
F\left (X_{0}, X_{1},X_{2},X_{3},rk\right )=X_{0}\oplus T\left ( X_{1}\oplus X_{2}\oplus X_{3}\oplus rk\right )
F(X0,X1,X2,X3,rk)=X0⊕T(X1⊕X2⊕X3⊕rk)
其中,T为合成置换函数。
T:
Z
2
32
→
Z
2
32
Z_{2}^{32}\rightarrow Z_{2}^{32}
Z232→Z232是一个可逆变换,由非线性变换
τ
\tau
τ 和线性变换L复合而成,即
T
(
.
)
=
L
(
τ
(
.
)
)
T(.)=L(\tau(.))
T(.)=L(τ(.))。
(1)非线性变换
τ
\tau
τ由4个并行的S盒构成
输入:
A
=
(
a
0
,
a
1
,
a
2
,
a
3
)
∈
(
Z
2
8
)
4
A=\left ( a_{0},a_{1},a_{2},a_{3}\right )\in \left ( Z_{2}^{8} \right )^{4}
A=(a0,a1,a2,a3)∈(Z28)4
输出:
B
=
(
b
0
,
b
1
,
b
2
,
b
3
)
∈
(
Z
2
8
)
4
B=\left ( b_{0},b_{1},b_{2},b_{3}\right )\in \left ( Z_{2}^{8} \right )^{4}
B=(b0,b1,b2,b3)∈(Z28)4
其中,
(
b
0
,
b
1
,
b
2
,
b
3
)
=
τ
(
A
)
=
(
S
b
o
x
(
a
0
)
,
S
b
o
x
(
a
1
)
,
S
b
o
x
(
a
2
)
,
S
b
o
x
(
a
3
)
)
\left ( b_{0},b_{1},b_{2},b_{3}\right )=\tau(A)=(Sbox(a_{0}),Sbox(a_{1}),Sbox(a_{2}),Sbox(a_{3}))
(b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3)),Sbox为S盒。
举例:
a
0
=
E
F
∈
Z
2
8
a_{0}=EF\in Z_{2}^{8}
a0=EF∈Z28,则
S
b
o
x
(
a
0
)
=
84
∈
Z
2
8
Sbox(a_{0})=84\in Z_{2}^{8}
Sbox(a0)=84∈Z28
方法:找表格的第E行第F列即为S盒输出。
(2)线性变换L
非线性变换
τ
\tau
τ的输出是线性变换L的输入。
输入:
B
∈
Z
2
32
B\in Z_{2}^{32}
B∈Z232
输出:
C
=
L
(
B
)
=
B
⊕
(
B
<
<
<
2
)
⊕
(
B
<
<
<
10
)
⊕
(
B
<
<
<
18
)
⊕
(
B
<
<
<
24
)
C=L\left ( B \right )=B\oplus \left ( B<<<2 \right )\oplus \left ( B<<<10 \right )\oplus \left ( B<<<18 \right )\oplus \left ( B<<<24 \right )
C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)
其中,<<
算法描述
加密算法:
本加密算法由32次迭代运算和1次反序变换R组成。
明文输入:
(
X
0
,
X
1
,
X
2
,
X
3
)
∈
(
Z
2
32
)
4
\left (X_{0},X_{1},X_{2},X_{3} \right )\in \left (Z_{2}^{32} \right )^{4}
(X0,X1,X2,X3)∈(Z232)4
密文输出:
(
Y
0
,
Y
1
,
Y
2
,
Y
3
)
∈
(
Z
2
32
)
4
\left (Y_{0},Y_{1},Y_{2},Y_{3} \right )\in \left (Z_{2}^{32} \right )^{4}
(Y0,Y1,Y2,Y3)∈(Z232)4
轮密钥为:轮密钥为
r
k
i
∈
Z
2
32
,
i
=
0
,
1
,
.
.
.
,
31
rk_{i}\in Z_{2}^{32},i=0,1,...,31
rki∈Z232,i=0,1,...,31
加密流程:
(1)、32次迭代运算:
X
i
+
4
=
F
(
X
i
,
X
i
+
1
,
X
i
+
2
,
X
i
+
3
,
r
k
i
)
,
i
=
0
,
1
,
.
.
.
,
31
X_{i+4}=F\left ( X_{i},X_{i+1},X_{i+2},X_{i+3},rk_{i} \right ),i=0,1,...,31
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1,...,31
(2)、反序变换:
(
Y
0
,
Y
1
,
Y
2
,
Y
3
)
=
R
(
X
32
,
X
33
,
X
34
,
X
35
)
=
(
X
35
,
X
34
,
X
33
,
X
32
)
\left (Y_{0}, Y_{1},Y_{2},Y_{3} \right )= R\left ( X_{32},X_{33},X_{34},X_{35} \right )=\left ( X_{35},X_{34},X_{33},X_{32} \right )
(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)
解密算法:
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序、解密时,使用轮密钥序
r
k
31
,
r
k
30
,
.
.
.
,
r
k
0
rk_{31},rk_{30},...,rk_{0}
rk31,rk30,...,rk0。
密钥扩展算法
由加密密钥生成轮密钥的方法。
加密密钥为
M
K
=
(
M
K
0
,
M
K
1
,
M
K
2
,
M
K
3
)
∈
(
Z
2
32
)
4
MK=\left (MK_{0},MK_{1},MK_{2},MK_{3} \right )\in \left (Z_{2}^{32} \right )^{4}
MK=(MK0,MK1,MK2,MK3)∈(Z232)4
轮密钥生成算法:
(
K
0
,
K
1
,
K
2
,
K
3
)
=
(
M
K
0
⊕
F
K
0
,
M
K
1
⊕
F
K
1
,
M
K
2
⊕
F
K
2
,
M
K
3
⊕
F
K
3
)
\left ( K_{0},K_{1},K_{2},K_{3}\right )=\left ( MK_{0}\oplus FK_{0},MK_{1}\oplus FK_{1},MK_{2}\oplus FK_{2},MK_{3}\oplus FK_{3} \right )
(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3),
r
k
i
=
K
i
+
4
=
K
i
⊕
T
′
(
K
i
+
1
⊕
K
i
+
2
⊕
K
i
+
3
⊕
C
k
i
)
,
i
=
0
,
1
,
.
.
.
,
31
rk_{i}=K_{i+4}=K_{i}\oplus T'\left ( K_{i+1}\oplus K_{i+2}\oplus K_{i+3}\oplus Ck_{i} \right ),i=0,1,...,31
rki=Ki+4=Ki⊕T′(Ki+1⊕Ki+2⊕Ki+3⊕Cki),i=0,1,...,31
其中,T’为前面加密算法介绍的函数T中线性变换L代替成L’
L
′
(
B
)
=
B
⊕
(
B
<
<
<
13
)
⊕
(
B
<
<
<
23
)
L'\left ( B \right )=B\oplus \left ( B<<<13 \right )\oplus \left ( B<<<23 \right )
L′(B)=B⊕(B<<<13)⊕(B<<<23)。
FK初始值:
F
K
0
FK_{0}
FK0=(A3B1BAC6),
F
K
1
FK_{1}
FK1=(56AA3350),
F
K
2
FK_{2}
FK2=(677D9197),
F
K
3
FK_{3}
FK3=(B27022DC);