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

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

文章目录

  • 非线性序列
    • Geffe序列生成器
    • J-K触发器
      • 利用J-K触发器的非线性序列生成器
      • J-K触发器的缺陷
    • Pless生成器
    • 钟控序列生成器
      • 钟控序列生成器模型
      • 钟控序列生成器周期
      • 钟控序列的线性复杂度
  • A5流密码
    • A5流密码算法的基本用法
      • A5/1流密码算法的基本用法
      • A5/1序列密码算法中的线性反馈移位寄存器
      • 算法初始化
      • 帧序号参与
    • A5流密码算法的基本原理
      • 密钥流生成与加解密
      • 关于加密
      • 关于解密
      • A5/1算法的弱点
      • 密钥流生成器的基本原则
  • 祖冲之序列密码算法(ZUC)
    • 算法中的符号及含义
      • 数值表示
      • 数据位序
      • 运算符表示
    • ZUC算法结构
      • 线性反馈移位寄存器
        • 初始化模式
        • 工作模式
      • 比特重组
      • 非线性函数FFF
        • S盒
        • 线性变换
      • 密钥装载
        • 密钥装载步骤
    • ZUC的运行
      • 初始化阶段
      • 工作阶段
    • 基于祖冲之密码的机密性算法128-EEA3
      • 算法的输入与输出
      • 算法工作流程
        • 初始化
        • 密钥流的产生
      • 加解密

非线性序列

  • 密钥流生成器可分解为驱动子系统和非线性组合子系统

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

