ZUC算法是国密算法的一种,它是一种同步序列密码,在实际应用中可以用来替换RC4算法。
提示:以下是本篇文章正文内容,下面案例可供参考
ZUC算法在逻辑上分为上中下三层。上层是16级线性反馈移位寄存器(LFSR),中层是比特重组(BR),下层是非线性函数F。
31上层的LFSR由16个31比特寄存器单元变量组成,每个变量在集合{1,2,3,…,231-1}中取值。线性反馈移位寄存器以有限域GF(231-1)上的16次本原多项式
为连接多项式。因此,输出为素域GF(231-1)上的m序列,具有良好的随机性。
【注】m序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。一般来说,在二元域上,一个n级线性反馈移存器可能产生的最长周期等于(2n -1)。这里的LFSR是在有限域GF(231-1)上定义的,因此,其输出的m序列的周期为(231-1)16-1,约等于2496,这是相当大的。
线性反馈移位寄存器的运行模式有两种:初始化模式和工作模式。
在初始化模式下,LFSR接收一个31比特字u。u是由非线性函数F的32比特输出W通过舍弃最低为比特得到。
比较初始化模式和工作模式可知,二者的差异在于初始化时需要引入由非线性函数F输出W通过舍弃最低为比特得到的u,而工作模式不需要。初始化模式引入非线性函数F的输出u的目的是使线性反馈移位寄存器的状态随机化。
中层的比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字X0、X1、X2、X3。比特重组的具体计算过程如下:
H:取字的高16比特 L: 取字的低16比特
【注】:这里注意一下,由于寄存器中的值si为31比特,很多书上的示例都是以16进制来写si的值。例如:s15=0047ac00,s14=00789a00,则X0=008f9a00。
低16位可以直接取s14的后两个字节,即9a00,但高16位要将0047ac00化为二进制,再取值。因为这里的s是31位而不是32位。
比特重组采用取半合并技术,实现LFSR数据单元到非线性函数F和密钥输出的数据转换,其主要目的是破坏LFSR在素域GF(231-1)上的线性结构。
田:表示 mod 232 加法
S盒:由4个并置的8进8出S盒构成,其中S2=S0,S3=S1,于是有S=(S0,S1,S0,S1)
L1、L2:非线性函数
非线性函数F内部包含2个32比特存储单元R0和R1,F的输入为来自比特重组的3个32比特字X0、X1、X2,输出为一个32比特字W。因此,非线性函数F是一个把96比特压缩为32比特的一个非线性压缩函数。
函数F的具体计算过程如下:
首先是将X0与R1异或得到的值与R2做mod 232加法,得到W。这个W除去最低的一个比特位,就是LFSR在初始化模式下的输入值u。然后由R1与X1mod 232加得到W1,R2和X2异或得到W2。再将W2的低16比特与W2的高16比特做连接,经过L1函数计算以及S盒变化,得到R1,同理,得到R2。
S盒变化的过程如下:
假设经过L1计算得到的32比特值的16进制为ef897a4c,则将ef、89、7a、4c分别送到S0、S1、S0、S1中进行查询,其中高位为行数,低位为列数。例如ef在S0中查询,则得到的是e行f列的值。
密钥装入过程将128比特的初始密钥KEY和128比特的初始向量IV扩展为16个31比特字作为LFSR寄存器单元变量s0,s1,…,s15的初始状态。其中:
其中,ki和ivi均为8比特字节
密钥装入过程如下:
引入一个240比特的常量D,按照下列方式将其分为16个15比特的子串:
因为寄存器中已经有值了,所以可以进行比特运算,然后再进行F运算,得到W。之后再进行LFSR的初始化模式计算。
1. 在LFSR设计上
ZUC 算法的 LFSR 设计首次采用素域 GF(231 - 1) 的 m 序列。该类序列周期长、统计特性好。此外,由于素域 GF(231 - 1)上的乘法可以快速实现,LFSR 在设计时充分考虑到安全和效率两方面的问题,在达到高安全目标的同时可以拥有非常高效地软硬件实现。
2. 在BR设计上
在比特重组部分,精心选用数据使得重组的数据具有良好的随机性,并且出现重复的概率足够小。
3. 在F函数设计上
在非线性函数F 的设计上,F函数采用了两个非线性变换S盒S0和S1,从而为祖冲之密码提供了非线性。又由于LFSR和BR都是线性变换,所以非线性函数F就成为ZUC算法中唯一的非线性部件,从而成为确保ZUC算法安全的关键。其中,S盒为密码提供混淆作用,L为密码提供扩散作用,二者互相配合提高密码安全性。
以上就是ZUC算法的具体介绍,希望能对读者有所帮助。