当前位置:文档之家› ZUC算法原理及实现过程

ZUC算法原理及实现过程

ZUC算法原理及实现过程
ZUC算法原理及实现过程

ZUC 算法原理及实现过程

1.1 算法设计背景

ZUC 算法,即祖冲之算法,是3GPP 机密性算法EEA3和完整性算法EIA3的核心,为中国自主设计的流密码算法。2009年5月ZUC 算法获得3GPP 安全算法组SA 立项,正式申请参加3GPPLTE 第三套机密性和完整性算法标准的竞选工作。历时两年多的时间,ZUC 算法经过评估,于2011年9月正式被3GPPSA 全会通过,成为3GPPLTE 第三套加密标准核心算法。ZUC 算法是中国第一个成为国际密码标准的密码算法。

1.2 算法原理

ZUC 是一个面向字的流密码。它采用128位的初始密钥作为输入和一个128位的初始向量(IV ),并输出关于字的密钥流(从而每32位被称为一个密钥字)。密钥流可用于对信息进行加密/解密。

ZUC 的执行分为两个阶段:初始化阶段和工作阶段。在第一阶段,密钥和初始向量进行初始化,即不产生输出。第二个阶段是工作阶段,在这个阶段,每一个时钟脉冲产生一个32比特的密钥输出。

(1)运算符说明

mod 整数模

⊕ 整数比特异或

a b 字符串a 和b 的连接

H a a 二进制表示的最左16位值

L a a 二进制表示的最右16位值

n a k <<< a 向左k 比特的循环移位

1a >> a 向右1比特的移位

()()1212,,,,,,n n a a a b b b → i a 值分配到对应i b 的值

(2)算法结构

ZUC 有三个逻辑层,见下图。顶层为一个线性反馈移位寄存器(LFSR )的16个赛段,中间层是比特重组(BR ),最下层为一个非线性函数F 。

图1 ZUC 的整体结构图

(3) 线性移位反馈寄存器(LFSR )

LFSR 具有16个31比特的单元()0115,,,s s s ,每个单元()015i s i ≤≤取值均在下面的集合中:

{}311,2,3,21-

LFSR 有两种模式的操作,即初始化模式和工作模式。在初始化模式中,LFSR 接收一个31比特的输入u ,u 是删除非线性函数F 的32位输出W 最右边的位得到的。也就是说,可将初始化模式工作原理表示为:

LFSRWithInitialisationMode (u )

{

1、()()1517212083115131040222212mod 21v s s s s s =+++++-;

2、()()3116mod 21s v u =+-;

3、如果160s =,则设311621s =-;

4、()()12160115,,

,,,,s s s s s s → }

在工作模式中,LFSR 不接收任何输入,它的工作原理表示为:

LFSRWithWorkMode()

{

1、()()151721208311615131040222212mod 21s s s s s s =+++++-;

2、如果160s =,则设311621s =-;

3、()()12160115,,

,,,,s s s s s s →; }

(4) 比特重组

ZUC 算法的中间层是比特重组,从LFSR 的单元中提取128比特的输出并形成4个32比特的字,前三个字将用于最底层的非线性F 函数中,而最后一个字会在密钥流的产生中用到。

令025********,,,,,,,s s s s s s s s 是LFSR 中的8个单元,则形成4个32比特字0123,,,X X X X 的比特重组过程如下:

Bitreorganization()

{

1、01514H L X s s =;

2、1119L H X s s =;

3、275L H X s s =;

4、320L H X s s =

}

(5)非线性函数F

非线性函数F 有2个32位的存储单元,即1R 和2R 。令到F 的输入为0X ,1X 和2X ,即为比特重组的前三个输出,然后函数F 输出一个32位字W 。F 的详细过程如下:

()012,,F X X X

{

1、()32012mod2W X R R =⊕+;

2、32111mod2W R X =+;

3、222W R X =⊕;

4、()()1112L H R S L W W =;

5、()()2221L H R S L W W =

}

(6)S 盒

F 函数中包含的S 盒S 是由4个并列的8×8的S 盒组成的(()0123,,,S S S S S =),其中02S S =、13S S =。0S 、1S 的定义由下面两张表分别给出:

令x 为0S (或1S )的8比特输入。将x 表示成十六进制x h l =,则在查表

时h 和l 分别表示S 盒的第h 行和第l 列。

(7)线性变换函数

线性变换1L 和2L 均为32比特字输入到32比特字的输出,具体可定义为:

()()()()()1323232322101824L X X X X X X =⊕<<<⊕<<<⊕<<<⊕<<< ()()()()()2323232328142230L X X X X X X =⊕<<<⊕<<<⊕<<<⊕<<<

(8)密钥加载

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

01215k k k k k =

01215iv iv iv iv iv =

其中,015i ≤≤

同时,设D 为由16个15比特长的子数组组成的240位常值数组:

0115D d d d =

其中,

02d = 100010011010111;

12d = 010011010111100;

22d = 110001*********;

32d = 001001101011110;

42d = 101011110001001;

52d = 011010111100010;

62d = 111000*********;

72d = 000100110101111;

82d = 100110101111000;

92d = 010111100010011;

102d = 110101111000100;

112d = 001101011110001;

122d = 101111000100110;

132d = 011110001001101;

142d = 111100010011010;

152d = 100011110101100;

设015,,s s 为LFSR 的16个单元,则015i ≤≤,有i i i i s k d iv =。

1.3 算法的实现过程 ZUC 算法的执行过程主要有四个步骤:密钥加载, 初始化阶段, 工作阶段和密钥流产生阶段,具体过程如下:

(1)密钥加载阶段:

在密钥加载阶段, 将128位的初始密钥和128 位的初始化向量载人LFSR, 同时设置32 位的记忆单元R1,R2为0值。

(2)初始化阶段

在初始化阶段,执行下面的操作32次:

1、Bitreorganization();

2、()012,,X w X F X =;

3、LFSRWithInitialisationMode(1w >>) (3)工作阶段

在工作阶段, 算法执行下面的操作1次, 并弃掉 F 的输出W :

1、Bitreorganization();

2、()012,,X X X F ;

3、LFSRWithWorkMode(). (4)密钥流产生阶段

在密钥流产生阶段, 每次迭代执行以下操作 1次, Z 是一个32位的输出:

1、Bitreorganization();

2、()0123,,X Z F X X X =⊕;

3、LFSRWithWorkMode() .

相关主题
文本预览
相关文档 最新文档