Geffe序列生成器

  • Geffe序列生成器由3个LFSR组成,其中LFSR2作为控制生成器使用
  • 当LFSR2输出1时,LFSR2与LFSR1相连接
  • 当LFSR2输出0时,LFSR2与LFSR3相连接


    若设LFSRi的输出序列为{ak(i)(i=1,2,3)}\{ {a_k}^{(i)}(i = 1, 2, 3) \}{ak​(i)(i=1,2,3)},则输出序列{bk}\{ b_k \}{bk​}可以表示为:
    bk=ak(1)ak(2)+ak(3)ak(2)‾=ak(1)ak(2)+ak(3)ak(2)+ak(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的特征多项式分别为nin_ini​次本原多项式,且nin_ini​两两互素,则Geffe序列的周期为:∏i=13(2ni−1)\prod \limits_{i = 1}^3 (2^{n_i} - 1)i=1∏3​(2ni​−1),线性复杂度:(n1+n3)n2+n3(n_1 + n_3)n_2 + n_3(n1​+n3​)n2​+n3​。
    Geffe序列的周期实现了极大化,且0与1之间的分布大体上是平衡的。

J-K触发器

J-K触发器如图所示,它的两个输入端分别用J和K表示,其输出ckc_kck​不仅依赖于输入,还依赖于前一个输出位ck−1c_{k-1}ck−1​,即:
ck=(x1+x2)‾ck−1+x1c_k = \overline{(x_1 + x_2)}c_{k-1} + x_1ck​=(x1​+x2​)​ck−1​+x1​。

其中x1x_1x1​和x2x_2x2​分别是J和K端的输入。由此可得J-K触发器的真值表,如下表所示:

J K ckc_kck​
0 0 ck−1c_{k-1}ck−1​
0 1 0
1 0 1
1 1 ck−1‾\overline{c_{k-1}}ck−1​​

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


{ak}:m级m序列{bk}:n级m序列ck=(ak+bk)‾ck−1+ak=(ak+bk+1)ck−1+ak\{ 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​}:m级m序列{bk​}:n级m序列ck​=(ak​+bk​)​ck−1​+ak​=(ak​+bk​+1)ck−1​+ak​
当m与n互素且a0+b0=1a_0 + b_0 = 1a0​+b0​=1时,序列{ck}\{ c_k \}{ck​}的周期为(2m−1)(2n−1)(2^m - 1)(2^n - 1)(2m−1)(2n−1)。

J-K触发器的缺陷

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

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

Pless生成器

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

钟控序列生成器

钟控序列生成器模型

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

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

钟控序列生成器周期

假设LFSR1和LFSR2分别输出序列{ak}\{ a_k \}{ak​}和{bk}\{ b_k \}{bk​},其周期分别为p1p_1p1​和p2p_2p2​。假设钟控序列{ck}\{ c_k \}{ck​}的周期为ppp,可得如下关系:
p=p1p2gcd(w1,p2),其中w1=∑i=0p1−1aip = \frac{p_1p_2}{gcd(w_1, p_2)}, 其中w_1 = \sum^{p_1 - 1}_{i = 0}a_ip=gcd(w1​,p2​)p1​p2​​,其中w1​=i=0∑p1​−1​ai​

  • ckc_kck​的一个周期至少是LFSR1和LFSR2同时回到初始状态的时刻

    • 显然当运行p1×p2p_1 \times p_2p1​×p2​个节拍后两个LFSR必然回到初态,因此周期至多是p1×p2p_1 \times p_2p1​×p2​
    • LFSR1运行一个周期,LFSR2运行w1=dtw_1 = dtw1​=dt拍,d=gcd(w1,p2)d = gcd(w_1, p_2)d=gcd(w1​,p2​)
    • LFSR1运行(p2/d)(p_2 / d)(p2​/d)个周期后,LFSR2刚好运行dt×p2/d=tp2dt \times p_2 / d = tp_2dt×p2​/d=tp2​拍,即t个周期,于是两个LFSR都回到初态,这时运行了(p2/d)×p1(p_2/d) \times p_1(p2​/d)×p1​个节拍
  • 若{ak}\{ a_k \}{ak​}和{bk}\{ b_k \}{bk​}的极小特征多项式分别为GF(2)GF(2)GF(2)上的mmm和nnn次本原多项式f1(x)f_1(x)f1​(x)和f2(x)f_2(x)f2​(x),且m∣nm|nm∣n。
    • 则p1=2m−1,p2=2n−1p_1 = 2^m - 1, p_2 = 2^n - 1p1​=2m−1,p2​=2n−1。
    • 而w1w_1w1​为{ak}\{ a_k \}{ak​}一个周期内1的个数,因此w1=2m−1w_1 = 2^{m - 1}w1​=2m−1。
    • 故gcd(w1.p2)=1gcd(w_1. p_2) = 1gcd(w1​.p2​)=1,所以p=p1p2=(2m−1)(2n−1)p = p_1p_2 = (2^m - 1)(2^n - 1)p=p1​p2​=(2m−1)(2n−1)。

钟控序列的线性复杂度

  • 可推导出{ak}\{ a_k \}{ak​}的线性复杂度为n(2m−1)n(2^m - 1)n(2m−1),极小特征多项式为f2(x2m−1)f_2(x^{2^m - 1})f2​(x2m−1)

    • 其对应的LFSR2的抽头每隔周期p1=2m−1p_1 = 2^m - 1p1​=2m−1一个,这样,参与运算的每个抽头对应的状态的节奏相同,从而相当于对LFSR2序列进行每2m−12^m - 12m−1拍的抽样序列(不计由于LFSR1的0游程而产生的重复),这个序列只是LFSR2的平移和按照LFSR1中的0游程进行迟延,而抽头应该与LFSR2的节奏一致,所以其极小多项式和线性复杂度如上

A5流密码

A5流密码算法的基本用法

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

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

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

算法使用3个级数为19、22和23的本原移存器。

注: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比特。
记帧序号为:
T0=t22t21...t1=00...00T1=t22t21...t1=00...01......T_0 = t_{22}t_{21}...t_1 = 00...00 \\ T_1 = t_{22}t_{21}...t_1 = 00...01 \\ ...... T0​=t22​t21​...t1​=00...00T1​=t22​t21​...t1​=00...01......
帧密钥参与的目的:对不同的帧设置不同的帧会话密钥,保证对每帧以不同的起点生成密钥流,尽可能避免密钥重用。

A5流密码算法的基本原理

密钥流生成与加解密

  • A5算法中,采用钟控方式控制3个LFSR来产生密钥流。
  • 钟控信号x1x2x3x_1x_2x_3x1​x2​x3​的采取:x1x_1x1​取自LFSR-1第9级; x2x_2x2​取自LFSR-2第11级;x3x_3x3​取自LFSR-3第11级 。
  • 控制方式:采用多项式g(x)=x1x2+x2x3+x3x1g(x) = x_1x_2 + x_2x_3 + x_3x_1g(x)=x1​x2​+x2​x3​+x3​x1​来确定,取钟控信号和多项式值相同的进行移位,不同的就不动。
(X1,X2,X3)(X_1, X_2, X_3)(X1​,X2​,X3​) 000 001 010 011 100 101 110 111
LFSR-1 不动 不动
LFSR-2 不动 不动
LFSR-3 不动 不动 不动

关于加密

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

关于解密

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

A5/1算法的弱点

  • 移位寄存器太短容易遭受穷举攻击

    • A5/1算法把主密钥作为算法中三个寄存器的初始值,长度为64比特。如果利用已知明文攻击,只需要知道其中两个寄存器的初始值,就可以计算出另一个寄存器的初始值,这只需要2402^{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”则表示二进制。
例:整数aaa可以有以下不同数制表示形式:
a=1234567890十进制表示=0x499602D2十六进制表示=10010011001011000000010110100102二进制表示\begin{aligned} a & = 1234567890 \hspace{1em} 十进制表示 \\ & = 0x499602D2 \hspace{1em} 十六进制表示 \\ & = 1001001100101100000001011010010_2 \hspace{1em} 二进制表示 \end{aligned} a​=1234567890十进制表示=0x499602D2十六进制表示=10010011001011000000010110100102​二进制表示​

数据位序

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

运算符表示

运算符 含义
+++ 两个整数相加
ababab 两个整数aaa和bbb相乘
=== 赋值运算
modmodmod 整数取模
⊕\oplus⊕ 整数间逐比特异或(模2加)
+\boxed{+}+​ 模2322^{32}232加
a∣∣ba||ba∣∣b 串aaa和bbb级联
aHa_HaH​ 整数aaa的高(最左)16位
aLa_LaL​ 整数aaa的低(最右)16位
a<<<ka<<<ka<<<k aaa循环左移kkk位
a>>1a>>1a>>1 aaa右移1位
(a1,a2,...,an)→(b1,b2,...,bn)(a_1, a_2,..., a_n) \rightarrow (b_1, b_2,..., b_n)(a1​,a2​,...,an​)→(b1​,b2​,...,bn​) aia_iai​到bib_ibi​并行赋值

ZUC算法结构

线性反馈移位寄存器

线性反馈移位寄存器(LFSR)由16个31比特寄存器单元s0,s1,...,s15s_0, s_1,..., s_{15}s0​,s1​,...,s15​组成,每个单元在集合{1,2,3,...,231−1}\{ 1, 2, 3,...,2^{31} - 1 \}{1,2,3,...,231−1}中取值。
线性反馈移位寄存器的特征多项式是有限域GF(231−1)GF(2^{31} - 1)GF(231−1)上的16次本原多项式:
p(x)=x16−215x15−217x13−221x10−220x4−(28+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)=x16−215x15−217x13−221x10−220x4−(28+1)
其输出为有限域GF(231−1)GF(2^{31} - 1)GF(231−1)上的m序列,具有良好的随机性。
线性反馈移位寄存器的运行模式有两种:初始化模式和工作模式。

初始化模式

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

  • v=215s15+217s13+221s10+220s4+(1+28)s0mod(231−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(231−1)
  • s16=(v+u)mod(231−1)s_{16} = (v + u)mod(2^{31} - 1)s16​=(v+u)mod(231−1)
  • 如果s16=0s_{16} = 0s16​=0,则置s16=231−1s_{16} = 2^{31} - 1s16​=231−1
  • (s1,s2,...,s16)→(s0,s1,...,s15)(s_1, s_2,..., s_{16}) \rightarrow (s_0, s_1,..., s_{15})(s1​,s2​,...,s16​)→(s0​,s1​,...,s15​)

}

工作模式

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

  • s16=215s15+217s13+221s10+220s4+(1+28)s0mod(231−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(231−1)
  • 如果s16=0s_{16} = 0s16​=0,则置s16=231−1s_{16} = 2^{31} - 1s16​=231−1
  • (s1,s2,...,s16)→(s0,s1,...,s15)(s_1, s_2,..., s_{16}) \rightarrow (s_0, s_1,..., s_{15})(s1​,s2​,...,s16​)→(s0​,s1​,...,s15​)

}

比特重组

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

  • X0=s15H∣∣s14LX_0 = s_{15H} || s_{14L}X0​=s15H​∣∣s14L​;
  • X1=s11H∣∣s9LX_1 = s_{11H} || s_{9L}X1​=s11H​∣∣s9L​;
  • X2=s7H∣∣s5LX_2 = s_{7H} || s_{5L}X2​=s7H​∣∣s5L​;
  • X3=s2H∣∣s0LX_3 = s_{2H} || s_{0L}X3​=s2H​∣∣s0L​;

}

非线性函数FFF

非线性函数 有2个32比特长的存储单元R1R_1R1​和R2R_2R2​,其输入为来自上层比特重组的3个32比特字X0,X1,X2X_0, X_1, X_2X0​,X1​,X2​,输出为一个32比特字WWW。因此,非线性函数FFF是一个把96比特压缩为32比特的一个非线性压缩函数。具体计算过程如下:
F(X0,X1,X2)F(X_0, X_1, X_2)F(X0​,X1​,X2​)
{

  • W=(X0⊕R1)+R2W = (X_0 \oplus R_1) \boxed{+} R_2W=(X0​⊕R1​)+​R2​
  • W1=R1+X1W_1 = R_1 \boxed{+} X_1W1​=R1​+​X1​
  • W2=R2+X2W_2 = R_2 \boxed{+} X_2W2​=R2​+​X2​
  • R1=S(L1(W1L∣∣W2H))R_1 = S(L_1(W_{1L}||W_{2H}))R1​=S(L1​(W1L​∣∣W2H​))
  • R2=S(L2(W2L∣∣W1H))R_2 = S(L_2(W_{2L}||W_{1H}))R2​=S(L2​(W2L​∣∣W1H​))

}

S盒

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

线性变换

线性变换L1L_1L1​和L2L_2L2​:L1L_1L1​和L2L_2L2​为32比特线性变换,定义如下:
R(t)={L1(X)=X⊕(X<<<2)⊕(X<<<10)⊕(X<<<18)⊕(X<<<24)L2(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<<<na<<<na<<<n表示把aaa循环左移nnn位。
非线性函数FFF输出的WWW与比特重组(BR)输出的X3X_3X3​异或,形成输出密钥序列ZZZ。

密钥装载

密钥载入过程将128比特的初始密钥kkk和128比特的初始向量IVIVIV扩展为16个31比特长的整数,作为LFSR寄存器单元s0,s1,...,s15s_0, s_1,..., s_{15}s0​,s1​,...,s15​的初始状态。
设kkk和IVIVIV分别为:
k=k0∣∣k1∣∣⋯∣∣k15k = k_0 || k_1 || \cdots || k_{15}k=k0​∣∣k1​∣∣⋯∣∣k15​

IV=iv0∣∣iv1∣∣⋯∣∣iv15IV = iv_0 || iv_1 || \cdots || iv_{15}IV=iv0​∣∣iv1​∣∣⋯∣∣iv15​
其中,kik_iki​和iviiv_iivi​均为8比特长字节,0≤i≤150 \le i \le 150≤i≤15。

密钥装载步骤

  • 设D为240比特的常量,可按如下方式分成16个15比特的自创:
    D=d0∣∣d1∣∣⋯∣∣d15D = d_0 || d_1 || \cdots || d_{15}D=d0​∣∣d1​∣∣⋯∣∣d15​
  • 对0≤i≤150 \le i \le 150≤i≤15,取si=ki∣∣di∣∣ivis_i = k_i || d_i || iv_isi​=ki​∣∣di​∣∣ivi​

ZUC的运行

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

初始化阶段

调用密钥装载过程,将128比特的初始密钥kkk和128比特的初始向量IVIVIV装入到LFSR的寄存器单元变量s0,s1,...,s15s_0, s_1,..., s_{15}s0​,s1​,...,s15​中,作为LFSR的初态,并置非线性函数FFF中的32比特存储单元R1R_1R1​和R2R_2R2​全为0。
然后重复执行以下过程32次:

  • BitReconstruction()
  • W=F(X0,X1,X2)W = F(X_0, X_1, X_2)W=F(X0​,X1​,X2​)
  • LFSRWithInitialisationMode(uuu)

工作阶段

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

  • BitReconstruction()
  • F(X0,X1,X2)F(X_0, X_1, X_2)F(X0​,X1​,X2​)
  • LFSRWithWorkMode()

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

  • BitReconstruction()
  • Z=F(X0,X1,X2)⊕X3Z = F(X_0, X_1, X_2) \oplus X_3Z=F(X0​,X1​,X2​)⊕X3​
  • LFSRWithWorkMode()

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

算法的输入与输出

ZUC机密性算法输入参数表

输入参数 比特长度 备注
COUNT 32 计数器
BEARER 5 承载层标识
DIRECTION 1 传输方向标识
CK 128 机密性密钥
LENGTH 32 明文消息的比特长度
M LENGTH 明文消息的比特流

ZUC机密性算法输出参数表

输出参数 比特长度 备注
C LENGTH 输出比特流

算法工作流程

加解密算法流程如图所示:

初始化

初始化是指根据机密性密钥CKCKCK以及其他输入参数构造祖冲之算法的初始密钥kkk和初始向量IVIVIV。
把CKCKCK(128比特长)和kkk(128比特长)分别表示为16个字节:
CK=CK[0]∣∣CK[1]∣∣CK[2]∣∣⋯∣∣CK[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]=CK[i],i=0,1,2,...,15k[i] = CK[i], i = 0, 1, 2,..., 15 k[i]=CK[i],i=0,1,2,...,15
把计数器COUNT(32比特长)表示为4个字节:
COUNT=COUNT[0]∣∣COUNT[1]∣∣COUNT[2]∣∣COUNT[3]COUNT = COUNT[0] || COUNT[1] || COUNT[2] || COUNT[3]COUNT=COUNT[0]∣∣COUNT[1]∣∣COUNT[2]∣∣COUNT[3]
把IV(128比特长)表示为16个字节:
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]=BEARER∣∣DIRECTION∣∣002IV[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]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]=BEARER∣∣DIRECTION∣∣002​IV[5]=IV[5]=IV[7]=000000002​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]​

