1
祖冲之序列密码算法
第 1 部分:算法描述
1 范围
本部分描述了祖冲之序列密码算法,可用于指导祖冲之算法相关产品的研制、检测和使用。
2 术语和约定
以下术语和约定适用于本部分。
2.1
比特 bit
二进制字符0和1称之为比特。
2.2
字节 byte
由8个比特组成的比特串称之为字节。
2.3
字 word
由2个以上(包含2个)比特组成的比特串称之为字。
本部分主要使用31比特字和32比特字。
2.4
字表示 word representation
本部分字默认采用十进制表示。当字采用其它进制表示时,总是在字的表示之前或之后添加指示
符。例如,前缀0x指示该字采用十六进制表示,后缀下角标2指示该字采用二进制表示。
2.5
高低位顺序 bit ordering
本部分规定字的最高位总是位于字表示中的最左边,最低位总是位于字表示中的最右边。
GM/T 10004.2-2012
2
3 符号和缩略语
3.1 运算符
+ 算术加法运算
mod 整数取余运算
⨁ 按比特位逐位异或运算
⊞ 模2
32
加法运算
‖ 字符串连接符
∙
H
取字的最高16比特
∙
L
取字的最低16比特
<<<
k
32比特字左循环移
k
位
>>
k
32比特字右移
k
位
ab 向量a赋值给向量b,即按分量逐分量赋值
3.2 符号
下列符号适用于本部分:
s
0
,s
1
,s
2
,…,s
15
线性反馈移位寄存器的 16 个 31 比特寄存器单元变量
X
0
,X
1
,X
2
,X
3
比特重组输出的 4 个 32 比特字
R
1
, R
2
非线性函数 F 的 2 个 32 比特记忆单元变量
W 非线性函数 F 输出的 32 比特字
Z 算法每拍输出的 32 比特密钥字
k 初始种子密钥
iv 初始向量
D 用于算法初始化的字符串常量
3.3 缩略语
下列缩略语适用于本部分:
ZUC 祖冲之序列密码算法或祖冲之算法
LFSR 线性反馈移位寄存器
BR 比特重组
F 非线性函数
4 算法描述
4.1 算法整体结构
祖冲之算法逻辑上分为上中下三层,见图 1。上层是 16 级线性反馈移位寄存器(LFSR);中层是比
特重组(BR);下层是非线性函数 F。
GM/T 10004.2-2012
3
图 1 祖冲之算法结构图
4.2 线性反馈移位寄存器 LFSR
4.2.1 概述
LFSR 包括 16 个 31 比特寄存器单元变量 s
0
, s
1
, …, s
15
。
LFSR 的运行模式有 2 种:初始化模式和工作模式。
4.2.2 初始化模式
在初始化模式下,LFSR 接收一个 31 比特字 u。u 是由非线性函数 F 的 32 比特输出 W 通过舍弃最低
位比特得到,即 u=W >> 1。在初始化模式下,LFSR 计算过程如下:
LFSRWithInitialisationMode(u)
{
(1) v = 2
15
s
15
+2
17
s
13
+ 2
21
s
10
+ 2
20
s
4
+ (1 + 2
8
)s
0
mod (2
31
-1);
(2) s
16
=(v+u) mod (2
31
-1);
(3) 如果 s
16
=0,则置 s
16
=2
31
-1;
(4) (s
1
, s
2
, …, s
15
, s
16
) � (s
0
, s
1
, …, s
14
, s
15
)。
}
GM/T 10004.2-2012
4
4.2.3 工作模式
在工作模式下,LFSR 不接收任何输入。其计算过程如下:
LFSRWithWorkMode()
{
(1) s
16
= 2
15
s
15
+2
17
s
13
+ 2
21
s
10
+ 2
20
s
4
+ (1 + 2
8
)s
0
mod (2
31
-1);
(2) 如果 s
16
=0,则置 s
16
=2
31
-1;
(3) (s
1
, s
2
, …, s
15
, s
16
) � (s
0
, s
1
, …, s
14
, s
15
)。
}
4.3 比特重组 BR
比特重组从 LFSR 的寄存器单元中抽取 128 比特组成 4 个 32 比特字 X
0
、X
1
、X
2
、X
3
。BR 的具体计算
过程如下:
BitReconstruction()
{
(1) X
0
= s
15H
‖s
14L
;
(2) X
1
= s
11L
‖s
9H
;
(3) X
2
= s
7L
‖s
5H
;
(4) X
3
= s
2L
‖s
0H
。
}
4.4 非线性函数 F
F 包含 2 个 32 比特记忆单元变量 R
1
和 R
2
。
F 的输入为 3 个 32 比特字 X
0
、X
1
、X
2
,输出为一个 32 比特字 W。F 的计算过程如下:
F (X
0
, X
1
, X
2
)
{
(1) W = (X
0
� R
1
) ⊞ R
2
;
(2) W
1
= R
1
⊞ X
1
;
(3) W
2
= R
2
� X
2
;
(4) R
1
= S(L
1
(W
1L
‖W
2H
));
(5) R
2
= S(L
2
(W
2L
‖W
1H
))。
}
其中 S 为 32 比特的 S 盒变换,定义在附录 A 中给出;L
1
和 L
2
为 32 比特线性变换,定义如下:
L
1
(X) = X � (X <<< 2) � (X <<< 10) � (X <<< 18) � (X <<< 24),
L
2
(X) = X � (X <<< 8) � (X <<< 14) � (X <<< 22) � (X <<< 30)。
4.5 密钥装入
密钥装入过程将 128 比特的初始密钥 k 和 128 比特的初始向量 iv 扩展为 16 个 31 比特字作为 LFSR
寄存器单元变量 s
0
, s
1
, …, s
15
的初始状态。设 k 和 iv 分别为
k
0
‖k
1
‖……‖k
15
和
iv
0
‖iv
1
‖……‖iv
15
,
GM/T 10004.2-2012
5
其中 k
i
和 iv
i
均为 8 比特字节,0≤i≤15。密钥装入过程如下:
(1) D 为 240 比特的常量,可按如下方式分成 16 个 15 比特的子串:
D =d
0
‖d
1
‖……‖d
15
,
其中:
d
0
= 100010011010111
2
,
d
1
= 010011010111100
2
,
d
2
= 110001001101011
2
,
d
3
= 001001101011110
2
,
d
4
= 101011110001001
2
,
d
5
= 011010111100010
2
,
d
6
= 111000100110101
2
,
d
7
= 000100110101111
2
,
d
8
= 100110101111000
2
,
d
9
= 010111100010011
2
,
d
10
= 110101111000100
2
,
d
11
= 001101011110001
2
,
d
12
= 101111000100110
2
,
d
13
= 011110001001101
2
,
d
14
= 111100010011010
2
,
d
15
= 100011110101100
2
。
(2) 对 0≤i≤15,有 s
i
= k
i
‖d
i
‖iv
i
。
4.6 算法运行
4.6.1 初始化阶段
首先把 128 比特的初始密钥 k 和 128 比特的初始向量 iv 按照 4.5 节密钥装入方法装入到 LFSR 的寄
存器单元变量 s
0
, s
1
, …, s
15
中,作为 LFSR 的初态,并置 32 比特记忆单元变量 R
1
和 R
2
为全 0。然后执行
下述操作:
重复执行下述过程 32 次:
(1) BitReconstruction();
(2) W= F(X
0
, X
1
, X
2
);
(3) LFSRWithInitialisationMode (W >> 1)。
4.6.2 工作阶段
首先执行下列过程一次,并将 F 的输出 W 舍弃:
(1) BitReconstruction();
(2) F (X
0
, X
1
, X
2
);
(3) LFSRWithWorkMode()。
然后进入密钥输出阶段。在密钥输出阶段,每运行一个节拍,执行下列过程一次,并输出一个 32
比特的密钥字 Z:
(1) BitReconstruction() ;
(2) Z = F (X0, X1, X2) � X3;
(3) LFSRWithWorkMode()。