ZUC算法原理及实现过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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() 。