现代密码学 | 02:流密码——2

现代密码学_电子科技大学_中国大学MOOC(慕课)
计算机网络安全原理_吴礼发、洪征编著_电子工业出版社出版_ISBN:9787121387272
现代密码学_杨波_清华大学出版社_ISBN:9787302465553

秋风阁——北溪入江流:https://focus-wind.com/
秋风阁——现代密码学 | 02:流密码

非线性序列

  • 密钥流生成器可分解为驱动子系统和非线性组合子系统
    • 驱动子系统常用一个或多个线性反馈移位寄存器来实现
    • 非线性组合子系统用非线性组合函数F来实现
    • 为了使密钥流生成器输出的二元序列尽可能复杂,也应保证其周期尽可能大、线性复杂度和不可预测性尽可能高
      密钥流生成器的分解

Geffe序列生成器

  • Geffe序列生成器由3个LFSR组成,其中LFSR2作为控制生成器使用
  • 当LFSR2输出1时,LFSR2与LFSR1相连接
  • 当LFSR2输出0时,LFSR2与LFSR3相连接
    Gaffe序列生成器
    多路符合其表示Gaffe序列生成器
    若设LFSRi的输出序列为 { a k ( i ) ( i = 1 , 2 , 3 ) } \{ {a_k}^{(i)}(i = 1, 2, 3) \} {ak(i)(i=1,2,3)},则输出序列 { b k } \{ b_k \} {bk}可以表示为:
    b k = a k ( 1 ) a k ( 2 ) + a k ( 3 ) a k ( 2 ) ‾ = a k ( 1 ) a k ( 2 ) + a k ( 3 ) a k ( 2 ) + a k ( 3 ) b_k = {a_k}^{(1)}{a_k}^{(2)} + {a_k}^{(3)}\overline{{a_k}^{(2)}} = {a_k}^{(1)}{a_k}^{(2)} + {a_k}^{(3)}{a_k}^{(2)} + {a_k}^{(3)} bk=ak(1)ak(2)+ak(3)ak(2)=ak(1)ak(2)+ak(3)ak(2)+ak(3)
    设LFSRi的特征多项式分别为 n i n_i ni次本原多项式,且 n i n_i ni两两互素,则Geffe序列的周期为: ∏ i = 1 3 ( 2 n i − 1 ) \prod \limits_{i = 1}^3 (2^{n_i} - 1) i=13(2ni1),线性复杂度: ( n 1 + n 3 ) n 2 + n 3 (n_1 + n_3)n_2 + n_3 (n1+n3)n2+n3
    Geffe序列的周期实现了极大化,且0与1之间的分布大体上是平衡的。

J-K触发器

J-K触发器如图所示,它的两个输入端分别用J和K表示,其输出 c k c_k ck不仅依赖于输入,还依赖于前一个输出位 c k − 1 c_{k-1} ck1,即:
c k = ( x 1 + x 2 ) ‾ c k − 1 + x 1 c_k = \overline{(x_1 + x_2)}c_{k-1} + x_1 ck=(x1+x2)ck1+x1
J-K触发器
其中 x 1 x_1 x1 x 2 x_2 x2分别是J和K端的输入。由此可得J-K触发器的真值表,如下表所示:

JK c k c_k ck
00 c k − 1 c_{k-1} ck1
010
101
11 c k − 1 ‾ \overline{c_{k-1}} ck1

利用J-K触发器的非线性序列生成器

利用J-K触发器的非线性序列生成器
{ a k } : m 级 m 序 列 { b k } : n 级 m 序 列 c k = ( a k + b k ) ‾ c k − 1 + a k = ( a k + b k + 1 ) c k − 1 + a k \{ a_k \}: m级m序列 \\ \{ b_k \}: n级m序列 \\ c_k = \overline{(a_k + b_k)}c_{k - 1} + a_k = (a_k + b_k + 1)c_{k - 1} + a_k {ak}:mm{bk}:nmck=(ak+bk)ck1+ak=(ak+bk+1)ck1+ak
当m与n互素且 a 0 + b 0 = 1 a_0 + b_0 = 1 a0+b0=1时,序列 { c k } \{ c_k \} {ck}的周期为 ( 2 m − 1 ) ( 2 n − 1 ) (2^m - 1)(2^n - 1) (2m1)(2n1)

J-K触发器的缺陷

