祖冲之算法(ZUC)(GM/T 0001.1-2012)
祖冲之密码的算法结构分为三层。第一层是线性反馈移位寄存器层(LFSR),第二层是比特重组层(BR),第三层是一个非线性函数(F)。
祖冲之密码的三层算法结构
线性反馈移位寄存器(LFSR)由 16 个 31 比特寄存器单元 s_{0},s_{1},…,s_{15} 组成,每个单元在集合 left{ 1,2,3,…,2^{31}-1 right} 中取值。
线性反馈移位寄存器的特征多项式是有限域 GF(2^{31}-1) 上的16次本原多项式
p(x)=x^{16}-2^{15}x^{15}-2^{17}x^{13}-2^{21}x^{10}-2^{20}x^{4}-(2^{8}+1)
其输出为有限域 GF(2^{31}-1) 上的 m 序列,具有良好的随机性。其反馈多项式为:
s_{16+t}=2^{15}s_{15+t}+2^{17}s_{13+t}+2^{21}s_{10+t}+2^{20}s_{4+t}+(2^{8}+1)s_{t}mod (2^{31}-1)
线性反馈移位寄存器(LFSR)
线性反馈移位寄存器的运行模式有两种:初始化模式和工作模式
(1)初始化模式
在初始化模式中,LFSR接收一个31比特字, 是由非线性函数 F 的32比特输出 W 通过舍弃最低位比特得到,即 u=W ≫1 。计算过程如下:
LFSRWithInitialisationMode (u )
(2)工作模式
在工作模式下,LFSR没有输入。其计算过程如下:
LFSRWithWorkMode( )
比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字 X_{0},X_{1},X_{2},X_{3} ,其中前3个字将用于下层的非线性函数 F ,第4个字参与密钥流的计算。
比特重组(BR)
BitReconstruction( )
非线性函数有2个32比特长的存储单元 R_{1} 和 R_{2} ,其输入为来自上层比特重组的3个32比特字 X_{0},X_{1},X_{2} ,输出为一个32比特字 W 。因此,非线性函数 F 是一个把96比特压缩为32比特的一个非线性压缩函数。
非线性函数(F)
具体计算过程如下:
F(X_{0},X_{1},X_{2})
(1)S 盒
32times 32 (即输入长和输出长都为32比特)的 S 盒由4个并置的 8times8 的 S 盒构成,即 S=(S_{0},S_{1},S_{2},S_{3}) .
其中 S_{2}=S_{0},S_{3}=S_{1} ,于是有 S=(S_{0},S_{1},S_{0},S_{1}) .
设 x 是 S_{0} 的8比特长输入,将 x 写成2个16进制数 x = h||l ,那么其输出是 S_{0} 盒的第 h 行和第 l 列交叉位置的16进制数。
S₀ 盒S₁ 盒
(2)线性变换 L_{1} 和 L_{2}
L_{1} 和 L_{2} 为32比特线性变换,定义如下:
非线性函数 F 输出的 W 与比特重组(BR)输出的 x_{3} 异或,形成输出密钥序列 Z .
密钥载入过程将128比特的初始密钥 k 和128比特的初始向量 IV 扩展为16个31比特长的整数,作为LFSR寄存器单元 s_{0},s_{1},…,s_{15} 的初始状态。
设 k=k_{0}||k_{1}||…||k_{15} , IV=iv_{0}||iv_{1}||…||iv_{15}
其中, k_{i} 和 iv_{i} 均为8比特长字节, 0leq ileq15 .
密钥载入步骤:
算法的运行有两个阶段:初始化阶段和工作阶段。
调用密钥装载过程,将128比特的初始密钥 k 和128比特的初始向量 IV 装入到LFSR的寄存器单元变量 s_{0},s_{1},…,s_{15} 中,作为LFSR的初态,并置非线性函数 F 中的32比特存储单元 R_{1} 和 R_{2} 全为0。然后重复执行以下过程32次:
初始化阶段以后,执行工作阶段。 首先执行以下过程一次,并将 F 的输出 W 丢弃:
然后进入密钥输出阶段,其中每进行一次循环,执行以下过程一次,输出一个32比特的密钥字:
ZUC机密性算法输入参数表:
输入参数 | 比特长度 | 备注 |
---|---|---|
COUNT | 32 | 计数器 |
BEARER | 5 | 承载层标识 |
DIRECTION | 1 | 传输方向标识 |
CK | 128 | 机密性密钥 |
LENGTH | 32 | 明文消息的比特长度 |
M | LENGTH | 明文消息的比特流 |
ZUC机密性算法输出参数表:
输出参数 | 比特长度 | 备注 |
---|---|---|
C | LENGTH | 输出比特流 |
基于祖冲之密码的机密性算法 128-EEA3:
基于祖冲之密码的机密性算法 128-EEA3
算法工作流程:
初始化是指根据机密性密钥 CK 以及其他输入参数构造祖冲之算法的初始密钥 k 和初始向量 IV 。
把 CK (128比特长)和 k (128比特长)分别表示为16个字节:
CK =CK[0]||CK[1]||CK[2]||…||CK[15]
k=k[0]||k[1]||k[2]||…||k[15]
k[i] = CK[i],i=0,1,2,…,15
把计数器 COUNT (32比特长)表示为4个字节:
COUNT =COUNT[0]||COUNT[1]||COUNT[2]||COUNT[3]
把 IV (128比特长)表示为16个字节。令:
设消息长为 LENGTH 比特,由初始化算法得到的初始密钥 k 和初始向量 IV ,调用ZUC密码产生 L 个字(每个32比特长)的密钥,其中 L = ⎡LENGTH / 32⎤ .
将生成的密钥流用比特串表示为 z[0],z[1],…,z[32times L−1] ,其中 z[0] 为ZUC算法生成的第一个密钥字的最高位比特,z[31] 为最低位比特,其他以此类推。
设长度为 LENGTH 的输入消息的比特流为
M =M[0]||M[1]||M[2]||…||M[LENGTH-1] ,
则输出的密文比特流为
C = C[0] || C[1] || C[2] ||… || C[LENGTH -1] ,
其中 C[i]=M[i]oplus z[i] , i=0,1,2,… ,LENGTH-1 .
参考文献:
[1] 聂旭云, 熊虎, 廖永建, 陈大江, 王煜宇. 现代密码学[EB/OL]. [2022-02-18]. https://www.icourse163.org/course/UESTC-1003046001.