现代密码学0x07|祖冲之序列密码算法(ZUC)

祖冲之算法(ZUC)(GM/T 0001.1-2012)

  • ZUC 算法最初是面向4G LTE 空口加密设计的序列密码算法
  • 2011年9月被3GPP LTE 采纳为国际加密标准(3GPP TS 33.401)
  • 2012年3月,发布为国家密码行业标准GM/T0001-2012
  • 2016年10月,发布为国家标准GB/T 33133-2016
  • ZUC算法目前主要用于通信领域
  • ZUC算法是一个基于字设计的同步序列密码算法
    • 种子密钥SK和初始向量IV的长度均为128比特
    • 在SK和IV的控制下,每拍输出一个32比特字
  • 标准起草人:冯登国、林东岱、冯秀涛、周春芳

祖冲之密码的算法结构

祖冲之密码的算法结构分为三层。第一层是线性反馈移位寄存器层(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 )

  1. v=2^{15}s_{15}+2^{17}s_{13}+2^{21}s_{10}+2^{20}s_{4}+(2^{8}+1)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})rightarrow (s_{0},s_{1},…,s_{14},s_{15}) .

(2)工作模式

在工作模式下,LFSR没有输入。其计算过程如下:

LFSRWithWorkMode( )

  1. s_{16}=2^{15}s_{15}+2^{17}s_{13}+2^{21}s_{10}+2^{20}s_{4}+(2^{8}+1)s_{0}mod (2^{31}-1)
  2. 如果 s_{16}=0 ,则置 s_{16}=2^{31}-1
  3. (s_{1},s_{2},…,s_{15},s_{16})rightarrow (s_{0},s_{1},…,s_{14},s_{15}) .

比特重组

比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字 X_{0},X_{1},X_{2},X_{3} ,其中前3个字将用于下层的非线性函数 F ,第4个字参与密钥流的计算。

比特重组(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}

非线性函数

非线性函数有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. W=(X_{0}oplus R_{1})⊞R_{2}
  2. W_{1}=R_{1}⊞X_{1}
  3. W_{2}=R_{2}oplus X_{2}
  4. R_{1}=S(L_{1}(W_{1L}||W_{2H}))
  5. R_{2}=S(L_{2}(W_{2L}||W_{1H}))

(1)S 盒

32times 32 (即输入长和输出长都为32比特)的 S 盒由4个并置的 8times8S 盒构成,即 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}) .

xS_{0} 的8比特长输入,将 x 写成2个16进制数 x = h||l ,那么其输出是 S_{0} 盒的第 h 行和第 l 列交叉位置的16进制数。

  • 输入:10100110,即a6
  • 输出:A3,即10100011

S₀ 盒S₁ 盒

(2)线性变换 L_{1}L_{2}

L_{1}L_{2} 为32比特线性变换,定义如下:

  • L_{1}(x)=Xoplus(Xlll2)oplus(Xlll10)oplus(Xlll18)oplus(Xlll24)
  • L_{2}(x)=Xoplus(Xlll8)oplus(Xlll14)oplus(Xlll22)oplus(Xlll30)

非线性函数 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 .

密钥载入步骤:

  1. D 为240比特的常量,可按如下方式分成16个15比特的子串: D=d_{0}||d_{1}||…||d_{15}
  2. 0leq ileq15 ,取 s_{i}=k_{i}||d_{i}||iv_{i} .

祖冲之密码的运行

算法的运行有两个阶段:初始化阶段和工作阶段。

初始化阶段

调用密钥装载过程,将128比特的初始密钥 k 和128比特的初始向量 IV 装入到LFSR的寄存器单元变量 s_{0},s_{1},…,s_{15} 中,作为LFSR的初态,并置非线性函数 F 中的32比特存储单元 R_{1}R_{2} 全为0。然后重复执行以下过程32次:

  1. BitReconstruction()
  2. W =F(X_{0},X_{1},X_{2})
  3. LFSRWithInitialisationMode (u)

工作阶段

初始化阶段以后,执行工作阶段。 首先执行以下过程一次,并将 F 的输出 W 丢弃:

  1. BitReconstruction( )
  2. F(X_{0},X_{1},X_{2})
  3. LFSRWithWorkMode ( )

然后进入密钥输出阶段,其中每进行一次循环,执行以下过程一次,输出一个32比特的密钥字:

  1. BitReconstruction( )
  2. Z =F(X_{0},X_{1},X_{2})oplus X_{3}
  3. LFSRWithWorkMode ( )

基于祖冲之密码的机密性算法 128-EEA3

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个字节。令:

  • IV[0]=COUNT[0],IV[1]=COUNT[1], IV[2] = COUNT[2], IV[3] = COUNT[3],
  • IV[4]= BEARER||DIRECTION ||00_{2},
  • IV[5] = IV[6] = IV[7] = 00000000_{2},
  • IV[8]= IV[0],IV[9]= IV[1],IV[10]= IV[2],IV[11]= IV[3],
  • IV[12]= IV[4],IV[13]= IV[5], IV[14]= IV[6],IV[15]= IV[7].

密钥流的产生

设消息长为 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.

发表回复

相关推荐

五臺山2020年超全攻略(內含景點、交通、住宿、吃飯等詳細花銷)

一直想去 五臺山 ,但是一直未成行。終於在忙完國慶假期的工作之後騰出時間成行瞭。姑且在這裡做一點小分享給大傢,希望對後...

· 2分钟前

专业课《商品学》学生复习资料:专业+知识点+概论,你需要都在这!

考前准备涨一波分就赶紧学起来,下面的内容全是精华。

· 3分钟前

歌詞故事 | 《說謊》:假作真時真亦假

我一點都不想你我過得很好真的騙人是小狗汪汪……一首歌,42句歌詞,其中38句謊言,4句真話。本期歌詞故事,林宥嘉,《說謊》(...

· 3分钟前

變形金剛5的口碑崩盤,教會瞭我什麼

周末看《變形金剛5》前,老婆給我打瞭預防針:據說是史上最爛的變形金剛。平胸而論,變5還是一部合格的爆米花電影,如果觀眾...

· 3分钟前

如何用灰色关联计算指标关联度?

灰色关联法是一种通过研究数据关联性大小,从而反映各因素对目标值的重要程度的研究方法。常与其他方法结合使用确定权重。

· 4分钟前