c k = ( a k + b k + 1 ) c k − 1 + a k c_k = (a_k + b_k + 1)c_{k - 1} + a_k ck=(ak+bk+1)ck1+ak可得:
c k = { a k , c k − 1 = 0 b k ‾ , c k − 1 = 1 c_k = \left \{ \begin{array}{c} a_k, & c_{k - 1} = 0 \\ \overline{b_k}, & c_{k - 1} = 1 \end{array} \right . ck={ak,bk,ck1=0ck1=1

  • 如果知道 { c k } \{ c_k \} {ck}中相邻位的值 c k − 1 c_{k - 1} ck1 c k c_k ck,就可以推断出 a k a_k ak b k b_k bk中的一个。而一旦知道足够多的这类信息,就可通过密码分析的方法得到序列 { a k } \{ a_k \} {ak} { b k } \{ b_k \} {bk}
  • 为了克服上述缺点,Pless提出了由多个J-K触发器序列驱动的多路复合序列方案,称为Pless生成器。

Pless生成器

Pless生成器由8个LFSR、4个J-K触发器和1个循环计数器构成,由循环计数器进行选通控制,如图所示:
Pless生成器

钟控序列生成器

钟控序列生成器模型

钟控序列最基本的模型是用一个LFSR控制另外一个LFSR的移位时钟脉冲,如图所示,一个最简单钟控序列生成器:
钟控序列生成器模型

  • 假设LFSR1和LFSR2分别输出序列 { a k } \{ a_k \} {ak} { b k } \{ b_k \} {bk},其周期分别为 p 1 p_1 p1 p 2 p_2 p2
  • 当LFSR1输出1时,移位时钟脉冲通过与门使LFSR2进行一次移位,从而生成下一位。
  • 当LFSR1输出0时,移位时钟脉冲无法通过与门影响LFSR2。因此LFSR2重复输出前一位。

钟控序列生成器周期

假设LFSR1和LFSR2分别输出序列 { a k } \{ a_k \} {ak} { b k } \{ b_k \} {bk},其周期分别为 p 1 p_1 p1 p 2 p_2 p2。假设钟控序列 { c k } \{ c_k \} {ck}的周期为 p p p,可得如下关系:
p = p 1 p 2 g c d ( w 1 , p 2 ) , 其 中 w 1 = ∑ i = 0 p 1 − 1 a i p = \frac{p_1p_2}{gcd(w_1, p_2)}, 其中w_1 = \sum^{p_1 - 1}_{i = 0}a_i p=gcd(w1,p2)p1p2,w1=i=0p11ai

  • c k c_k ck的一个周期至少是LFSR1和LFSR2同时回到初始状态的时刻
    • 显然当运行 p 1 × p 2 p_1 \times p_2 p1×p2个节拍后两个LFSR必然回到初态,因此周期至多是 p 1 × p 2 p_1 \times p_2 p1×p2
    • LFSR1运行一个周期,LFSR2运行 w 1 = d t w_1 = dt w1=dt拍, d = g c d ( w 1 , p 2 ) d = gcd(w_1, p_2) d=gcd(w1,p2)
    • LFSR1运行 ( p 2 / d ) (p_2 / d) (p2/d)个周期后,LFSR2刚好运行 d t × p 2 / d = t p 2 dt \times p_2 / d = tp_2 dt×p2/d=tp2拍,即t个周期,于是两个LFSR都回到初态,这时运行了 ( p 2 / d ) × p 1 (p_2/d) \times p_1 (p2/d)×p1个节拍
  • { a k } \{ a_k \} {ak} { b k } \{ b_k \} {bk}的极小特征多项式分别为 G F ( 2 ) GF(2) GF(2)上的 m m m n n n次本原多项式 f 1 ( x ) f_1(x) f1(x) f 2 ( x ) f_2(x) f2(x),且 m ∣ n m|n mn
    • p 1 = 2 m − 1 , p 2 = 2 n − 1 p_1 = 2^m - 1, p_2 = 2^n - 1 p1=2m1,p2=2n1
    • w 1 w_1 w1 { a k } \{ a_k \} {ak}一个周期内1的个数,因此 w 1 = 2 m − 1 w_1 = 2^{m - 1} w1=2m1
    • g c d ( w 1 . p 2 ) = 1 gcd(w_1. p_2) = 1 gcd(w1.p2)=1,所以 p = p 1 p 2 = ( 2 m − 1 ) ( 2 n − 1 ) p = p_1p_2 = (2^m - 1)(2^n - 1) p=p1p2=(2m1)(2n1)

钟控序列的线性复杂度

  • 可推导出 { a k } \{ a_k \} {ak}的线性复杂度为 n ( 2 m − 1 ) n(2^m - 1) n(2m1),极小特征多项式为 f 2 ( x 2 m − 1 ) f_2(x^{2^m - 1}) f2(x2m1)
    • 其对应的LFSR2的抽头每隔周期 p 1 = 2 m − 1 p_1 = 2^m - 1 p1=2m1一个,这样,参与运算的每个抽头对应的状态的节奏相同,从而相当于对LFSR2序列进行每 2 m − 1 2^m - 1 2m1拍的抽样序列(不计由于LFSR1的0游程而产生的重复),这个序列只是LFSR2的平移和按照LFSR1中的0游程进行迟延,而抽头应该与LFSR2的节奏一致,所以其极小多项式和线性复杂度如上

A5流密码

A5流密码算法的基本用法

A5/1流密码算法的基本用法

  • 用于蜂窝式移动电话系统语音和数字加密。
  • A5/1算法用于用户的手机到基站之间的通信加密,通信内容到基站后先解密变成明文,然后再进行基站到基站之间、以及基站到用户手机之间的信息加密,完成通信内容在通信过程的加密保护
  • 应用环节
    • 只需考察用户A到基站1之间通信内容的加解密,中间消息的传送由基站到基站之间的加密完成,而接收方用户B对消息的加解密与用户A到基站1之间的通信完全类似,只不过是用户B先解密消息。
  • 基本密钥 K A 1 K_{A1} KA1
    • 基本密钥 K A 1 K_{A1} KA1:预置在SIM卡中,与基站1共享。
    • 生存期:一旦植入SIM卡将不再改变。
    • 用途:用来分配用户和基站之间的会话密钥
  • 会话密钥k
    • 产生方式:在每次会话时,基站产生一个64比特的随机数k。
    • 分配方式:利用基本密钥 K A 1 K_{A1} KA1,使用其它密码算法将k加密传给用户手机。
    • 生存期:仅用于一次通话时间。
  • 明文处理
    • 按每帧228比特分为若干帧后逐帧加密,每帧处理方式相同。
  • 加密方式
    • 加密: E k ( M ) = E k 1 ( M 1 ) E k 2 ( M 2 ) E k 3 ( M 3 ) ⋅ ⋅ ⋅ E_k(M) = E_{k1}(M_1)E_{k2}(M_2)E_{k3}(M_3)··· Ek(M)=Ek1(M1)Ek2(M2)Ek3(M3)
    • 一次通话使用一个会话密钥,对每帧使用不同的帧密钥
    • 帧会话密钥:帧序号,长度为22比特
    • 帧会话密钥共产生228比特密钥流,实现对本帧228比特通信数据的加解密
    • 明密结合方式:逐位异或
    • 一次通话量:至多 2 22 2^{22} 222帧数据,约 0.89 × 2 30 0.89 \times 2^{30} 0.89×230比特。

A5/1序列密码算法中的线性反馈移位寄存器

算法使用3个级数为19、22和23的本原移存器。
A5/1序列密码算法中的线性反馈移位寄存器
注:A5/1算法中,LFSR的移位方式是左移方式。 各寄存器的编号从第0级编号
到第n-1级。

算法初始化

初始化是利用一次通话的会话密钥k和帧序号设定三个移存器的起点,即初始状态。

  • Step 1:将三个LFSR的初态都设置为全零向量;
  • Step 2:(密钥参与) 三个LFSR都规则动作64次,每次动作1步。
    • 在第i步动作时,三个LFSR的反馈内容都首先与密钥的第i比特异或,并将异或结果作为LFSR反馈的内容

帧序号参与

  • Step 3:(帧序号参与) 三个LFSR都规则动作22次,每次动作1步。在第i步动作时,三个LFSR的反馈内容都首先与帧序号的第i比特异或,并将异或的结果作为LFSR反馈的内容;帧序号比特的序号是从最低位编到最高位。

帧序号参与方式:与密钥参与方式相同,不同的明文数据帧按顺序编号,每个编号为22比特。
记帧序号为:
T 0 = t 22 t 21 . . . t 1 = 00...00 T 1 = t 22 t 21 . . . t 1 = 00...01 . . . . . . T_0 = t_{22}t_{21}...t_1 = 00...00 \\ T_1 = t_{22}t_{21}...t_1 = 00...01 \\ ...... T0=t22t21...t1=00...00T1=t22t21...t1=00...01......
帧密钥参与的目的:对不同的帧设置不同的帧会话密钥,保证对每帧以不同的起点生成密钥流,尽可能避免密钥重用。

A5流密码算法的基本原理

密钥流生成与加解密

  • A5算法中,采用钟控方式控制3个LFSR来产生密钥流。
  • 钟控信号 x 1 x 2 x 3 x_1x_2x_3 x1x2x3的采取: x 1 x_1 x1取自LFSR-1第9级; x 2 x_2 x2取自LFSR-2第11级; x 3 x_3 x3取自LFSR-3第11级 。
  • 控制方式:采用多项式 g ( x ) = x 1 x 2 + x 2 x 3 + x 3 x 1 g(x) = x_1x_2 + x_2x_3 + x_3x_1 g(x)=x1x2+x2x3+x3x1来确定,取钟控信号和多项式值相同的进行移位,不同的就不动。
( X 1 , X 2 , X 3 ) (X_1, X_2, X_3) (X1,X2,X3)000001010011100101110111
LFSR-1不动不动
LFSR-2不动不动
LFSR-3不动不动不动

关于加密

  • Step 4:三个LFSR以钟控方式连续动作100次,但不输出密钥流;
  • Step 5:三个LFSR以钟控方式连续动作114次,在每次动作后,三个LFSR都将最高位寄存器中的值输出,这三个比特的异或就是当前时刻输出的1比特密钥。
    • 连续动作114步,共输出114比特密钥流,用于对用户手机到基站传送的114比特数据的加密
      加 密 方 式 : c i = m i ⊕ d i ; i = 1 , 2 , . . . , 114 加密方式:c_i = m_i \oplus d_i; i = 1, 2,..., 114 ci=midi;i=1,2,...,114

关于解密

  • Step 6:三个LFSR以钟控方式连续动作100次,但不输出密钥流;
  • Step 7:三个LFSR以钟控方式连续动作114次,在每次动作后,三个LFSR都将最高级寄存器中的值输出,这三个比特的模2和就是当前时刻输出的1比特密钥流。
    • 连续动作114步,共输出114比特密钥流,这114比特用于对基站到用户手机传送的114比特数据的解密
      解 密 方 式 : m i ′ = c i ′ ⊕ d i ; i = 115 , 116 , . . . , 228 解密方式:m_i^{'} = c_i^{'} \oplus d_i; i = 115, 116,..., 228 mi=cidi;i=115,116,...,228

A5/1算法的弱点

  • 移位寄存器太短容易遭受穷举攻击
    • A5/1算法把主密钥作为算法中三个寄存器的初始值,长度为64比特。如果利用已知明文攻击,只需要知道其中两个寄存器的初始值,就可以计算出另一个寄存器的初始值,这只需要 2 40 2^{40} 240步就可以得出寄存器LFSR-1和LFSR-2的结构。
  • 事实上,A5/1加密算法中存在严重的安全问题
    • 利用了GSM通信加密中的两个安全漏洞,可以通过离线迭代计算生成一个彩虹表,它包含有密钥和其相对应的输出密码。这个彩虹表的大小为984GB。得到了彩虹表之后,安全专家就可以在短短的九秒内确定用于加密通信数据的密钥

密钥流生成器的基本原则

设计一个性能良好的序列密码是一项十分困难的任务。最基本的设计原则是“密钥流生成器的不可预测性”,它可分解为下述基本原则:

  1. 长周期。
  2. 高线性复杂度(用最少的移位寄存器来实现)。
  3. 统计性能良好。
  4. 足够的“混乱”。
  5. 足够的“扩散”。
  6. 抵抗不同形式的攻击。

祖冲之序列密码算法(ZUC)

  • 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比特字
  • 标准起草人:冯登国、林东岱、冯秀涛、周春芳

算法中的符号及含义

数值表示

文中整数如果不加特殊说明都为十进制,如果有前缀“0x”则表示十六进制,如
果有下标“2”则表示二进制。
例:整数 a a a可以有以下不同数制表示形式:
a = 1234567890 十 进 制 表 示 = 0 x 499602 D 2 十 六 进 制 表 示 = 100100110010110000000101101001 0 2 二 进 制 表 示 \begin{aligned} a & = 1234567890 \hspace{1em} 十进制表示 \\ & = 0x499602D2 \hspace{1em} 十六进制表示 \\ & = 1001001100101100000001011010010_2 \hspace{1em} 二进制表示 \end{aligned} a=1234567890=0x499602D2=10010011001011000000010110100102

数据位序

文中所有数据的最高位(或字节)在左边,最低位(或字节)在右边。如 a = 100100110010110000000101101001 0 2 a = 1001001100101100000001011010010_2 a=10010011001011000000010110100102 a a a的最高位为其最左边一位1, a a a的最低位为其最右边一位0。

运算符表示

运算符含义
+ + +两个整数相加
a b ab ab两个整数 a a a b b b相乘
= = =赋值运算
m o d mod mod整数取模
⊕ \oplus 整数间逐比特异或(模2加)
+ \boxed{+} + 2 32 2^{32} 232
a ∣ ∣ b a||b ab a a a b b b级联
a H a_H aH整数 a a a的高(最左)16位
a L a_L aL整数 a a a的低(最右)16位
a < < < k a<<<k a<<<k a a a循环左移 k k k
a > > 1 a>>1 a>>1 a a a右移1位
( a 1 , a 2 , . . . , a n ) → ( b 1 , b 2 , . . . , b n ) (a_1, a_2,..., a_n) \rightarrow (b_1, b_2,..., b_n) (a1,a2,...,an)(b1,b2,...,bn) a i a_i ai b i b_i bi并行赋值

ZUC算法结构

祖冲之密码算法结构

线性反馈移位寄存器

线性反馈移位寄存器(LFSR)由16个31比特寄存器单元 s 0 , s 1 , . . . , s 15 s_0, s_1,..., s_{15} s0,s1,...,s15组成,每个单元在集合 { 1 , 2 , 3 , . . . , 2 31 − 1 } \{ 1, 2, 3,...,2^{31} - 1 \} {1,2,3,...,2311}中取值。
线性反馈移位寄存器的特征多项式是有限域 G F ( 2 31 − 1 ) GF(2^{31} - 1) GF(2311)上的16次本原多项式:
p ( x ) = x 16 − 2 15 x 15 − 2 17 x 13 − 2 21 x 10 − 2 20 x 4 − ( 2 8 + 1 ) p(x) = x^{16} - 2^{15}x^{15} - 2^{17}x^{13} - 2^{21}x^{10} - 2^{20}x^{4} - (2^8 + 1) p(x)=x16215x15217x13221x10220x4(28+1)
其输出为有限域 G F ( 2 31 − 1 ) GF(2^{31} - 1) GF(2311)上的m序列,具有良好的随机性。
线性反馈移位寄存器的运行模式有两种:初始化模式和工作模式。

初始化模式

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

  • v = 2 15 s 15 + 2 17 s 13 + 2 21 s 10 + 2 20 s 4 + ( 1 + 2 8 ) s 0   m o d ( 2 31 − 1 ) v = 2^{15}s_{15} + 2^{17}s_{13} + 2^{21}s_{10} + 2^{20}s_{4} + (1 + 2^8)s_0 \ mod(2^{31} - 1) v=215s15+217s13+221s10+220s4+(1+28)s0 mod(2311)
  • s 16 = ( v + u ) m o d ( 2 31 − 1 ) s_{16} = (v + u)mod(2^{31} - 1) s16=(v+u)mod(2311)
  • 如果 s 16 = 0 s_{16} = 0 s16=0,则置 s 16 = 2 31 − 1 s_{16} = 2^{31} - 1 s16=2311
  • ( s 1 , s 2 , . . . , s 16 ) → ( s 0 , s 1 , . . . , s 15 ) (s_1, s_2,..., s_{16}) \rightarrow (s_0, s_1,..., s_{15}) (s1,s2,...,s16)(s0,s1,...,s15)

}

工作模式

在工作模式下,LFSR没有输入。计算过程如下:
LFSRWithWorkMode()
{

  • s 16 = 2 15 s 15 + 2 17 s 13 + 2 21 s 10 + 2 20 s 4 + ( 1 + 2 8 ) s 0   m o d ( 2 31 − 1 ) s_{16} = 2^{15}s_{15} + 2^{17}s_{13} + 2^{21}s_{10} + 2^{20}s_{4} + (1 + 2^8)s_0 \ mod(2^{31} - 1) s16=215s15+217s13+221s10+220s4+(1+28)s0 mod(2311)
  • 如果 s 16 = 0 s_{16} = 0 s16=0,则置 s 16 = 2 31 − 1 s_{16} = 2^{31} - 1 s16=2311
  • ( s 1 , s 2 , . . . , s 16 ) → ( s 0 , s 1 , . . . , s 15 ) (s_1, s_2,..., s_{16}) \rightarrow (s_0, s_1,..., s_{15}) (s1,s2,...,s16)(s0,s1,...,s15)

}

比特重组

比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字 X 0 , X 1 , X 2 , X 3 X_0, X_1, X_2, X_3 X0,X1,X2,X3,其中前3个字将用于下层的非线性函数 F F F,第4个字参与密钥流的计算。
具体计算过程如下:
BitReconstruction()
{

  • X 0 = s 15 H ∣ ∣ s 14 L X_0 = s_{15H} || s_{14L} X0=s15Hs14L
  • X 1 = s 11 H ∣ ∣ s 9 L X_1 = s_{11H} || s_{9L} X1=s11Hs9L
  • X 2 = s 7 H ∣ ∣ s 5 L X_2 = s_{7H} || s_{5L} X2=s7Hs5L
  • X 3 = s 2 H ∣ ∣ s 0 L X_3 = s_{2H} || s_{0L} X3=s2Hs0L

}

非线性函数 F F F

非线性函数 有2个32比特长的存储单元 R 1 R_1 R1 R 2 R_2 R2,其输入为来自上层比特重组的3个32比特字 X 0 , X 1 , X 2 X_0, X_1, X_2 X0,X1,X2,输出为一个32比特字 W W W。因此,非线性函数 F F F是一个把96比特压缩为32比特的一个非线性压缩函数。具体计算过程如下:
F ( X 0 , X 1 , X 2 ) F(X_0, X_1, X_2) F(X0,X1,X2)
{

  • W = ( X 0 ⊕ R 1 ) + R 2 W = (X_0 \oplus R_1) \boxed{+} R_2 W=(X0R1)+R2
  • W 1 = R 1 + X 1 W_1 = R_1 \boxed{+} X_1 W1=R1+X1
  • W 2 = R 2 + X 2 W_2 = R_2 \boxed{+} X_2 W2=R2+X2
  • R 1 = S ( L 1 ( W 1 L ∣ ∣ W 2 H ) ) R_1 = S(L_1(W_{1L}||W_{2H})) R1=S(L1(W1LW2H))
  • R 2 = S ( L 2 ( W 2 L ∣ ∣ W 1 H ) ) R_2 = S(L_2(W_{2L}||W_{1H})) R2=S(L2(W2LW1H))

}

S盒

S盒: 32 × 32 32 \times 32 32×32(即输入长和输出长都为32比特)的S盒由4个并置的 8 × 8 8 \times 8 8×8的S盒构成,即
S = ( S 0 , S 1 , S 2 , S 3 ) S = (S_0, S_1, S_2, S_3) S=(S0,S1,S2,S3)
其中 S 2 = S 0 , S 3 = S 1 S_2 = S_0, S_3 = S_1 S2=S0,S3=S1,于是有:
S = ( S 0 , S 1 , S 0 , S 1 ) S = (S_0, S_1, S_0, S_1) S=(S0,S1,S0,S1)

线性变换

线性变换 L 1 L_1 L1 L 2 L_2 L2 L 1 L_1 L1 L 2 L_2 L2为32比特线性变换,定义如下:
R ( t ) = { L 1 ( X ) = X ⊕ ( X < < < 2 ) ⊕ ( X < < < 10 ) ⊕ ( X < < < 18 ) ⊕ ( X < < < 24 ) L 2 ( X ) = X ⊕ ( X < < < 8 ) ⊕ ( X < < < 14 ) ⊕ ( X < < < 22 ) ⊕ ( X < < < 30 ) R(t) = \left \{ \begin{array}{c} L_1(X) = X \oplus (X <<< 2) \oplus (X <<< 10) \oplus (X <<< 18) \oplus (X <<< 24) \\ L_2(X) = X \oplus (X <<< 8) \oplus (X <<< 14) \oplus (X <<< 22) \oplus (X <<< 30) \end{array} \right . R(t)={L1(X)=X(X<<<2)(X<<<10)(X<<<18)(X<<<24)L2(X)=X(X<<<8)(X<<<14)(X<<<22)(X<<<30)
其中符号 a < < < n a<<<n a<<<n表示把 a a a循环左移 n n n位。
非线性函数 F F F输出的 W W W与比特重组(BR)输出的 X 3 X_3 X3异或,形成输出密钥序列 Z Z Z

密钥装载

密钥载入过程将128比特的初始密钥 k k k和128比特的初始向量 I V IV IV扩展为16个31比特长的整数,作为LFSR寄存器单元 s 0 , s 1 , . . . , s 15 s_0, s_1,..., s_{15} s0,s1,...,s15的初始状态。
k k k I V IV IV分别为:
k = k 0 ∣ ∣ k 1 ∣ ∣ ⋯ ∣ ∣ k 15 k = k_0 || k_1 || \cdots || k_{15} k=k0k1k15

I V = i v 0 ∣ ∣ i v 1 ∣ ∣ ⋯ ∣ ∣ i v 15 IV = iv_0 || iv_1 || \cdots || iv_{15} IV=iv0iv1iv15
其中, k i k_i ki i v i iv_i ivi均为8比特长字节, 0 ≤ i ≤ 15 0 \le i \le 15 0i15

密钥装载步骤
  • 设D为240比特的常量,可按如下方式分成16个15比特的自创:
    D = d 0 ∣ ∣ d 1 ∣ ∣ ⋯ ∣ ∣ d 15 D = d_0 || d_1 || \cdots || d_{15} D=d0d1d15
  • 0 ≤ i ≤ 15 0 \le i \le 15 0i15,取 s i = k i ∣ ∣ d i ∣ ∣ i v i s_i = k_i || d_i || iv_i si=kidiivi

ZUC的运行

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

初始化阶段

调用密钥装载过程,将128比特的初始密钥 k k k和128比特的初始向量 I V IV IV装入到LFSR的寄存器单元变量 s 0 , s 1 , . . . , s 15 s_0, s_1,..., s_{15} s0,s1,...,s15中,作为LFSR的初态,并置非线性函数 F F F中的32比特存储单元 R 1 R_1 R1 R 2 R_2 R2全为0。
然后重复执行以下过程32次:

  • BitReconstruction()
  • W = F ( X 0 , X 1 , X 2 ) W = F(X_0, X_1, X_2) W=F(X0,X1,X2)
  • LFSRWithInitialisationMode( u u u)

工作阶段

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

  • BitReconstruction()
  • F ( X 0 , X 1 , X 2 ) F(X_0, X_1, X_2) F(X0,X1,X2)
  • LFSRWithWorkMode()

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

  • BitReconstruction()
  • Z = F ( X 0 , X 1 , X 2 ) ⊕ X 3 Z = F(X_0, X_1, X_2) \oplus X_3 Z=F(X0,X1,X2)X3
  • LFSRWithWorkMode()

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

算法的输入与输出

ZUC机密性算法输入参数表
输入参数比特长度备注
COUNT32计数器
BEARER5承载层标识
DIRECTION1传输方向标识
CK128机密性密钥
LENGTH32明文消息的比特长度
MLENGTH明文消息的比特流
ZUC机密性算法输出参数表
输出参数比特长度备注
CLENGTH输出比特流

算法工作流程

加解密算法流程如图所示:
基于祖冲之密码的机密性算法128-EEA3

初始化

初始化是指根据机密性密钥 C K CK CK以及其他输入参数构造祖冲之算法的初始密钥 k k k和初始向量 I V IV IV
C K CK CK(128比特长)和 k k k(128比特长)分别表示为16个字节:
C K = C K [ 0 ] ∣ ∣ C K [ 1 ] ∣ ∣ C K [ 2 ] ∣ ∣ ⋯ ∣ ∣ C K [ 15 ] k = k [ 0 ] ∣ ∣ k [ 1 ] ∣ ∣ k [ 2 ] ∣ ∣ ⋯ ∣ ∣ k [ 15 ] CK = CK[0] || CK[1] || CK[2] || \cdots || CK[15] \\ k = k[0] || k[1] || k[2] || \cdots || k[15] CK=CK[0]CK[1]CK[2]CK[15]k=k[0]k[1]k[2]k[15]
令:
k [ i ] = C K [ i ] , i = 0 , 1 , 2 , . . . , 15 k[i] = CK[i], i = 0, 1, 2,..., 15 k[i]=CK[i],i=0,1,2,...,15
把计数器COUNT(32比特长)表示为4个字节:
C O U N T = C O U N T [ 0 ] ∣ ∣ C O U N T [ 1 ] ∣ ∣ C O U N T [ 2 ] ∣ ∣ C O U N T [ 3 ] COUNT = COUNT[0] || COUNT[1] || COUNT[2] || COUNT[3] COUNT=COUNT[0]COUNT[1]COUNT[2]COUNT[3]
把IV(128比特长)表示为16个字节:
I V = I V [ 0 ] ∣ ∣ I V [ 1 ] ∣ ∣ I V [ 2 ] ∣ ∣ ⋯ ∣ ∣ I V [ 15 ] , { I V [ 0 ] = C O U N T [ 0 ] , I V [ 1 ] = C O U N T [ 1 ] I V [ 2 ] = C O U N T [ 2 ] , I V [ 3 ] = C O U N T [ 3 ] I V [ 4 ] = B E A R E R ∣ ∣ D I R E C T I O N ∣ ∣ 0 0 2 I V [ 5 ] = I V [ 5 ] = I V [ 7 ] = 0000000 0 2 I V [ 8 ] = I V [ 0 ] , I V [ 9 ] = I V [ 1 ] I V [ 10 ] = I V [ 2 ] , I V [ 11 ] = I V [ 3 ] I V [ 12 ] = I V [ 4 ] , I V [ 13 ] = I V [ 5 ] I V [ 14 ] = I V [ 6 ] , I V [ 15 ] = I V [ 7 ] IV = IV[0] || IV[1] || IV[2] || \cdots || IV[15], \\ \left \{ \begin{array}{l} 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[5] = 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] \\ \end{array} \right . IV=IV[0]IV[1]IV[2]IV[15],IV[0]=COUNT[0],IV[1]=COUNT[1]IV[2]=COUNT[2],IV[3]=COUNT[3]IV[4]=BEARERDIRECTION002IV[5]=IV[5]=IV[7]=000000002IV[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 k k和初始向量 I V IV IV,调用ZUC密码产生 L L L个字(每个32比特长)的密钥,其中 L L L为:
L = ⌈ L E N G T H / 32 ⌉ L = \left \lceil LENGTH / 32 \right \rceil L=LENGTH/32
将生成的密钥流用比特串表示为 z [ 0 ] , z [ 1 ] , . . . , z [ 32 × L − 1 ] z[0], z[1],..., z[32 \times L - 1] z[0],z[1],...,z[32×L1],其中 z [ 0 ] z[0] z[0]为ZUC算法生成的第一个密钥字的最高位比特, z [ 31 ] z[31] z[31]为最低位比特,其他以此类推。

加解密

密钥流产生之后,数据的加解密就十分简单了。
设长度为 的输入消息的比特流为:
M = M [ 0 ] ∣ ∣ M [ 1 ] ∣ ∣ M [ 2 ] ∣ ∣ ⋯ ∣ ∣ M [ L E N G T H − 1 ] M = M[0] || M[1] || M[2] || \cdots || M[LENGTH - 1] M=M[0]M[1]M[2]M[LENGTH1]
则输出的密文比特流为:
C = C [ 0 ] ∣ ∣ C [ 1 ] ∣ ∣ C [ 2 ] ∣ ∣ ⋯ ∣ ∣ C [ L E N G T H − 1 ] C = C[0] || C[1] || C[2] || \cdots || C[LENGTH - 1] C=C[0]C[1]C[2]C[LENGTH1]
其中, C [ i ] = M [ i ] ⊕ z [ i ] , i = 0 , 1 , 2 , . . . , L E N G T H − 1 C[i] = M[i] \oplus z[i], i = 0, 1, 2,..., LENGTH - 1 C[i]=M[i]z[i],i=0,1,2,...,LENGTH1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溪入江流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值