上周相亲去了,结果被拒,她说你不行,所以我又回来了~

零、我不行

鉴于大家的建议和点赞情况,本文基于以下原则:

1.我不行

2.多个一个公式少一半读者(文章反摩尔定律)

3.标题一寸长,内容一寸强

自行选择阅读,感谢(被拒后很不开心,最近一周请不要私信骂我,谢谢~呜呜呜)

本文及烂且毫无营养,代码官方公开,找不到可私信我,有人看的话再写吧。文档在此:链接:pan.baidu.com/s/1kEda2n 密码:p8vg

一、引言

ZUC演算法,即祖冲之演算法,属于序列密码,是我国第一个成为国际密码标准的密码演算法,并且还是移动通信 3GPP 机密性演算法 EEA3 和完整性演算法 EIA3的核心。(ZUC演算法是产生流密钥演算法,非加密演算法,属于国产密码)

二、符号与运算符

本节可跳过,待后文遇见不解的符号或运算符再返回查找即可。

1、运算符

  • + 算术加法运算
  • ab 整数a和b的乘积
  • = 赋值操作符
  • mod 整数模运算
  • 按比特位逐位异或运算
  • 模2加法运算
  • 字元串或位元组串连接符
  • 下标H 取字的最高16比特
  • 下标L 取字的最低16比特
  • <<<k 32比特字循环左移k位
  • >>k 32比特字右移K位
  • a->b 向量a赋值给向量b,即按分量逐分量赋值

2、符号

  • S1,S2,S3,……S15 线性反馈移位寄存器的16个31比特寄存器单元变数
  • X1,X2,X3,X4 比特重组输出的4个32比特字
  • R1,R2 非线性函数F的2个32比特记忆单元变数
  • W 非线性函数F输出的32比特字
  • W1 R1与X1进行模2^32加法运算输出的32比特字
  • W2 R2与X2按比特位逐位异或运算输出的32比特字
  • Z 演算法每个节拍输出的32比特密钥字
  • K 初始种子密钥
  • IV 初始向量
  • D1,D2,D3……D15 15比特的字元串常量
  • F 非线性函数
  • L 输出密钥字长度

3、缩略语

按缩写就显得很专业的原则,我们的装X原则如下:

  • ZUC 祖冲之序列密码演算法
  • LFSR 线性反馈移位寄存器
  • BR 比特重组演算法描述

三、演算法构架

1、为何说构架,因为ZUC演算法分为上中下三层,如下图:

上层是16级线性反馈移位寄存器(LFSR);中层是比特重组(BR);下层是非线性函数F。

2、第一层:线性反馈移位寄存器(LFSR)

LFSR包括16个31比特寄存器单元变数S1,S2,S3,……S15。且有两种运行模式:初始化模式和工作模式。

初始化模式

在初始化模式下,LFSR接收一个31比特字U。U是由非线性函数F的32位比特输出W通过舍弃最低位比特得到的,即U=W>>1。在初始化模式下,LFSR模式计算过程如下:

LFSRWithInitialisationMode(U){ V=2^15S15+2^11S13+2^21S10+2^20S4+(1+2^8)S0 mod(2^31-1); S16=(V+U)mod (2^31-1); 如果S16=0,则设S16=2^31-1; (S1,S2,S3……,S16)->(S0,S1,S2……,S15);}

工作模式

在工作模式下,LFSR不接受任何输入,流程如下:

LFSRWithWorkMode()

{

V=2^15 S15+2^11 S13+2^21 S10+2^20 S4+(1+2^8)S0 mod(2^31-1); 如果S16=0,则设S16=2^31-1; (S1,S2,S3……,S16)->(S0,S1,S2……,S15);}

3、第二层:比特重组(BR)

输入为LFSR寄存器单位变数S0,S2,S5,S7,S9,S11,S14,S15,输出为4个32比特字X0、X1、X2、X3。

BitReconstruction(){ X0=S15H || S14L; X1=S11L || S9H;

X2=S7L || S5H;

X3=S2L || S0H;}

4、第三层:非线性函数F

非线性函数F有2个32位的存储单元,即R1和R2。令到F的输入为X0,X1和X2,即为比特重组的前三个输入,然后函数F输出一个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为32bit的S盒替换,S盒定义稍后介绍;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)。

S盒

32比特S盒S由4个小的8*8的S盒并置而成,即S=(S0,S1,S2,S3),其中S0=S2,S1=S3。S0和S1的定义分别见表A.1和表A.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、密钥载入

密钥载入的过程将把初始密钥和初始向量扩展为16个31比特的LFSR初始状态。设K为128比特的初始密钥,iv为128比特的初始向量,则有:

k=k0 || k1 ||……||k15iv=iv0 || iv1 ||……||iv15D为240比特的常量,可按如下方式分成16个15比特的字串:D= d0 || d1 ||……||d15其中(二进位):d0=100010011010111,

d1=010011010111100,

d2=110001001101011,d3=001001101011110,d4=101011110001001,d5=011010111100010,d6=111000100110101,d7=000100110101111,d8=100110101111000,d9=010111100010011,d10=110101111000101,

d11=001101011110001,

d12=101111000100110,d13=011110001001101,d14=111100010011010,d15=100011110101100.对0<=i<=15,有Si=Ki || di || IVi。

2、演算法运行

初始化阶段

首先把128比特的初始密钥K和初始向量iv按照密钥装入方法装到LFSR的寄存器单元变数S0,S1,……S15中,作为LFSR 的初态,并置32比特记忆单元变数R1和R2为全0。然后执行下述操作:

重复下述过程32次:1) BitReconstryction();2) W=F(X0,X1,X2);

3) 输出32比特字W;

4) LFSRWithInitialisationMode(W>>1);

工作阶段

首先执行下列过程一次,并将F的输出W舍弃:

1) BitReconstryction();2) F(X0,X1,X2);3) LFSRWithWorkMode()。然后进入密钥输出阶段。在密钥输出阶段,每运行一个节拍,执行下列过程一次,并输出一个32比特的密钥字Z:1) BitReconstryction();2) Z=F(X0,X1,X2)⊕X3;3) 输出32比特密钥字Z;4) LFSRWithWorkMode()。

3、附实例

五、小结

1、能读到这儿,小弟佩服,再无他言,抱拳。

2、欢迎讨论与指正。


推荐阅读:
相关文章