密码学02-流密码
流密码
流密码的基本概念
一次一密
一次一密密码
一种理想的加密方案,叫做一次一密密码(one-time pad),由 Major Joseph Mauborgne和 AT&T 公司的 Gilbert Vernam 1917年发明的
-
明文:\(x=x_0 x_1 x_2\dots\)
-
密钥:\(k=k_0 k_1 k_2 \dots\)
-
密文:\(y=y_0 y_1 y_2 \dots\)
-
加密函数:\(y_i=x_i+k_i(mod26)\)
-
解密函数:\(x_i=y_i-k_i(mod26)\)
注:密钥为随机产生的,而且只使用一次
优点:
- 密钥随机产生,仅使用一次
- 无条件安全
- 加密和解密为加法运算,效率较高
缺点:
- 密钥长度至少与明文长度一样长,密钥共享困难,不太实用
流密码的定义
概况
流密码(stream cipher)是一种重要的密码体制
- 明文消息按字符或比特逐位加密
- 流密码也称为序列密码(Sequence Cipher)
流密码在20世纪50年代得到飞跃式发展
- 密钥流可以用移位寄存器电路来产生,也促进了线性和非线性移位寄存器发展
- 流密码主要是基于硬件实现
基本思想
流密码的基本思想:
利用密钥k产生一个密钥流\(z=z_0z_1z_2…\),并使用如下规则对明文串\(x=x_0x_{1}x_{2}…\)加密:
密钥流
- 由密钥流发生器\(f\) 产生:\(z_i=f(k,σ_i)\)
- \(σ_i\) 是加密器中的记忆元件在时刻 \(i\) 的状态
- \(f\) 是由 \(k, σ_i\) 产生的函数
内部记忆元件由一组移位寄存器构成
同步流密码
内部记忆元件的状态 \(σ_i\) 独立于明文字符的叫做同步流密码,否则叫做自同步流密码。
在同步流密码中,由于 \(z_i=f(k,σ_i)\) 与明文字符无关,因而此时密文字符 \(y_i=E_{z_i}(x_i)\) 也不依赖于此前的明文字符。因此,可将同步流密码的加密器分成密钥流产生器和加密变换器两个部分。
体制模型
二元加法流密码是目前最为常用的流密码体制,其加密变换可表示为yi=zi ㊉ xi。
需求
一次一密密码是加法流密码的原型
- 如果密钥用作滚动密钥流,则加法流密码就退化成一次一密密码。
密码设计者的最大愿望是设计出一个滚动密钥生成器,使得密钥经其扩展成的密钥流序列具有如下性质:
- 极大的周期
- 良好的统计特性
- 抗线性分析
有限状态自动机
有限状态自动机
模型
有限状态自动机是具有离散输入和输出(输入集和输出集均有限)的一种数学模型,由以下3部分组成:
① 有限状态集\(S=\{ s_i | i=1,2,\dots,l \}\)
②有限输入字符集\(A_1=\{ A^{(1)}_j| j=1,2,\dots,m\}\)和有限输出字符集\(A_2=\{A^{(2)}_k |k=1,2,\dots,n\}\)。
③ 转移函数\(A^{(2)}_k=f_1(s_i, A^{(1)}_j )\),$ s_h=f_2(s_i, A^{(1)}_j) $
即在状态为\(s_i\), 输入为\(A^{(1)}_j\)时,输出为\(A^{(2)}_k\), 而状态转移为\(s_h\)。
有向图表示
有限状态自动机可用有向图表示,称为转移图。
- 转移图的顶点对应于自动机的状态, 若状态\(s_i\)在输入\(A^{(1)}_i\)时转为状态\(s_j\), 且输出一字符\(A^{(2)}_j\), 则在转移图中, 从状态\(s_i\)到状态\(s_j\)有一条标有\((A^{(1)}_i,A^{(2)}_j)\)的弧线。
矩阵表示
设\(S=\{s_1,s_2,s_3\}\), \(A_1=\{A_1^{(1)},A_2^{(1)},A_3^{(1)}\}\), \(A_2=\{A_1^{(2)},A_2^{(2)},A_3^{(2)}\}\), 则该有限状态自动机的矩阵表示如下:
f1 | A1(1) | A2(1) | A3(1) |
---|---|---|---|
s 1 | A1(2) | A3(2) | A2(2) |
s 2 | A2(2) | A1(2) | A3(2) |
s 3 | A3(2) | A2(2) | A1(2) |
f2 | A1(1) | A2(1) | A3(1) |
---|---|---|---|
s 1 | s2 | s1 | s3 |
s 2 | s3 | s2 | s1 |
s 3 | s1 | s3 | s |
实例
若输入序列为:
\(A^{(1)}_1,A^{(1)}_2,A^{(1)}_1,A^{(1)}_3,A^{(1)}_3,A^{(1)}_1\)
初始状态为\(s_1\),则得到状态序列:
\(s_1,s_2,s_2,s_3,s_2,s_1,s_2\)
输出字符序列:
\(A^{(2)}_1,A^{(2)}_1,A^{(2)}_2,A^{(2)}_1,A^{(2)}_3,A^{(2)}_1\)
密钥流生成器
产生器
密钥流产生器: 参数为\(k\)的有限状态自动机,
一个输出符号集 \(Z\)、 一个状态集 \(∑\)、两个函数 \(φ\) 和 \(ψ\) 以及一个初始状态 \(σ_0\) 组成。
状态转移函数 \(φ:σ_i→σ_i+1\), 将当前状态σi变为一个新状态\(σ_i+1\),
输出函数\(ψ:σ_i→z_i\), 当前状态σi变为输出符号集中的一个元素 \(z_i\)。
作为有限状态自动机的密钥流生成器
设计的关键
- 关键在于: 找出适当的状态转移函数 \(φ\) 和输出函数 \(ψ\) ,使得输出序列 \(z\) 满足密钥流序列 \(z\) 应满足的随机性条件, 并且要求在设备上是节省的和容易实现的。
- 一般采用线性的 \(φ\) 和非线性的 \(ψ\),这样将能够进行深入的分析并可以得到好的生成器
分解
- 密钥流生成器可分成驱动部分和非线性组合部分
- 驱动部分控制生成器的状态转移,并为非线性组合部分提供统计性能好的序列
- 非线性组合部分要利用这些序列组合出满足要求的密钥流序列
常见的两种密钥流产生器
目前最为流行和实用的密钥流产生器,其驱动部分是一个或多个LFSR(Linear Feedback Shift Register,线性反馈移位寄存器)。
- 前者称为滤波生成器,或前馈生成器
- 后者称为非线性组合生成器
- 还有钟控生成器,缩减生成器,停走生成器等
二元序列的伪随机性
二元序列的相关概念
定义
GF(2)上的一个无限序列
称为二元序列, 其中 \(a_i \in GF(2)\)。
• 周期:对于二元序列 \(\underset{\rightarrow}{a}\),如果存在正整数\(l\),使得对于一切正整数k都有
则称 \(\underset{\rightarrow}{a}\) 是周期的。
满足上述条件的最小正整数称为 \(\underset{\rightarrow}{a}\) 的周期,记为 \(p(\underset{\rightarrow}{a})\)
二元序列(Binary Sequence)是一种只包含两种可能值的序列,这两种值通常是0和1。二元序列在计算机科学、信息理论、密码学等领域有着广泛的应用。以下是有关二元序列的详细介绍:
特点
值的范围: 二元序列中的每个元素都是0或1。这种二元性质使其在计算机中非常容易处理,因为计算机的基本数据单元就是二进制位(bit)。
长度: 二元序列的长度可以是任意的有限正整数。例如,一个长度为5的二元序列可能是
10101
。示例
- 基本示例:
0101101
:一个长度为7的二元序列。111000
:一个长度为6的二元序列。
周期的性质
设 \(GF(2)\) 上的一个无限序列 \(\underset{\rightarrow}{a} = ( a_1,a_2,\dots,a_n,\dots)\) 是周期为 \(p(\underset{\rightarrow}{a})\) 的二元序列,并设正整数 \(l\) 对任何非负整数 \(k\) 都有 \(a_k=a_{k+1}\),则一定有
• 证明:设 \(l=qp(\underset{\rightarrow}{a})+r\) , 其中 \(q,r\) 为正整数,且 \(0\le r <p(\underset{\rightarrow}{a})\), 则有
又由于 \(0\le r <p(\underset{\rightarrow}{a})\) , 根据 \(p(\underset{\rightarrow}{a})\) 的极小性可知 $r = 0 $, 因此 \(p(\underset{\rightarrow}{a})|l\) 。
游程的定义
设 \(a\) 是 \(GF(2)\) 上周期为 \(p(\underset{\rightarrow}{a})\) 的周期序列。将 \(a\) 的一个周期
依次排列在一个圆周上使 \(a_{p(\underset{\rightarrow}{a})}\) 与 \(a_1\)相连, 把这个圆周上形如
的一连串两两相邻的项分别称为 \(\underset{\rightarrow}{a}\) 的一个周期中一个 1 游程或一个 0 游程。而 1 游程中 1 的个数或 0 游程中 0 的个数称为游程的长度。
游程的例子
周期为15的二元序列
1100010011010111
011110
为1的4游程10001
为0的3游程
自相关函数
\(GF(2)\)上周期为T的序列\(\{a_i\}\)的自相关函数定义为
当\(t=0\)时, \(R(t)=T\); 当\(t≠0\)时,称\(R(t)\)为异相自相关函数。
二元序列的自相关函数(Autocorrelation Function)用于衡量序列与其自身的相似度。自相关函数是信号处理中一个重要的工具,它可以帮助分析序列的周期性和重复性。
定义
对于一个长度为 \(N\) 的二元序列\(\{x_n\}\),其自相关函数 \(R_k\) 定义为:
- 这里:
- \(R_k\) 是自相关函数在滞后 \(k\) 下的值。
- \(x_n\) 是序列的第 \(n\) 个元素。
- \(x_{(n+k)\mod N}\) 是在滞后 \(k\) 下的序列元素,取模操作确保序列在末尾后循环回到开始。
示例:
假设有一个长度为 \(N = 4\) 的二元序列 \(\{x_n\} = \{1, 0, 1, 0\}\)。我们可以计算其自相关函数 \(R_k\) 如下:
- 滞后 \(k = 0\):
- 滞后 \(k=1\)
- 滞后 \(k=2\)
- 滞后\(k=3\)
因此,该序列的自相关函数为:
两种自相关函数的区别
1. 第一种自相关函数
公式:\(R(t)=\sum\limits_k^T(-1)^{a_k}(-1)^{a_{k+1}},0\le t <T-1\)
解释:
- 这是一个特定形式的自相关函数计算公式,其中 \(a_k\) 是二元序列中的元素。
- 公式中,\((-1)^{a_k}\) 将二元序列中的0和1转换为-1和1,因此公式可以看作是计算了二元序列经过这种转换后的自相关。
- \((-1)^{a_k}\) 和\((-1)^{a_{k+1}}\) 之间的乘积用于表示序列在不同位置上的相关性。这种形式的自相关函数常用于检测序列的周期性和模式。
2. 经典自相关函数
公式:\(R_k = \frac{1}{N} \sum_{n=0}^{N-1} x_n \cdot x_{(n+k) \mod > N}\)
解释:
- 这是经典的自相关函数公式,适用于任何二元序列或一般的序列。
- \(x_n\) 是序列在位置 \(n\) 上的值,\(x_{(n+k) \mod N}\) 是在滞后 \(k\) 后的值。
- 这个公式计算了序列在滞后 \(k\) 下的自相关程度,结果为滞后 \(k\) 时的相关性,通常用于分析信号的周期性和相似度。
主要区别
形式和转换:
- 第一种公式通过 \((-1)^{a_k}\) 的转换将二元序列中的0和1映射为-1和1,这使得它更适用于特定的分析,例如检测周期性和相位关系。
- 经典自相关函数公式直接使用二元序列中的0和1进行计算,不进行转换。
计算方式:
- 第一种公式是通过对序列的转换后进行计算,结果通常用于更具体的信号处理或序列分析。
- 经典自相关函数公式更通用,用于计算序列的自相关值,结果通常用于了解序列的整体相关性和周期性。
适用范围:
- 第一种公式通常用于特殊的二元序列分析,特别是在信号处理中或特定的数学模型中。
- 经典自相关函数公式适用于一般的自相关分析,包括二元序列和其他类型的序列。
伪随机序列
Golomb伪随机公设
3个随机性公设:
-
在序列的一个周期内, 0与1的个数相差至多为1。
- 说明{ai}中0与1出现的概率基本上相同
-
在序列的一个周期内,长为i的游程占游程总数的1/2i (i=1,2,…), 且在等长的游程中0的游程个数和1的游程个数相等。
- 说明0与1在序列中每一位置上出现的概率相同
-
异相自相关函数是一个常数。
- 意味着通过对序列与其平移后的序列做比较,不能给出其他任何信息
伪随机序列的定义
设 \(\underset{\rightarrow}{a} = ( a_1,a_2,\dots,a_n,\dots)\) 是 GF(2) 上一个周期等于 \(p(\underset{\rightarrow}{a})\) 的周期序列。
如果对于一切 \(t\not\equiv{0(mod{p(\underset{\rightarrow}{a})})}\), 有
则称序列 \(\underset{\rightarrow}{a} = ( a_1,a_2,\dots,a_n,\dots)\) 为伪随机序列。
可以证明上述定义满足Golomb三个伪随机公设,详情参考万哲先著。
代数和编码(第三版)。高等教育出版社, 2007.
伪随机序列的例子
周期为15的二元序列
100010011010111
-
0的个数为7
- 1的个数为8
-
0的游程个数为4
- 1的游程个数为4
-
异相自相关函数等于-1
伪随机序列还应满足的条件
- 周期 \(p\) 要足够大, 如大于\(10^{50}\);
- 序列 \(\{a_i\}_{i \ge 1}\) 产生易于高速生成;
- 当序列 \(\{a_i\}_{i \ge 1}\) 的任何部分暴露时, 要分析整个序列, 提取产生它的电路结构信息, 在计算上是不可行的, 称此为不可预测性。
3决定了密码的强度, 是流密码理论的核心。 它包含了流密码要研究的许多主要问题, 如线性复杂度、 相关免疫性、 不可预测性等等。
线性反馈移位寄存器
反馈移位寄存器
反馈移位寄存器
移位寄存器是流密码产生密钥流的一个主要组成部分。
\(GF(2)\)上一个n级反馈移位寄存器由 \(n\) 个二元存储器与一个反馈函数\(f(a1,a2,…,an)\)组成,如下图所示。
反馈移位寄存器的状态
在任一时刻,这些级的内容构成该反馈移位寄存器的状态,每一状态对应于\(GF(2)\)上的一个n维向量,共有 \(2^n\)种可能的状态。每一时刻的状态可用 \(n\) 维向量
反馈函数
初始状态由用户确定。
反馈函数\(f(a_1,a_2,\dots,a_n)\)是\(n\)元布尔函数,即函数的自变量和因变量只取0和1这两个可能的值。
函数中的运算有逻辑与、逻辑或、逻辑补等运算。
例子
如图是一个3级反馈移位寄存器,其初始状态为\((a_1,a_2,a_3)=(1,0,1)\), 输出可由右表给出。
\(状态(a_3,a_2,a_1)\) | \(输出\) |
---|---|
\(1 0 1\) | \(1\) |
\(1 1 0\) | \(0\) |
\(1 1 1\) | \(1\) |
\(0 1 1\) | \(1\) |
\(1 0 1\) | \(1\) |
\(1 1 0\) | \(0\) |
即输出序列为101110111011…,周期为4。
线性反馈移位寄存器
线性反馈移位寄存器LFSR(linear feedback shift register)
GF(2)上的n级线性反馈移位寄存器
LFSR的反馈函数
输出序列\(\{a_t\}\)满足:
线性反馈移位寄存器: 实现简单、速度快、有较为成熟的理论,成为构造密钥流生成器的最重要的部件之一。
LFSR的实例
下图是一个5级线性反馈移位寄存器,其初始状态为\((a_1,a_2,a_3,a_4,a_5) =(1,0,0,1,1)\)
反馈函数:\(a_{5+t}=a_{t+3}\oplus a_t,t=1,2,\dots\)
求解如:
\(a_6 = a_{5+1} = a_{1+3}\oplus a_1 = a_4\oplus a_1 = 1 \oplus 1 = 0\)
可求出输出序列为 :
\(\underbrace{10011}_{初始序列}\,01001000010101110110001111100110…\)
周期31。
密钥流的周期
给定密钥流\(\{a_i\}=a_1,a_2,a_3,\dots a_n,\dots\),如果存在整数 \(r\),使得对于任意 \(a_i\) ,都有 \(a_{i+r}=a_i\),则称 \(r\) 为该密钥流的一个周期,称满足 \(a_{i+r} = a_i\) 的最小正整数为该密钥流的最小周期或简称周期。
LFSR的性质
总是假定\(c_1,c_2,…,c_n\)中至少有一个不为0,否则\(f(a1,a2,\dots,an)\equiv 0\)。总是假定\(c_n=1\)。
- LFSR输出序列的性质: 完全由其反馈函数决定。
- n级LFSR状态数: 最多有\(2^n\)个
- n级LFSR的状态周期: \(\le2^{n-1}\)
- 输出序列的周期=状态周期, \(\leq2^{n-1}\)
选择合适的反馈函数可使序列的周期达到最大值 \(2^{n-1}\) , 周期达到最大值的序列称为\(m\)。
m-序列
线性反馈移位寄存器的多项式表示
定义2.1 设\(n\)级线性移位寄存器的输出序列满足递推关系:
用延迟算子 \(D(Da_k=a_{k-1})\) 作为未定元, 给出的反馈多项式为:
这种递推关系可用一个一元高次多项式 :
表示, 称这个多项式为LFSR的特征多项式。
关于特征多项式的解释
\(D(a_k)=a_{k-1}\),用 \(p(D)=1+c_1D+\dots+c_bD^n\) 作用于 \(a_{n+k}\) 后恰好就是上式左侧,即:
生成函数
定义2.2 给定序列{ai}, 幂级数 :
称为该序列的生成函数。
生成函数的性质
定理2.1 设 \(p(x)=1+c_1x+ \dots +c_{n-1}x^{n-1}+c_n x_n\) 是\(GF(2)\)上的多项式, \(G(p(x))\)中任一序列\({a_i}\)的生成函数\(A(x)\)满足:
一些定理和定义
根据初始状态的不同,由递推关系\((*)\)生成的非恒零的序列有\(2^n-1\)个,记这\(2^n-1\)个非零序列的全体为\(G(p(x))\)。
定理2.2 \(p(x)|q(x)\)的充要条件是\(G(p(x))\subset G(q(x))\)。
——该定理说明:可用\(n\)级LFSR产生的序列,也可用级数更多的LFSR来产生。
定义2.3 设\(p(x)\)是\(GF(2)\)上的多项式,使\(p(x)|(x^p-1)\)成立的最小正整数\(p\)称为\(p(x)\)的周期或阶。
定理2.3 若序列\({ai}\)的特征多项式\(p(x)\)定义在\(GF(2)\)上, \(p\)是\(p(x)\)的周期,则\({ai}\)的周期\(r|p\)。
—— 该定理说明: \(n\)级LFSR输出序列的周期 \(r\),不依赖于初始条件,而依赖于特征多项式 \(p(x)\)。
m-序列产生的条件
不可约多项式
定理2.4 设 \(p(x)\) 是 \(n\) 次不可约多项式,周期为\(m\), 序列\({a_i}\in G(p(x))\), 则 \({a_i}\) 的周期为 \(m\)。
m-序列产生的必要条件
定理2.5 \(n\) 级LFSR产生的序列有最大周期\(2^n-1\)的必要条件是其特征多项式为不可约的。
该定理的逆不成立,即LFSR的特征多项式为不可约多项式时,其输出序列不一定是m序列。
定理2.5 的反例
例2.4 \(f(x)=x^4+x^3+x^2+x+1\)为\(GF(2)\)上的不可约多项式,这可由\(x,x+1,x^2+x+1\)都不能整除f(x)得到。以f(x)为特征多项式的LFSR的输出序列可由
和给定的初始状态求出,设初始状态为0001,则输出序列为000110001100011…,周期为5,不是\(m\)序列。
m-序列产生的充要条件
定义2.4 若\(n\)次不可约多项式\(p(x)\)的阶为\(2^n-1\), 则称\(p(x)\)是\(n\)次本原多项式。
定理2.6 设\({ai}\in G(p(x))\), \({ai}\)为\(m\)序列的充要条件是\(p(x)\)为本原多项式。
m-序列举例
例2.5 设\(p(x)=x^4+x+1\), 若LFSR以\(p(x)\)为特征多项式,则输出序列的递推关系为
若初始状态为1001,则输出为
周期为\(2^4-1=15\)。
若初始状态为1000,则输出为
m-序列的伪随机性
回顾:
游程: 设\({a_i}=(a_1a_2a_3…)\)为二元序列, 例如 00110111, 其前两个数字是00,称为0的2游程;接着是11, 是1的2游程;再下来是0的1游程和1的3游程。
自相关函数: \(GF(2)\)上周期为 \(T\) 的序列 \({a_i}\) 的自相关函数定义为
当\(t=0\)时, \(R(t)=T\); 当\(t≠0\)时, 称\(R(t)\)为异相自相关函数。
Golomb伪随机公设
3个随机性公设:
- 在序列的一个周期内, 0与1的个数相差至多为1。
- 说明{ai}中0与1出现的概率基本上相同
-
在序列的一个周期内,长为\(i\)的游程占游程总数的\(\frac{1}{2^i}(i=1,2\dots)\),且在等长的游程中0的游程个数和1的游程个数相等。
- 说明0与1在序列中每一位置上出现的概率相同
-
异相自相关函数是一个常数
- 意味着通过对序列与其平移后的序列做比较,不能给出其他任何信息
伪随机序列的定义
设 \(\underrightarrow{a}=(a_1,a_2,\dots,a_{p(\underrightarrow{a})},\dots)\) 是 GF(2) 上一个周期等于 \(p(\underrightarrow{a})\)的周期序列。如果对于一切\(t\not\equiv0(mod\,p(\underrightarrow{a}))\), 有
则称序列 \(\underrightarrow{a}=(a_1,a_2,\dots,a_{p(\underrightarrow{a})},\dots)\) 为伪随机序列。
m-序列的伪随机性
m序列满足Golomb的3个随机性公设。
定理2.7 \(GF2)\)上的\(n\)长\(m\)序列\({a_i}\)具有如下性质:
-
在一个周期内, 0、 1出现的次数分别为\(2^{n-1}-1\)和\(2^{n-1}\)。
-
在一个周期内,总游程数为\(2^{n-1}\); 对\(1≤i≤n-2\), 长为\(i\)的游程有\(2^{n-i}-1\)个,且0、1游程各半;长为\(n-1\)的0游程一个,长为n的1游程一个。
-
{ai}的自相关函数为 :
证明1:
在\(n\)长\(m\)序列的一个周期内,除了全0状态外, 每个\(n\)长状态(共\(2^n- 1\)个)都恰好出现一次。
LFSR的输出为每个状态的\(a_1\) ,因此输出为1的状态必然是\((**…*1)\)的形式,而\(m\)序列这类状态共有\(2^{n-1}\)个,所以输出中1的个数为\(2^{n-1}\)个。
输出为0的状态必然是\((**…*0)\)的形式,而\(m\)序列这类状态共有\(2^{n-1}-1\)个(因为不能有全零状态),所以输出中0的个数为\(2^{n-1}-1\)个。
证明2:
对n=1,2, 易证结论成立。
对\(n>2\), 当\(1≤i≤n-2\)时, \(n\)长\(m\)序列的一个周期内,长为i的0游程数目等于序列中如下形式的状态数目: \(100…01… …\),其中\(n-i-2\)个可任取0或1。这种状态共有\(2^{n-i-2}\)个。同理可得长为i的1游程数目也等于\(2^{n-i-2}\), 所以长为\(i\)的游程总数为\(2^{n-i-1}\)。
由于寄存器中不会出现全0状态,所以不会出现0的\(n\)游程,但必有一个1的\(n\)游程,而且1的游程不会更大,因为若出现1的\(n+1\)游程,就必然有两个相邻的全1状态,但这是不可能的。这就证明了1的\(n\)游程必然出现在如下的串中:
当这n+2位通过移位寄存器时,便依次产生以下状态:
由于 \(0\,\underbrace{11\dots1}_{n-1个1}\quad \underbrace{11\dots1}_{n-1个1}\,0\) 两个状态只能各出现一次,所以不会再有1的n-1游程。
0的n-1游程只有一个
于是在一个周期内,总游程数为 :
证明3:
\({ai}\)是周期为\(2^n-1\)的\(m\)序列,对于任一正整数\(t(0<t<2^n-1)\), \({a_i}+{a_i+t}\)在一个周期内为0的位数正好是序列\({a_i}\)和\({a_i+t}\)对应位相同的位数。设序列\({a_i}\)满足递推关系:
令\(b_j=a_j\oplus a_{j+t}\),序列\({b_j}\)满足:\(b_{h+n}=c_1b_{h+n-1}\oplus c_2b_{h+n-2}\oplus \dots \oplus c_nb_n\)
因为对应同样的特征多项式,所以 也是 序列。
所以
m-序列的安全性
寻找m序列的递推关系式。
-
已知一段序列,如果知道其反馈多项式,就可以将其后的序列依次求出
-
已知序列能否获得相应的反馈多项式(或线性递推式)呢?
- 解方程方法——已知序列 \({ai}\) 是由 \(n\) 级线性移存器产生的,并且知道 \({ai}\) 的连续 \(2n\) 位,可用解线性方程组的方法得到反馈多项式。
- 线性反馈移位寄存器综合解——Berlekamp-Massey算法
解方程方法
例1 设序列 \(a = (01111000…)\) 是由4级线性移存器所产生序列的连续8个信号,求该移存器的线性递推式。
解:设该4级移存器的线性递推式为:
由于知道周期序列的连续8个信号,不妨设为开头的8个信号,即
当 \(n=4\) 时,由递归式可得:\(a_{4}=c_{1}a_{3}\oplus c_{2}a_{2}\oplus c_{3}a_{1}\oplus c_{4}a_{0}\)
故所求移存器递推式为:\(a_{n}=a_{n-3}\oplus a_{n-4}(n\geq_{4})\)
例2
进一步假定敌手还知道密钥流是使用5级线性反馈移位寄存器产生的,那么敌手可分别用密钥流中的前10个比特建立如下方程
即
从而得到
所以
密钥流的递推关系为
密钥流的递推关系为
线性反馈移位寄存器综合
根据密码学的需要,对线性反馈移位寄存器(LFSR)主要考虑下面两个问题:
- 如何利用级数尽可能短的LFSR产生周期大、随机性能良好的序列。
- 这是从密钥生成角度考虑,用最小的代价产生尽可能好的、参与密码变换的序列。
- 当已知一个长为N序列 \(\underline{a}\) 时,如何构造一个级数尽可能小的LFSR来产生它。
- 这是从密码分析角度来考虑,要想用线性方法重构密钥序列所必须付出的最小代价。
线性综合解
设 \(\underline{ a }=(a_{0},a_{1},\dots a_{N-1})\) 是 \(F_{2}\) 上的长度为N的序列,而 \(f(x)=c_{0}+c_{1}x+c_{2}x^{2}+\dots c_{l}x^l\) 是 \(F_{2}\) 上的多项式,\(c_{0}=1\)
如果序列中的元素满足递推关系:
则称 \(\langle{f(x),l}\rangle\) 产生二元序列 \(\underline{a}\) 。其中 \(\langle{f(x),l}\rangle\) 表示以 \(f(x)\) 为特征多项式的 \(l\) 级线性移位寄存器。
如果 \(f(x)\) 是一个能产生a并且级数最小的线性移位寄存器的特征多项式, \(l\) 是该移存器的级数, 则称 \(\langle{f(x),l}\rangle\) 为序列 \(\underline{a}\) 的线性综合解。
线性移位寄存器的综合问题
线性移位寄存器的综合问题可表述为:给定一个N长二元序列 \(\underline{a}\),如何求出产生这一序列的最小级数的线性移位寄存器,即最短的线性移存器。
- 特征多项式 \(f(x)\) 的次数小于 \(l\)。 因为产生 \(\underline{a}\) 且级数最小的线性移位寄存器可能是退化的,在这种情况下 \(f(x)\) 的次数小于 \(l\);并且此时 \(f(x)\) 中的\(c_{l}=0\),因此在特征多项式 \(f(x)\) 中仅要求\(c_{0}=1\),但不要求\(c_{l}=1\)。
- 规定:0级线性移位寄存器是以 \(f(x)=1\) 为特征多项式的线性移位寄存器, 且 \(n\) 长 \((n=1, 2, …, N)\) 全零序列, 仅由0级线性移位寄存器产生。 事实上, 以f(x)=1为反馈特征多项式的递归关系式是: \(a_k=0, k=0, 1, \dots, n-1\). 因此, 这一规定是合理的。
- 给定一个N长二元序列 \(\underline{a}\),求能产生 \(\underline{a}\) 并且级数最小的线性移位寄存器,就是求 \(\underline{a}\) 的线性综合解。 利用 \(B-M\) 算法可以有效的求出。
Berlekamp-Massey算法(B-M算法)
用归纳法求出一系列线性移位寄存器:
每一个 \(\langle{f_{n}(x),l_{n}}\rangle\) 都是产生序列 \(\underline{a}\) 的前n项的最短线性一位寄存器,在 \(\langle{f_{n}(x),l_{n}}\rangle\) 的基础上构造相应的 \(\langle{f_{n+1}(x),l_{n+1}}\rangle\) ,使得是 \(\langle{f_{n+1}(x),l_{n+1}}\rangle\)
产生给定序列前n+1项的最短移存器,则最后普得到的 \(\langle{f_{N}(x),l_{N}}\rangle\) 就是产生给定N长二院序列 \(\underline{a}\) 的最短的线性移位寄存器。
任意给定一个N长序列 \(\underline{a}=(a_{0},a_{1},\dots,a_{N-1})\) ,按 \(n\) 归纳定义
- 取初始值: \(f_0(x)=1, l_{0} = 0\)
- 设 \(\langle{f_{0}(x),l_{0}}\rangle,\langle{f_{1}(x),l_{1}}\rangle,\dots,\langle{f_{n}(x),l_{n}}\rangle(0\geq{N})\) 均以求得,且 \(l_{0}\geq,l_{1}\geq\dots\geq l_{n}\)
- 记:\(f_{n}(x)=c_{0}^{(n)}+c_{1}^{(n)}x+\dots+c_{l}^{(n)}x^{l_{n}}=1,\)再计算:
非线性序列1
非线性序列
密钥流生成器可分解为驱动子系统和非线性组合子系统,如图所示
![[非线性序列1.png]]
- 驱动子系统常用一个或多个线性反馈移位寄存器来实现
- 非线性组合子系统用非线性组合函数F来实现
- 为了使密钥流生成器输出的二元序列尽可能复杂,也应保证其周期尽可能大、 线性复杂度和不可预测性尽可能高
Geffe序列生成器
Geffe序列生成器由3个LFSR组成,其中LFSR2作为控制生成器使用,如图所示
![[Geffe序列生成器.png]]
-
当LFSR2输出1时, LFSR2与LFSR1相连接
-
当LFSR2输出0时, LFSR2与LFSR3相连接
![[Geffe序列生成器(续).png]]
Geffe序列的周期实现了极大化,且0与1之间的分布大体上是平衡的。
若设 \(LFSRi\) 的输出序列为 \(a_{k}^{(i)} (i=1,2,3)\),则输出序列 \(\{b_k\}\) 可以表示为
设LFSRi的特征多项式分别为ni次本原多项式,且ni 两两互素
则Geffe序列的周期\(=\prod^3_{{i=1}}(i^{n_{i}}-1)\)
线性复杂度 = \((n_{1}+n_{3})n_{2}+n_{3}\)
J-K触发器
J-K触发器如图所示,它的两个输入端分别用J和K表示,其输出ck不仅依赖于输入,还依赖于前一个输出位ck-1, 即
![[J-K触发器.png]]
其中x1和x2分别是J和K端的输入。由此可得J-K触发器的真值表,如下表所示
\(J\) | \(K\) | \(c_{k}\) |
---|---|---|
\(0\) | \(0\) | \(c_{k-1}\) |
\(0\) | \(1\) | \(0\) |
\(1\) | \(0\) | \(1\) |
\(1\) | \(1\) | \(\overline{c_{k-1}}\) |
J-K触发器真值表 |
利用J-K触发器的非线性序列生成器
![[利用J-K触发器的非线性序列生成器.png]]
当\(m\)与\(n\)互素且\(a_{0}+b_{0}=1\)时,序列\(\{c_k\}\)的周期为\((2^m-1)(2^n-1)\)。
利用J-K触发器的非线性序列生成器的实例
例 令\(m=2,n=3\), 两个驱动 \(m\) 序列分别为
和
于是,输出序列\(\{ck\}\)是\(0,1,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,0,0,1,0,…,\)
其周期为\((2^2-1)(2^3-1)=21\)。
弱点
由\(c_{k}=(a_{k}+b_{k}+1)c_{k-1}+a_{k}\)可得
- 如果知道 \(\{c_k\}\) 中相邻位的值\(c_{k-1}\)和 \({c_k}\), 就可以推断出 \(a_k\) 和 \(b_k\) 中的一个。而一旦知道足够多的这类信息,就可通过密码分析的方法得到序列\(\{a_k\}\)和\(\{b_k\}\)。
- 为了克服上述缺点, Pless提出了由多个J-K触发器序列驱动的多路复合序列方案,称为Pless生成器。
Pless生成器
Pless生成器由8个LFSR、 4个J-K触发器和1个循环计数器构成,由循环计数器进行选通控制,如图所示。
![[Pless生成器.png]]
非线性序列2
钟控序列生成器
钟控序列最基本的模型是用一个LFSR控制另外一个LFSR的移位时钟脉冲,如图所示,一个最简单钟控序列生成器
![[钟控序列生成器模型.png]]
- 假设LFSR1和LFSR2分别输出序列 \(\{a_k\}\) 和 \(\{bk\}\) ,其周期分别为p1和p2。
- 当LFSR1输出1时,移位时钟脉冲通过与门使LFSR2进行一次移位,从而生成下一位。
- 当LFSR1输出0时,移位时钟脉冲无法通过与门影响LFSR2。因此LFSR2重复输出前一位。
钟控序列的周期
假设LFSR1和LFSR2分别输出序列 \(\{a_k\}\) 和 \({b_k}\) , 其周期分别为 \(p_{1}\) 和 \(p_{2}\) 。 假设钟控序列 \({c_{k}}\) 的周期为p,可得如下关系:
\(c_{k}\) 的一个周期至少是LFSR1和LFSR2同时回到初始状态的时刻
- 显然当运行\(p_{1}× p_{2}\)个节拍后两个LFSR必然回到初态,因此周期至多是 \(p_{1}× p_{2}\)
- LFSR1运行一个周期, LFSR2运行\(w_{1}=d{t}\) 拍,\(d=gcd(w1,p2)\)
- 则LFSR1运行 \(\frac{p_{2}}{d}\) 个周期后, LFSR2刚好运行 \(dt\times \frac{p_{2}}{d}=tp_{2}\) 拍,即\(t\)个周期,于是两个LFSR都回到初态,这时运行了 \(\frac{p_{2}}{d}\times p_{1}\)个节拍
- 若 \(a_{k}\)和 \(b_{k}\) 的极小特征多项式分别为GF(2)上的m和n次本原多项式 \(f_1(x)\) 和 \(f_2(x)\),且\(m|n\)。
- 则 \(p_{1}=2^m-1,p_{2}=2^n-1\)
- 而 \(w_{1}\) 为 \({a_{k}}\)一个周期内1的个数,因此 \(w_{1}=2^{m-1}\)
- 故 \(gcd(w_{1},p_{2})\),所以 \(p=p_{1}p_{2}=(2^m-1)(2^n-1)\)。
钟控序列的线性复杂度
可推导出{ck}的线性复杂度为 \(n(2^m-1)\),极小特征多项式为 \(f_{2}(x^{2^m-1})\)
其对应的LFSR2的抽头每隔周期\(p1=2^m-1\)一个,这样,参与运算的每个抽头对应的状态的节奏相同,从而相当于对LFSR2序列进行每 \(2^m-1\) 拍的抽样序列(不计由于LFSR1的0游程而产生的重复),这个序列只是LFSR2的平移和按照LFSR1中的0游程进行迟延,而抽头应该与LFSR2的节奏一致,所以其极小多项式和线性复杂度如上
在这个设置中,LFSR2 的抽头每隔 \(2^m-1\) 个周期被选中。这意味着:
- LFSR2的抽头位置每隔 \(2^m-1\) 个时钟周期参与运算。这种机制相当于通过 LFSR1 来对 LFSR2 的输出序列进行采样。因为每个抽头位按照这个周期来工作,LFSR2 序列的抽样就遵循了 LFSR1 的周期。
钟控序列的例子
设LFSR1为3级m序列生成器,其特征多项式为\(f_1(x)=1+x+x3\)。设初态为 \(a_{0}=a_{1}=a_{2}=1\) ,于是输出序列为\(\{a_k\}=1,1,1,0,1,0,0,\dots\)
又设LFSR2为3级m序列生成器,且记其状态向量为\({\sigma_{k}}\),则在上图的构造下 \(\sigma_{k}\) 的变化情况如下:
\(\{c_{k}\}\) 的周期为(23-1)2=49,在它的一个周期内,每个 \(\sigma_{k}\) 恰好出现7次
设 \(f_2(x)=1+x2+x3\) 为LFSR2的特征多项式,且初态为 \(b_{0}=b_{1}=b_{2}=1\),则\(\{b_k\}=1,1,1,0,0,1,0,1,1,1…\)
![[钟控序列的例子.png]]
\(\{ck\}\)的极小特征多项式为 \(1+x^{14}+x^{21}\),其线性复杂度为 \(3·(2^3-1)=21\),下图是其线性等价生成器。
![[钟控序列的例子线性等价生成器。.png]]
A5流密码算法
A5流密码算法的基本用法
A5流密码算法用于蜂窝式移动电话系统语音和数字加密。
A5/1算法用于用户的手机到基站之间的通信加密, 通信内容到基站后先解密变成明文, 然后再进行基站到基站之间、 以及基站到用户手机之间的信息加密, 完成通信内容在通信过程的加密保护
![[A5_1流密码算法通信模式.png]]
- 应用环节
只需考察用户A到基站1之间通信内容的加解密,中间消息的传送由基站到基站之间的加密完成,而接收方用户B对消息的加解密与用户A到基站1之间的通信完全类似,只不过是用户B先解密消息。
- 基本密钥\(K_{A1}\)
- 基本密钥KA1:预置在SIM卡中,与基站1共享。
- 生存期:一旦植入SIM卡将不再改变。
- 用途:用来分配用户和基站之间的会话密钥。
- 会话密钥 \(k\)
- 产生方式:在每次会话时,基站产生一个64比特的随机数k。
- 分配方式:利用基本密钥\(K_{A1}\),使用其它密码算法将k加密传给用户手机。
- 生存期:仅用于一次通话时间。
- 明文处理
按每帧228比特分为若干帧后逐帧加密,每帧处理方式相同。
![[A5_1流密码算法加解密.png]]
加密方式:
- 加密:\(E_{k}=E_{k_{1}}(M_{1})E_{k_{2}}(M_{2})E_{k_{3}}(M_{3})\dots\)
- 一次通话使用一个会话密钥,对每帧使用不同的帧密钥
- 帧会话密钥:帧序号,长度为22比特
- 帧会话密钥共产生228比特密钥流,实现对本帧228比特通信数据的加解密
- 明密结合方式:逐位异或
- 一次通话量:至多\(2^{22}\)帧数据,约\(0.89× 2^{30}\)比特
A5/1序列密码算法中的线性反馈移位寄存器
![[A5_1序列密码算法中的线性反馈移位寄存器.png]]
注: A5/1算法中, LFSR的移位方式是左移方式。 各寄存器的编号从第0级编号到第n\(-1\)级。
A5流密码算法的基本原理
算法初始化
初始化是利用一次通话的会话密钥k和帧序号设定三个移存器的起点,即初始状态。
- Step 1:将三个LFSR的初态都设置为全零向量;
- Step 2: (密钥参与) 三个LFSR都规则动作64次,每次动作1步。在第 \(i\) 步动作时,三个LFSR的反馈内容都首先与密钥的第 \(i\) 比特异或,并
- 将异或结果作为LFSR反馈的内容。
密钥参与过程举例
以移存器1为例的密钥参与过程:
帧序号参与
- Step 3: (帧序号参与) 三个LFSR都规则动作22次, 每次动作1步。 在第 \(i\) 步动作时, 三个LFSR的反馈内容都首先与帧序号的第 \(i\) 比特异或, 并将异或的结果作为LFSR反馈的内容;帧序号比特的序号是从最低位编到最高位。
- 帧序号参与方式:与密钥参与方式相同, 不同的明文数据帧按顺序编号,每个编号为22比特。
- 记帧序号为:\(T_{0}=t_{22}t_{21}\dots t_{1}=00\dots00\quad T_{1}=t_{22}t_{21}\dots t_{1}=00\dots 01\)
- 帧密钥参与的目的:对不同的帧设置不同的帧会话密钥, 保证对每帧以不同的起点生成密钥流, 尽可能避免密钥重用。
密钥流生成与加解密
-
A5算法中,采用钟控方式控制3个LFSR来产生密钥流。
-
钟控信号\(x_{1}x_{2}x_{3}\)的采取: \(x_{1}\)取自LFSR-1第9级; \(x_{2}\)取自LFSR-2第11级;\(x_{3}\)取自LFSR-3第11级 。
-
控制方式:采用多项式 \(g(x)=x_{1}x_{2}+x_{2}x_{3}+x_{3}x_{1}\) 来确定,取钟控信号和多项式值相同的进行移位,不同的就不动。
\((X1,X2,X2)\) | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
---|---|---|---|---|---|---|---|---|
LFSR-1 | 动 | 动 | 动 | 不动 | 不动 | 动 | 动 | 动 |
LFSR-2 | 动 | 动 | 不动 | 动 | 动 | 不动 | 动 | 动 |
LFSR-3 | 动 | 不动 | 动 | 动 | 动 | 动 | 不动 | 动 |
钟控方式
略,详见ppt
关于加密
- Step 4:三个LFSR以钟控方式连续动作100次,但不输出密钥流;
- Step 5:三个LFSR以钟控方式连续动作114次,在每次动作后,三个LFSR都将最高位寄存器中的值输出,这三个比特的异或就是当前时刻输出的1比特密钥。
- 连续动作114步,共输出114比特密钥流,用于对用户手机到基站传送的114比特数据的加密;
- 加密方式: \(c_{i}=m_{i}\oplus d_{i};i=1,2,\dots,114\)
- Step 6:三个LFSR以钟控方式连续动作100次,但不输出密钥流;
- Step 7:三个LFSR以钟控方式连续动作114次,在每次动作后,三个LFSR都将最高级寄存器中的值输出,这三个比特的模2和就是当前时刻输出的1比特密钥流。
- 连续动作114步,共输出114比特密钥流,这114比特用于对基站到用户手机传送的114比特数据的解密。
- 解密方式:\(m'_{i}=c'_{i}\oplus d_{i;i=115,116,\dots,228}\)
A5/1算法的弱点
-
移位寄存器太短容易遭受穷举攻击
- A5/1算法把主密钥作为算法中三个寄存器的初始值, 长度为64比特。 如果利用已知明文攻击, 只需要知道其中两个寄存器的初始值, 就可以计算出另一个寄存器的初始值, 这只需要\(2^{40}\)步就可以得出寄存器LFSR-1和LFSR-2的结构。
-
事实上, A5/1加密算法中存在严重的安全问题
- 利用了GSM通信加密中的两个安全漏洞, 可以通过离线迭代计算生成一个彩虹表, 它包含有密钥和其相对应的输出密码。 这个彩虹表的大小为984GB。 得到了彩虹表之后, 安全专家就可以在短短的九秒内确定用于加密通信数据的密钥。
密钥流生成器的基本原则
设计一个性能良好的序列密码是一项十分困难的任务。最基本的设计原则是“密钥流生成器的不可预测性” ,它可分解为下述基本原则:
- 长周期。
- 高线性复杂度(用最少的移位寄存器来实现)。
- 统计性能良好。
- 足够的“混乱” 。
- 足够的“扩散” 。
- 抵抗不同形式的攻击。
祖冲之密码
- 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\) 可以有以下不同数制表示形式。
数据位序
文中所有数据的最高位(或字节)在左边,最低位(或字节)在右边。如=10010011001011000000010110100100, 的最高位为其最左边一位1, 的最低位为其最右边一位0。
运算符号
\(+\) | 两个整数相加 |
---|---|
\(ab\) | 两个整数 \(a\) 和 \(b\) 相乘 |
\(=\) | 赋值运算 |
\(mod\) | 整数取模 |
\(\oplus\) | 整数间逐比特异或(模2加) |
\(\boxed{+}\) | 模 \(2^{32}\) 加 |
\(a||b\) | 串 \(a\) 和 \(b\) 的级联 |
\(a_{H}\) | 整数 \(a\) 的高(最左) 16位 |
\(a_{L}\) | 整数 \(b\) 的低(最右)16位 |
\(a\lll{k}\) | \(a\)循环左移\(k\)位 |
\(a\gg{1}\) | \(a\)右移一位 |
\(a_{1},a_{2},\dots ,a_{n}\) | \(a_{i}\) 到 \(b_{i}\) 的并行赋值 |
算法中的符号及含义
例 \(a=0x1234,b=0x5678,c=a||b=0x12345678\)
例 \(a=\overline{ 100100110010110}\overline{ \underline{0}}\underline{000001011010010}_{2}\),则
例 \(a=11001001100101100000001011010010_{2}\),则
例 设 \(a_{1},a_{2},\dots,a_{15},b_{1},b_{2},\dots,b_{15}\) 都是整数,\((a_{1},a_{2},\dots,a_{15})\to(b_{1},b_{2},\dots,b_{15})\)
意味着 \(b_{i}=a_{i}(1\leq i \leq {15})\)
祖冲之密码的算法结构
![[祖冲之密码的算法结构.png]]
线性反馈移位寄存器
线性反馈移位寄存器(LFSR)由16个31比特寄存器单元\(s_{1},s_{2},\dots s_{15}\)组成,每个单元在集合 \(\left\lbrace 1,2,3,\dots,2^{31}-1 \right\rbrace\) 中取值。
线性反馈移位寄存器的特征多项式是有限域 \(GF(2^{31}-1)\) 上的16次本原多项式
其输出为有限域 \(GF(2^{31}-1)\) 上的 \(m\) 序列,具有良好的随机性。
线性反馈移位寄存器的运行模式有两种:初始化模式和工作模式。
(1)初始化模式
在初始化模式中, LFSR接收一个31比特字, 是由非线性函数 \(F\) 的32比特输出 \(W\) 通过舍弃最低位比特得到,即 \(u=W\gg{1}\) 。计算过程如下:
(2) 工作模式
在工作模式下, LFSR没有输入。其计算过程如下:
比特重组
比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字 ,其中前3个字将用于下层的非线性函数 ,第4个字参与密钥流的计算。
![[祖冲之密码的算法结构比特重组.png]]
非线性函数F
非线性函数 有2个32比特长的存储单元 \(R_{1}\) 和 \(R_{2}\) ,其输入为来自上层比特重组的3个32比特字 \(X_{0}、X_{1}、X_{2}\),输出为一个32比特字 。因此,非线性函数 是一个把96比特压缩为32比特的一个非线性压缩函数。
具体计算过程如下:
S盒: (即输入长和输出长都为32比特)的S盒由4个并置的 的S盒构成,即
S=(S_{0},S_{1},S_{0},S_{1})
\begin{cases}
L_{1}(X)=X\oplus(X\lll 2)\oplus(X\lll{10})\oplus(X\lll{18})\oplus(X\lll{24}) \
L_{2}(X)=X\oplus(X\lll 8)\oplus(X\lll{14})\oplus(X\lll{22})\oplus(X\lll{30})
\end{cases}
D=d_{0}||d_{1}||\dots||d_{1}5