密钥流的产生

设消息长为LENGTH比特,由初始化算法得到的初始密钥kkk和初始向量IVIVIV,调用ZUC密码产生LLL个字(每个32比特长)的密钥,其中LLL为:
L=⌈LENGTH/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×L−1],其中z[0]z[0]z[0]为ZUC算法生成的第一个密钥字的最高位比特,z[31]z[31]z[31]为最低位比特,其他以此类推。

加解密

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

现代密码学 | 02:流密码——2相关推荐

  1. 现代密码学 | 02:流密码——1

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

  2. 斯坦福Dan Boneh密码学——04 流密码

    斯坦福Dan Boneh密码学--04 流密码 密码学系列第四篇笔记 流密码 简单来说,流密码实现了我们构建使用合理短密钥的安全密码的目的. 伪随机生成器 回想一次性密码本,密钥.消息和密文都是L位字 ...

  3. 【密码学02】密码系统原理及数学背景

    上一篇文章[密码学]四大主题简单介绍 一文提到要实现信息传输的保密性.完整性,以及身份鉴别和抗抵赖,使用的技术手段有: 1)       密码技术(加密与解密). 2)       哈希技术,即散列技 ...

  4. 备考2023年下半年-软考信息安全工程师之路

    中级-信息安全工程师 信息安全工程师是属于软考中级科目,含金量很高的.(软考对应的级别科目如图所示)信息安全工程师在社会上的需求是蛮大的. 信息安全工程师主要涉及计算机信息安全方面,在计算机软硬件.网 ...

  5. 【完整版-斯坦福-密码学】全13讲(流密码)【笔记】

    目录 写在前面的话 参考资料 笔记 写在前面的话 个人笔记,仅供参考,不喜勿喷,谢谢大家. 参考资料 视频:[完整版-斯坦福-密码学]全13讲 理解密码学:如何理解"语义安全(semanti ...

  6. 【现代密码学基础Introduction to Modern Cryptography】02 完美性加密(perfectly secret encryption)

    [现代密码学基础Introduction to Modern Cryptography]02 完美性加密(perfectly secret encryption) Perfect secrecy 1. ...

  7. 密码学之ASCII编码(02)

    ASCII编码 ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用 ...

  8. 密码学与网络安全 - 7 分组加密的工作模式 8 伪随机数的产生和流密码

    7 分组加密的工作模式 7.1 多重加密与三重DES 7.1.1 双重DES 双重DES所对应的映射不被单DES所定义,所以是强于单DES的 中间相遇攻击:可能的密钥加密明文,然后用可能的密钥解密密文 ...

  9. 《信息安全工程师教程》学习笔记02(第二章 密码学基础与应用—DES算法)

    第二章 密码学基础与应用 2.1 密码学的基本概念 1949年香农发表了<保密系统的通信理论> 1976年W.Diffie和M.Hellman提出公开密钥密码 1977年美国联邦政府颁布数 ...

