现代密码学_电子科技大学_中国大学MOOC(慕课)
计算机网络安全原理_吴礼发、洪征编著_电子工业出版社出版_ISBN:9787121387272
现代密码学_杨波_清华大学出版社_ISBN:9787302465553
秋风阁——北溪入江流:https://focus-wind.com/
秋风阁——现代密码学 | 02:流密码
文章目录
非线性序列
- 密钥流生成器可分解为驱动子系统和非线性组合子系统
- 驱动子系统常用一个或多个线性反馈移位寄存器来实现
- 非线性组合子系统用非线性组合函数F来实现
- 为了使密钥流生成器输出的二元序列尽可能复杂,也应保证其周期尽可能大、线性复杂度和不可预测性尽可能高
Geffe序列生成器
- Geffe序列生成器由3个LFSR组成,其中LFSR2作为控制生成器使用
- 当LFSR2输出1时,LFSR2与LFSR1相连接
- 当LFSR2输出0时,LFSR2与LFSR3相连接
若设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=1∏3(2ni−1),线性复杂度: ( 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}
ck−1,即:
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)ck−1+x1。
其中
x
1
x_1
x1和
x
2
x_2
x2分别是J和K端的输入。由此可得J-K触发器的真值表,如下表所示:
J | K | c k c_k ck |
---|---|---|
0 | 0 | c k − 1 c_{k-1} ck−1 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | c k − 1 ‾ \overline{c_{k-1}} ck−1 |
利用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}:m级m序列{bk}:n级m序列ck=(ak+bk)ck−1+ak=(ak+bk+1)ck−1+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)
(2m−1)(2n−1)。
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)ck−1+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,ck−1=0ck−1=1
- 如果知道 { c k } \{ c_k \} {ck}中相邻位的值 c k − 1 c_{k - 1} ck−1和 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个循环计数器构成,由循环计数器进行选通控制,如图所示:
钟控序列生成器
钟控序列生成器模型
钟控序列最基本的模型是用一个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=0∑p1−1ai
-
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
m∣n。
- 则 p 1 = 2 m − 1 , p 2 = 2 n − 1 p_1 = 2^m - 1, p_2 = 2^n - 1 p1=2m−1,p2=2n−1。
- 而 w 1 w_1 w1为 { a k } \{ a_k \} {ak}一个周期内1的个数,因此 w 1 = 2 m − 1 w_1 = 2^{m - 1} w1=2m−1。
- 故 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=(2m−1)(2n−1)。
钟控序列的线性复杂度
- 可推导出
{
a
k
}
\{ a_k \}
{ak}的线性复杂度为
n
(
2
m
−
1
)
n(2^m - 1)
n(2m−1),极小特征多项式为
f
2
(
x
2
m
−
1
)
f_2(x^{2^m - 1})
f2(x2m−1)
- 其对应的LFSR2的抽头每隔周期 p 1 = 2 m − 1 p_1 = 2^m - 1 p1=2m−1一个,这样,参与运算的每个抽头对应的状态的节奏相同,从而相当于对LFSR2序列进行每 2 m − 1 2^m - 1 2m−1拍的抽样序列(不计由于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算法中,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) | 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比特数据的加密
加 密 方 式 : c i = m i ⊕ d i ; i = 1 , 2 , . . . , 114 加密方式:c_i = m_i \oplus d_i; i = 1, 2,..., 114 加密方式:ci=mi⊕di;i=1,2,...,114
- 连续动作114步,共输出114比特密钥流,用于对用户手机到基站传送的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′=ci′⊕di;i=115,116,...,228
- 连续动作114步,共输出114比特密钥流,这114比特用于对基站到用户手机传送的114比特数据的解密
A5/1算法的弱点
- 移位寄存器太短容易遭受穷举攻击
- A5/1算法把主密钥作为算法中三个寄存器的初始值,长度为64比特。如果利用已知明文攻击,只需要知道其中两个寄存器的初始值,就可以计算出另一个寄存器的初始值,这只需要 2 40 2^{40} 240步就可以得出寄存器LFSR-1和LFSR-2的结构。
- 事实上,A5/1加密算法中存在严重的安全问题
- 利用了GSM通信加密中的两个安全漏洞,可以通过离线迭代计算生成一个彩虹表,它包含有密钥和其相对应的输出密码。这个彩虹表的大小为984GB。得到了彩虹表之后,安全专家就可以在短短的九秒内确定用于加密通信数据的密钥
密钥流生成器的基本原则
设计一个性能良好的序列密码是一项十分困难的任务。最基本的设计原则是“密钥流生成器的不可预测性”,它可分解为下述基本原则:
- 长周期。
- 高线性复杂度(用最少的移位寄存器来实现)。
- 统计性能良好。
- 足够的“混乱”。
- 足够的“扩散”。
- 抵抗不同形式的攻击。
祖冲之序列密码算法(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 a∣∣b | 串 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,...,231−1}中取值。
线性反馈移位寄存器的特征多项式是有限域
G
F
(
2
31
−
1
)
GF(2^{31} - 1)
GF(231−1)上的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)=x16−215x15−217x13−221x10−220x4−(28+1)
其输出为有限域
G
F
(
2
31
−
1
)
GF(2^{31} - 1)
GF(231−1)上的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(231−1)
- s 16 = ( v + u ) m o d ( 2 31 − 1 ) s_{16} = (v + u)mod(2^{31} - 1) s16=(v+u)mod(231−1)
- 如果 s 16 = 0 s_{16} = 0 s16=0,则置 s 16 = 2 31 − 1 s_{16} = 2^{31} - 1 s16=231−1
- ( 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(231−1)
- 如果 s 16 = 0 s_{16} = 0 s16=0,则置 s 16 = 2 31 − 1 s_{16} = 2^{31} - 1 s16=231−1
- ( 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=s15H∣∣s14L;
- X 1 = s 11 H ∣ ∣ s 9 L X_1 = s_{11H} || s_{9L} X1=s11H∣∣s9L;
- X 2 = s 7 H ∣ ∣ s 5 L X_2 = s_{7H} || s_{5L} X2=s7H∣∣s5L;
- X 3 = s 2 H ∣ ∣ s 0 L X_3 = s_{2H} || s_{0L} X3=s2H∣∣s0L;
}
非线性函数 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=(X0⊕R1)+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(W1L∣∣W2H))
- R 2 = S ( L 2 ( W 2 L ∣ ∣ W 1 H ) ) R_2 = S(L_2(W_{2L}||W_{1H})) R2=S(L2(W2L∣∣W1H))
}
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=k0∣∣k1∣∣⋯∣∣k15
和
I
V
=
i
v
0
∣
∣
i
v
1
∣
∣
⋯
∣
∣
i
v
15
IV = iv_0 || iv_1 || \cdots || iv_{15}
IV=iv0∣∣iv1∣∣⋯∣∣iv15
其中,
k
i
k_i
ki和
i
v
i
iv_i
ivi均为8比特长字节,
0
≤
i
≤
15
0 \le i \le 15
0≤i≤15。
密钥装载步骤
- 设D为240比特的常量,可按如下方式分成16个15比特的自创:
D = d 0 ∣ ∣ d 1 ∣ ∣ ⋯ ∣ ∣ d 15 D = d_0 || d_1 || \cdots || d_{15} D=d0∣∣d1∣∣⋯∣∣d15 - 对 0 ≤ i ≤ 15 0 \le i \le 15 0≤i≤15,取 s i = k i ∣ ∣ d i ∣ ∣ i v i s_i = k_i || d_i || iv_i si=ki∣∣di∣∣ivi
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
算法的输入与输出
输入参数 | 比特长度 | 备注 |
---|---|---|
COUNT | 32 | 计数器 |
BEARER | 5 | 承载层标识 |
DIRECTION | 1 | 传输方向标识 |
CK | 128 | 机密性密钥 |
LENGTH | 32 | 明文消息的比特长度 |
M | LENGTH | 明文消息的比特流 |
输出参数 | 比特长度 | 备注 |
---|---|---|
C | LENGTH | 输出比特流 |
算法工作流程
加解密算法流程如图所示:
初始化
初始化是指根据机密性密钥
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]=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]
密钥流的产生
设消息长为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×L−1],其中
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[LENGTH−1]
则输出的密文比特流为:
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[LENGTH−1]
其中,
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,...,LENGTH−1。