流密码
流密码(序列密码)的基本概念
核心要素
明文:记为 x i x_i xi(二元序列,取值 0 或 1),是待加密的原始数据。
密钥:记为 z i z_i zi(二元序列),由滚动密钥生成器产生,称为 “滚动密钥” 或 “密钥流”。
密文:记为 y i y_i yi(二元序列),是加密后的结果。
加密变换:在 GF (2)(二元域)上,加密通过加法(即异或运算)实现: y i = x i ⊕ z i y_i = x_i \oplus z_i yi=xi⊕zi。
解密变换:同理,解密为 x i = y i ⊕ z i x_i = y_i \oplus z_i xi=yi⊕zi(因 z i ⊕ z i = 0 z_i \oplus z_i = 0 zi⊕zi=0)。
加法流密码体制模型
核心结构:包含 “安全信道”(传输初始密钥)、“滚动密钥生成器”(生成密钥流 z i z_i zi)、加密 / 解密模块(异或运算)。
密钥流生成器是流密码安全性的关键,需生成具有良好伪随机性的序列。
线性反馈移位寄存器(LFSR)
基本结构
由 n n n个二元存储器(存储 0 或 1)和一个反馈函数 f ( a 1 , a 2 , … , a n ) f(a_1,a_2,\dots,a_n) f(a1,a2,…,an)组成,是生成密钥流的核心部件。
状态:任一时刻 n n n个存储器的内容构成 n n n维向量 ( a 1 , a 2 , … , a n ) (a_1,a_2,\dots,a_n) (a1,a2,…,an),共 2 n 2^n 2n种可能状态(排除全 0 状态时为 2 n − 1 2^n - 1 2n−1种)。
反馈函数: n n n元布尔函数(输入输出均为 0 或 1),线性反馈移位寄存器(LFSR)的反馈函数为线性函数: f ( a 1 , … , a n ) = c 1 a 1 ⊕ c 2 a 2 ⊕ ⋯ ⊕ c n a n f(a_1,\dots,a_n) = c_1a_1 \oplus c_2a_2 \oplus \dots \oplus c_na_n f(a1,…,an)=c1a1⊕c2a2⊕⋯⊕cnan( c i ∈ { 0 , 1 } c_i \in \{0,1\} ci∈{0,1},且至少一个 c i ≠ 0 c_i \neq 0 ci=0,通常设 c n = 1 c_n = 1 cn=1)。
输出序列特性
输出序列 { a t } \{a_t\} {at}由初始状态和反馈函数决定,满足线性递推关系: a n + k = c 1 a n + k − 1 ⊕ c 2 a n + k − 2 ⊕ ⋯ ⊕ c n a k a_{n+k} = c_1a_{n+k-1} \oplus c_2a_{n+k-2} \oplus \dots \oplus c_na_k an+k=c1an+k−1⊕c2an+k−2⊕⋯⊕cnak。
周期:状态周期与输出序列周期一致,最大周期为 2 n − 1 2^n - 1 2n−1(此时序列称为 m m m序列)。
示例
3 级 LFSR:初始状态 ( 1 , 0 , 1 ) (1,0,1) (1,0,1),反馈函数 f = a 1 ⊕ a 3 f = a_1 \oplus a_3 f=a1⊕a3,输出序列为 1011101110 … 1011101110\dots 1011101110…,周期为 4。
5 级 LFSR:初始状态 ( 1 , 0 , 0 , 1 , 1 ) (1,0,0,1,1) (1,0,0,1,1),输出序列周期为 31(达到 2 5 − 1 2^5 - 1 25−1,即 m m m序列)。
线性移位寄存器的一元多项式表示
特征多项式
- 对于满足递推关系 a n + k = c 1 a n + k − 1 ⊕ ⋯ ⊕ c n a k a_{n+k} = c_1a_{n+k-1} \oplus \dots \oplus c_na_k an+k=c1an+k−1⊕⋯⊕cnak的 LFSR,其特征多项式定义为: p ( x ) = 1 + c 1 x + c 2 x 2 + ⋯ + c n x n p(x) = 1 + c_1x + c_2x^2 + \dots + c_nx^n p(x)=1+c1x+c2x2+⋯+cnxn( c n = 1 c_n = 1 cn=1)。
生成函数
序列 { a i } \{a_i\} {ai}的生成函数为幂级数: A ( x ) = a 1 + a 2 x + a 3 x 2 + … A(x) = a_1 + a_2x + a_3x^2 + \dots A(x)=a1+a2x+a3x2+…。
生成函数与特征多项式满足 A ( x ) = ϕ ( x ) p ( x ) A(x) = \frac{\phi(x)}{p(x)} A(x)=p(x)ϕ(x),其中 ϕ ( x ) \phi(x) ϕ(x)是次数≤ n − 1 n-1 n−1的多项式(由初始状态决定)。
多项式与序列的关系
若 p ( x ) ∣ q ( x ) p(x) \mid q(x) p(x)∣q(x),则 G ( p ( x ) ) ⊆ G ( q ( x ) ) G(p(x)) \subseteq G(q(x)) G(p(x))⊆G(q(x))( G ( p ( x ) ) G(p(x)) G(p(x))是由 p ( x ) p(x) p(x)生成的所有非零序列集合),即低阶 LFSR 生成的序列可由高阶 LFSR 生成。
多项式的周期:使 p ( x ) ∣ ( x p − 1 ) p(x) \mid (x^p - 1) p(x)∣(xp−1)的最小 p p p称为 p ( x ) p(x) p(x)的周期。
序列周期 r ∣ p r \mid p r∣p( p p p是特征多项式周期)。
m 序列与本原多项式
m 序列:周期达到 2 n − 1 2^n - 1 2n−1的 LFSR 序列。
本原多项式: n n n次不可约多项式,且周期为 2 n − 1 2^n - 1 2n−1。
序列 { a i } \{a_i\} {ai}是 m m m序列的充要条件是其特征多项式为 n n n次本原多项式。
本原多项式的个数为 ϕ ( 2 n − 1 ) / n \phi(2^n - 1)/n ϕ(2n−1)/n( ϕ \phi ϕ为欧拉函数),对任意 n n n至少存在一个。
m 序列的伪随机性
伪随机序列的必要性
- 密钥流需具有伪随机性:截获部分序列无法预测后续,满足 “不可预测性”。
Golomb 随机性公设
① 周期内 0 与 1 的个数相差至多 1;
② 长为 i i i的游程占总游程的 1 / 2 i 1/2^i 1/2i,且等长游程中 0 和 1 的游程数相等;
③ 异相自相关函数为常数。
m 序列的伪随机性质
① 周期 T = 2 n − 1 T = 2^n - 1 T=2n−1内,0 的个数为 2 n − 1 − 1 2^{n-1} - 1 2n−1−1,1 的个数为 2 n − 1 2^{n-1} 2n−1;
② 总游程数为 2 n − 1 2^{n-1} 2n−1;长为 i i i( 1 ≤ i ≤ n − 2 1 \leq i \leq n-2 1≤i≤n−2)的游程有 2 n − i − 1 2^{n-i-1} 2n−i−1个(0 和 1 各半);1 个长为 n − 1 n-1 n−1的 0 游程和 1 个长为 n n n的 1 游程;
③ 自相关函数: R ( τ ) = { 1 τ = 0 m o d T − 1 / T τ ≠ 0 m o d T R(\tau) = \begin{cases} 1 & \tau = 0 \mod T \\ -1/T & \tau \neq 0 \mod T \end{cases} R(τ)={1−1/Tτ=0modTτ=0modT,满足公设③。
m 序列密码的破译
破译原理
- 针对由 LFSR 生成的 m m m序列密钥流,已知长为 2 n 2n 2n的明文 - 密文对(即密钥流片段 z 1 , z 2 , … , z 2 n z_1, z_2, \dots, z_{2n} z1,z2,…,z2n),可求解 LFSR 的反馈系数 c 1 , … , c n c_1, \dots, c_n c1,…,cn。
步骤
由密钥流片段构造 n n n个连续状态: S h = ( z h , z h + 1 , … , z h + n − 1 ) S_h = (z_h, z_{h+1}, \dots, z_{h+n-1}) Sh=(zh,zh+1,…,zh+n−1)( h = 1 , 2 , … , n + 1 h = 1, 2, \dots, n+1 h=1,2,…,n+1);
建立线性方程组: z h + n = c 1 z h + n − 1 ⊕ ⋯ ⊕ c n z h z_{h+n} = c_1z_{h+n-1} \oplus \dots \oplus c_nz_h zh+n=c1zh+n−1⊕⋯⊕cnzh;
用矩阵求解反馈系数: ( c n , c n − 1 , … , c 1 ) = ( z n + 1 , … , z 2 n ) ⋅ X − 1 (c_n, c_{n-1}, \dots, c_1) = (z_{n+1}, \dots, z_{2n}) \cdot X^{-1} (cn,cn−1,…,c1)=(zn+1,…,z2n)⋅X−1( X X X为状态矩阵)。
示例
- 已知密文 101101011110010 101101011110010 101101011110010和明文 011001111111001 011001111111001 011001111111001,求得密钥流 110100100001011 110100100001011 110100100001011,通过 5 级 LFSR 的方程组求解,得反馈系数 ( c 5 , c 4 , c 3 , c 2 , c 1 ) = ( 1 , 0 , 0 , 1 , 0 ) (c_5, c_4, c_3, c_2, c_1) = (1,0,0,1,0) (c5,c4,c3,c2,c1)=(1,0,0,1,0),递推关系为 a i + 5 = a i ⊕ a i + 3 a_{i+5} = a_i \oplus a_{i+3} ai+5=ai⊕ai+3。
非线性序列
为克服 LFSR 的线性性缺陷(易破译),需构造非线性序列生成器,核心是提高线性复杂度和周期。
Geffe 序列生成器
结构:3 个 LFSR(LFSR2 为控制器),输出 b k = a 1 ( k ) a 2 ( k ) ⊕ a 3 ( k ) ( 1 ⊕ a 2 ( k ) ) b_k = a_1^{(k)}a_2^{(k)} \oplus a_3^{(k)}(1 \oplus a_2^{(k)}) bk=a1(k)a2(k)⊕a3(k)(1⊕a2(k))( a i ( k ) a_i^{(k)} ai(k)为第 i i i个 LFSR 的输出);
周期:若 LFSR i i i的特征多项式为 n i n_i ni次本原多项式且 n i n_i ni互素,则周期为 ∏ i = 1 3 ( 2 n i − 1 ) \prod_{i=1}^3 (2^{n_i} - 1) ∏i=13(2ni−1);
线性复杂度: ( n 1 + n 3 ) n 2 + n 3 (n_1 + n_3)n_2 + n_3 (n1+n3)n2+n3。
J-K 触发器
输出公式: c k = ( x 1 ⊕ x 2 ) c k − 1 ⊕ x 1 c_k = (x_1 \oplus x_2)c_{k-1} \oplus x_1 ck=(x1⊕x2)ck−1⊕x1( x 1 , x 2 x_1, x_2 x1,x2为输入, c k − 1 c_{k-1} ck−1为前一输出);
真值表:根据 J = x 1 , K = x 2 J=x_1, K=x_2 J=x1,K=x2,输出 c k c_k ck由 c k − 1 c_{k-1} ck−1和输入决定;
生成器:由 2 个 LFSR( m m m级和 n n n级 m m m序列)驱动,周期为 ( 2 m − 1 ) ( 2 n − 1 ) (2^m - 1)(2^n - 1) (2m−1)(2n−1)(当 m m m与 n n n互素且 a 0 ⊕ b 0 = 1 a_0 \oplus b_0 = 1 a0⊕b0=1时)。
Pless 生成器
结构:8 个 LFSR、4 个 J-K 触发器、1 个循环计数器(控制输出选通);
输出序列:按计数器周期选取 4 个 J-K 触发器的输出(如 a 0 b 1 c 2 d 3 a 4 b 5 … a_0b_1c_2d_3a_4b_5\dots a0b1c2d3a4b5…),提高复杂性。
钟控序列生成器
结构:LFSR1 控制 LFSR2 的时钟(LFSR1 输出 1 时,LFSR2 移位;输出 0 时,保持);
周期:若 LFSR1( m m m级,周期 p 1 = 2 m − 1 p_1=2^m - 1 p1=2m−1)和 LFSR2( n n n级,周期 p 2 = 2 n − 1 p_2=2^n - 1 p2=2n−1),且 gcd ( p 1 , p 2 ) = 1 \gcd(p_1, p_2)=1 gcd(p1,p2)=1,则周期为 p 1 p 2 p_1p_2 p1p2;
线性复杂度: 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)( f 2 f_2 f2为 LFSR2 的特征多项式)。
序列密码设计原则
- 长周期:避免密钥流重复导致的安全性缺陷。
- 高线性复杂度:抵抗线性分析攻击。
- 良好统计性能:满足 Golomb 公设,0-1 分布平衡、游程特性合理。
- 混乱与扩散:使明文与密钥流的关系复杂,掩盖统计特性。
- 抗攻击性:能抵抗已知明文、选择明文等多种攻击方式。
重点总结
- 流密码核心是通过密钥流与明文的模 2 加实现加密,密钥流生成是关键。
- LFSR 是生成密钥流的基础部件,m序列是其最优线性序列(周期最大、伪随机性好),但线性特性易被破译。
- 非线性序列生成器(如 Geffe、J-K 触发器等)通过引入非线性变换提升安全性,需兼顾周期、线性复杂度和实现效率。
- 破译m序列密码的核心是利用线性递推关系,通过足够长的密钥流片段求解反馈系数。