最新文章

  1. SpringBoot-web开发(三): 模板引擎Thymeleaf
  2. 10行代码-原生JS双向数据绑定演示
  3. jQuery live事件说明及移除live事件方法
  4. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解
  5. python中oxf2是多少_python 函数基础2
  6. KVM源代码阅读--内核版本3.17.4
  7. linux中安装mysql_Linux下安装MySQL
  8. 小米路由器3 保姆级救砖回忆录及实操技巧演示
  9. 【同态加密算法的学习日记】
  10. 西门子PLC s7-1200学习之路
  11. freessl申请ssl证书-笔记
  12. request、response
  13. 麦客CEO李卉:实践证明肯钻营的“小而美”亦动人|企服三会系列报道
  14. 优雅地使用 C++ 制作表格:tabulate
  15. 基于UEBA的用户上网异常行为分析
  16. 官宣,Google DeepMind 成立
  17. 【图像去噪】基于matlab高斯+均值+中值+双边滤波图像去噪【含Matlab源码 1872期】
  18. 【数理知识】kronecker 克罗内克积
  19. Android 人脸识别了解一下 (上)
  20. 卷积神经网络调参技巧(2)--过拟合(Dropout)

热门文章

  1. 在 BeyondStudio for NXP 使用 Gawk(for JN5169)
  2. 中国人工智能行业市场供需与战略研究报告
  3. Word处理控件Aspose.Words功能演示:在 Java 中将 HTML 文件转换为 Word 文档
  4. 软件开发架构师的职责
  5. Shell实现自动添加新行
  6. 1d在c语言中,佳能1D X和1D C的区别只是固件?
  7. 【linux驱动开发】i2c驱动框架之温湿度传感器htu21d
  8. Android 判断一个点是否在封闭的Path内或不规则的图形内
  9. 编了一套爬虫美女图的一组代码,请大神指点一二;
  10. C# arcgis globecontrol 三维地图 基础操作 加载地图 缩放 漫游