文档介绍:祖冲之序列密码算法(ZUC算法)
GM/T -2022
2
26
1
祖冲之序列密码算法
第1局部:算法描述
范围
本局部描述了祖冲之序列密码算法,可用于指导祖冲之算法相关产品的研制、检测和使用。
、X2,输出为一个32比特字W。F的计算过程如下:
F (X0, X1, X2)
{
W = (X0 Å R1) ⊞ R2;
W1 = R1 ⊞ X1;
W2 = R2 Å X2;
R1 = S(L1(W1L‖W2H));
R2 = S(L2(W2L‖W1H))。
}
其中S为32比特的S盒变换,定义在附录A中给出;L1和L2为32比特线性变换,定义如下:
L1(X) = X Å (X <<< 2) Å (X <<< 10) Å (X <<< 18) Å (X <<< 24),
L2(X) = X Å (X <<< 8) Å (X <<< 14) Å (X <<< 22) Å (X <<< 30)。
密钥装入
密钥装入过程将128比特的初始密钥k和128比特的
GM/T -2022
2
8
1
初始向量iv扩展为16个31比特字作为LFSR存放器单元变量s0, s1, …, s15的初始状态。设k和iv分别为
k0‖k1‖……‖k15
和
iv0‖iv 1‖……‖iv 15,
其中ki和ivi均为8比特字节,0≤i≤15。密钥装入过程如下:
D为240比特的常量,可按如下方式分成16个15比特的子串:
D =d0‖d1‖……‖d15,
其中:
d0 = 1000100110101112,
d1= 01001**********,
d2 = 11000**********,
d3 = 00100**********,
d4= 10101**********,
d5 = 0110101111000102,
d6 = 1110001001101012,
d7 = 0001001101011112,
d8 = 1001101011110002,
d9 = 01011**********,
GM/T -2022
2
9
1
d10 = 11010**********,
d11= 00110**********,
d12 = 10111**********,
d13 = 0111100010011012,
d14 = 1111000100110102,
d15 = 10001**********。
对0≤i≤15,有 si = ki‖di‖ivi。
算法运行
初始化阶段
, s1, …, s15中,作为LFSR的初态,并置32比特记忆单元变量R1和R2为全0。然后执行下述操作:
重复执行下述过程32次:
BitReconstruction();
W= F(X0, X1, X2);
LFSRWithInitialisationMode (W >> 1)。
工作阶段
首先执行以下过程一次,并将F的输出W舍弃:
BitReconstruction();
GM/T -2022
2
10
1
F (X0, X1, X2);
LFSRWithWorkMode()。
然后进入密钥输出阶段。在密钥输出阶段,每运行一个节拍,执行以下过程一次,并输出一个32比特的密钥字Z:
BitReconstruction() ;
Z = F (X0, X1, X2) Å X3;
LFSRWithWorkMode()。
GM/T -2022
2
11
1
〔标准性附录〕
S盒
32比特S盒S由4个小的8х8的S盒并置而成,即S=(S0, S1, S2, S3),其中S0=S2,S1=S3。S0和S1的定义分别见表1和表2。设S0(或S1)的8比特输入为x。将x视作两个16进制数的连接,即x=h||l,那么表1 (或表2)中第h行和第l列交叉的元素即为S0(或S1)的输出S0(x)(或S1(x))。
设S盒S的32比特输入X和32比特输出Y分别为:
X = x0 ‖ x1 ‖ x2 ‖ x3,
Y = y0 ‖ y1 ‖ y2 ‖ y3,
其中xi和yi均为8比特字节,i = 0, 1, 2, 3。那么有yi = Si(xi), i = 0, 1, 2, 3。
表1 S0盒
0
1
2
3
4
5
6
7
8
9
A
B
C