SMS4 密码算法
本算法是一个分组算法。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算
法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮
密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
1. 术语说明
1.1 字与字节
用 eZ 2 表示 e-比特的向量集, 32
2Z 中的元素称为字, 8
2Z 中的元素称为字节。
1.2 S 盒
S 盒为固定的 8 比特输入 8 比特输出的置换,记为 Sbox(.)。
1.3 基本运算
在本算法中采用了以下基本运算:
⊕ 32 比特异或
<<< i 32 比特循环左移 i 位
1.4 密钥及密钥参量
加密密钥长度为 128 比特,表示为 MK=(MK0, MK1, MK2, MK3),其中 MKi(i=0,1,2,3)为
字。
轮密钥表示为(rk0, rk1, …, rk31),其中 rki(i=0,…,31)为字。轮密钥由加密密钥生成。
FK=(FK0, FK1, FK2, FK3)为系统参数,CK=(CK0, CK1,…, CK31)为固定参数,用于密钥扩
展算法,其中 FKi(i=0,…,3)、CKi(i=0,…,31)为字。
2. 轮函数 F
本算法采用非线性迭代结构,以字为单位进行加密运算,称一次迭代运算为一轮变换。
设输入为
(
XXXX
,
,
,
0
1
2
)
∈
(
Z
32
2
4
)
3
,轮密钥为
rk ∈ ,则轮函数 F 为:
2Z
32
XXXXF
(
,
,
,
2
1
0
,
rk
)
=
X
⊕
XT
(
⊕
1
X
2
⊕
X
3
0
3
⊕
rk
)
1
2.1 合成置换 T
Z → ,是一个可逆变换,由非线性变换 τ 和线性变换 L 复合而成,即 T(.)=L(τ(.))。
Z
T:
32
2
32
2
2.1.1 非线性变换τ
τ 由 4 个并行的 S 盒构成。
)
aaaa
,
0
设输入为
A
=
(
,
,
3
2
1
∈
(
Z
)
48
2
, 输出为
B
=
(
bbbb
,
3
0
,
,
2
1
)
∈
(
Z
)
48
2
,则
(
bbbb
0
3
,
,
,
2
1
)
(
= τ
A
)
=
(
Sbox
(
a
),
Sbox
(
a
1
),
Sbox
(
a
),
Sbox
(
a
))
3
2
0
2.2.2 线性变换 L
非线性变换 τ 的输出是线性变换 L 的输入。设输入为
2ZB ∈ ,输出为
32
2ZC ∈ ,则
32
BLC
=
(
)
⊕=
B
(
B
<<<
)2
⊕
(
B
<<<
)10
⊕
(
B
<<<
)18
⊕
(
B
<<<
)24
2.2 S 盒
S 盒中数据均采用 16 进制表示。
0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
2
e9
9a
50
1c
a7
81
0e
46
8a
5d
e2
37
af
31
97
7d
1
90
67
42
b3
07
6b
24
00
bf
ae
f6
db
1b
c1
69
f0
e
0
2c
d6
06
2b
ac
9c
3f
e4
4f
47
9d
68
78
1e
c8
d4
15
ea
b1
e0
4e
1d
5b
d5
5a
8d
b4
0a
c6
89
18
39
例:输入‘ef’,则经 S 盒后的值为表中第 e 行和第 f 列的值,Sbox(‘ef’)= ‘84’。
d
fb
86
cf
8f
85
56
21
c4
61
8c
53
6c
10
e5
6e
cb
4
cc
2a
91
c9
f3
71
63
9f
40
9b
82
de
bb
a5
0c
3a
3
fe
76
f4
a9
fc
b2
5e
57
d2
a4
2e
45
92
88
4a
ec
c
28
49
ed
75
e6
70
01
a0
f9
f5
0d
6d
1f
b8
c5
d7
8
16
aa
33
80
83
f8
25
4c
a3
ad
c0
03
11
2d
65
79
b
c2
26
43
fa
19
4b
3b
e7
ce
30
ab
72
41
12
09
3e
a
14
13
0b
94
3c
0f
7c
02
f2
32
23
6a
5c
d0
f1
5f
7
b7
c3
7a
95
ba
8b
a2
52
b5
55
60
2f
7f
bd
7e
20
5
e1
be
ef
08
73
64
58
d3
c7
34
66
fd
dd
cd
96
dc
9
b6
44
54
df
59
eb
22
36
f7
93
29
ff
d9
74
b9
ee
6
3d
04
98
e8
17
da
d1
27
38
1a
ca
8e
bc
7b
77
4d
f
05
99
62
a6
a8
35
87
9e
a1
e3
6f
51
d8
b0
84
48
2
3. 加/解密算法
0
1
,
,
(
定义反序变换 R 为:
AAAAR
,
(
=
(
,
1
31,
,2,1,0
设明文输入为
)
,
∈
Z
=
i
2
0
,32
2
=
XXF
(
,
i
i
+
YYYY
(
,
0
3
4
,
,
2
1
)
=
L
X
,
i
1
+
XR
(
为
rki
X
,
,
3
2
XXXX
AAAA
,
0
3
Z
(
1
∈
)
,
)
32
2
3
2
,
)
4
Ai
∈
Z
,32
2
i
,密文输出为
3,2,1,0
=
。
YYYY
(
,
,
,
0
3
2
1
)
∈
(
Z
32
2
)
4
,轮密钥
。则本算法的加密变换为:
,
rk
)
⊕=
X
i
XT
(
⊕
1
X
i
⊕
X
i
+
3
⊕
rk
i
,)
i
,1,0
L=
.13,
,
X
i
X
33
+
,
3
X
i
+
32
2
,
i
,
X
)
=
(
X
,
35
35
34
,
X
34
33
)
32
。
i
+
X
+
,
2
X
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。
加密时轮密钥的使用顺序为:(rk0, rk1, …, rk31)
解密时轮密钥的使用顺序为:(rk31, rk30, …, rk0)
4. 密钥扩展算法
本算法中加密算法的轮密钥由加密密钥通过密钥扩展算法生成。
2Z ,i=0,1,2,3;
加密密钥 MK=(MK0, MK1, MK2, MK3),MKi∈ 32
令 Ki∈ 32
i
,
=
首先,(K0,K1,K2,K3)=(MK0 FK⊕ 0,MK1 FK⊕ 1,MK2 FK⊕ 2,MK3 FK⊕ 3)
2Z ,i=0,1,…,35,轮密钥为
,1,0
rk i
31,
L
32
2
∈
Z
,则轮密钥生成方法为:
然后,对
=i
,2,1,0
31,
:
L
rk
i
=
K
i
+
4
=
K
i
′⊕
KT
(
⊕
K
i
+
2
⊕
K
i
+
3
⊕
CK
)
i
i
+
1
说明:
(1) 'T 变换与加密算法轮函数中的 T 基本相同,只将其中的线性变换 L 修改为以下 'L :
'L (B)=B○+ (B <<< 13)○+ (B <<< 23);
(2)系统参数 FK 的取值,采用 16 进制表示为:
FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC)
(3)固定参数 CK 的取值方法为:
设 cki,j 为 CKi 的第 j 字节(i=0,1,…,31;j=0,1,2,3),即 CKi = (cki,0,cki,1,cki,2,cki,3) ∈
(Z ,
2 )
48
则 cki,j = (4i+j)×7(mod 256)。32 个固定参数 CKi,其 16 进制表示为:
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
5. 加密实例
以下为本算法 ECB 工作方式的运算实例,用以验证密码算法实现的正确性。其中,数
据采用 16 进制表示。
实 例 一 : 对 一 组 明 文 用 密 钥 加 密 一 次
明 文 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
加 密 密 钥 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
轮 密 钥 与 每 轮 输 出 状 态 :
rk[ 0] = f12 186f9 X[ 0 ] = 27f ad345
rk[ 1] = 416 62b61 X[ 1 ] = a18 b4cb2
rk[ 2] = 5a6 ab19a X[ 2 ] = 11c 1e22a
rk[ 3] = 7ba 92077 X[ 3 ] = cc1 3e2ee
rk[ 4] = 367 360f4 X[ 4 ] = f87 c5bd5
rk[ 5] = 776 a0c61 X[ 5 ] = 332 20757
rk[ 6] = b6b b89b3 X[ 6 ] = 77f 4c297
rk[ 7] = 247 63151 X[ 7 ] = 7a9 6f2eb
rk[ 8] = a52 0307c X[ 8 ] = 27d ac07f
rk[ 9] = b75 84dbd X[ 9 ] = 42d d0f19
rk[ 10] = c30 753ed X[10 ] = b8a 5da02
rk[ 11] = 7ee 55b57 X[11 ] = 907 127fa
rk[ 12] = 698 8608c X[12 ] = 8b9 52b83
rk[ 13] = 30d 895b7 X[13 ] = d42 b7c59
rk[ 14] = 44b a14af X[14 ] = 2ff c5831
rk[ 15] = 104 495a1 X[15 ] = f69 e6888
rk[ 16] = d12 0b428 X[16 ] = af2 432c4
rk[ 17] = 73b 55fa3 X[17 ] = ed1 ec85e
rk[ 18] = cc8 74966 X[18 ] = 55a 3ba22
rk[ 19] = 922 44439 X[19 ] = 124 b18aa
rk[ 20] = e89 e641f X[20 ] = 6ae 7725f
rk[ 21] = 98c a015a X[21 ] = f4c ba1f9
rk[ 22] = c71 59060 X[22 ] = 1dc dfa10
rk[ 23] = 99e 1fd2e X[23 ] = 2ff 60603
rk[ 24] = b79 bd80c X[24 ] = eff 24fdc
rk[ 25] = 1d2 115b0 X[25 ] = 6fe 46b75
rk[ 26] = 0e2 28aeb X[26 ] = 893 450ad
rk[ 27] = f17 80c81 X[27 ] = 7b9 38f4c
rk[ 28] = 428 d3654 X[28 ] = 536 e4246
rk[ 29] = 622 93496 X[29 ] = 86b 3e94f
rk[ 30] = 01c f72e5 X[30 ] = d20 6965e
rk[ 31] = 912 4a012 X[31 ] = 681 edf34
密 文 : 68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46
实 例 二 : 利 用 相 同 加 密 密 钥 对 一 组 明 文 反 复 加 密 1000000 次
明 文 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
加 密 密 钥 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
密 文: 59 52 98 c7 c6 fd 27 1f 04 02 f8 04 c3 3d 3f 66
4