流密码基础(四):相关攻击与 Geffe 生成器
-
- 前言
- [1. 相关攻击的数学基础](#1. 相关攻击的数学基础)
-
- [1.1 相关系数:衡量信息泄露的程度](#1.1 相关系数:衡量信息泄露的程度)
-
- [1.1.1 什么是相关系数](#1.1.1 什么是相关系数)
- [1.1.2 偏差与符合概率](#1.1.2 偏差与符合概率)
- [1.1.3 相关系数与 Walsh 谱的关系](#1.1.3 相关系数与 Walsh 谱的关系)
- [1.2 相关性从哪里来](#1.2 相关性从哪里来)
-
- [1.2.1 非线性 ≠ 统计独立](#1.2.1 非线性 ≠ 统计独立)
- [1.2.2 一阶相关与高阶相关](#1.2.2 一阶相关与高阶相关)
- [1.2.3 为什么非线性也挡不住相关性](#1.2.3 为什么非线性也挡不住相关性)
- [2. 相关攻击原理详解](#2. 相关攻击原理详解)
-
- [2.1 分治思想:化整为零的密钥恢复](#2.1 分治思想:化整为零的密钥恢复)
-
- [2.1.1 暴力穷举的复杂度困境](#2.1.1 暴力穷举的复杂度困境)
- [2.1.2 相关性如何允许分治](#2.1.2 相关性如何允许分治)
- [2.1.3 分治前后的复杂度对比](#2.1.3 分治前后的复杂度对比)
- [2.2 攻击完整流程](#2.2 攻击完整流程)
-
- [2.2.1 选择攻击目标](#2.2.1 选择攻击目标)
- [2.2.2 枚举初始状态,生成候选序列](#2.2.2 枚举初始状态,生成候选序列)
- [2.2.3 设定阈值,筛选候选](#2.2.3 设定阈值,筛选候选)
- [2.2.4 逐个击破,恢复所有 LFSR](#2.2.4 逐个击破,恢复所有 LFSR)
- [2.3 样本量与攻击置信度](#2.3 样本量与攻击置信度)
-
- [2.3.1 偏差越小,所需样本越多](#2.3.1 偏差越小,所需样本越多)
- [2.3.2 样本量的严格推导:假设检验视角](#2.3.2 样本量的严格推导:假设检验视角)
- [3. Geffe 生成器实战分析](#3. Geffe 生成器实战分析)
-
- [3.1 Geffe 生成器回顾](#3.1 Geffe 生成器回顾)
-
- [3.1.1 架构与标准组合函数](#3.1.1 架构与标准组合函数)
- [3.1.2 曾经的安全预期](#3.1.2 曾经的安全预期)
- [3.2 计算 Geffe 组合函数一阶相关弱点](#3.2 计算 Geffe 组合函数一阶相关弱点)
-
- [3.2.1 完整无错真值表](#3.2.1 完整无错真值表)
- [3.2.2 Walsh 谱交叉验证](#3.2.2 Walsh 谱交叉验证)
- [3.2.3 Geffe 各变量相关特性汇总表](#3.2.3 Geffe 各变量相关特性汇总表)
- [3.2.4 漏洞底层逻辑解释](#3.2.4 漏洞底层逻辑解释)
- [3.3 完整攻击演示](#3.3 完整攻击演示)
-
- [3.3.1 第一步:攻击 LFSR 1 \text{LFSR}_1 LFSR1](#3.3.1 第一步:攻击 LFSR 1 \text{LFSR}_1 LFSR1)
- [3.3.2 第二步:攻击 LFSR 3 \text{LFSR}_3 LFSR3](#3.3.2 第二步:攻击 LFSR 3 \text{LFSR}_3 LFSR3)
- [3.3.3 第三步:间接还原 LFSR 2 \text{LFSR}_2 LFSR2](#3.3.3 第三步:间接还原 LFSR 2 \text{LFSR}_2 LFSR2)
- [3.3.4 全局复杂度对比表](#3.3.4 全局复杂度对比表)
- [3.4 Geffe 生成器攻防总结](#3.4 Geffe 生成器攻防总结)
- [4. 快速相关攻击](#4. 快速相关攻击)
-
- [4.1 标准相关攻击的数学局限](#4.1 标准相关攻击的数学局限)
-
- [4.1.1 枚举带来的指数复杂度](#4.1.1 枚举带来的指数复杂度)
- [4.1.2 根本缺陷:丢弃线性约束信息](#4.1.2 根本缺陷:丢弃线性约束信息)
- [4.2 译码模型严格数学推导](#4.2 译码模型严格数学推导)
-
- [4.2.1 相关性与噪声比特的概率关系](#4.2.1 相关性与噪声比特的概率关系)
- [4.2.2 LFSR输出序列构成线性分组码](#4.2.2 LFSR输出序列构成线性分组码)
- [4.2.3 攻击问题等价于译码](#4.2.3 攻击问题等价于译码)
- [4.3 Meier--Staffelbach 快速相关攻击原理(数学内核)](#4.3 Meier–Staffelbach 快速相关攻击原理(数学内核))
- [4.4 对组合生成器密码设计的理论冲击](#4.4 对组合生成器密码设计的理论冲击)
- [5. 组合生成器的安全边界](#5. 组合生成器的安全边界)
-
- [5.1 攻击面全景与数学本质](#5.1 攻击面全景与数学本质)
-
- [5.1.1 六大典型攻击的数学内核](#5.1.1 六大典型攻击的数学内核)
- [5.1.2 相关攻击族:从一阶到高阶](#5.1.2 相关攻击族:从一阶到高阶)
- [5.1.3 代数攻击:另一维度的威胁](#5.1.3 代数攻击:另一维度的威胁)
- [5.2 设计约束的定量边界](#5.2 设计约束的定量边界)
-
- [5.2.1 核心不等式约束](#5.2.1 核心不等式约束)
- [5.2.2 安全设计的硬性检查清单](#5.2.2 安全设计的硬性检查清单)
- [5.2.3 LFSR参数设计约束](#5.2.3 LFSR参数设计约束)
- [5.3 架构演进的技术逻辑](#5.3 架构演进的技术逻辑)
-
- [5.3.1 为什么纯组合生成器逐渐式微](#5.3.1 为什么纯组合生成器逐渐式微)
- [5.3.2 主流演进方向的技术逻辑](#5.3.2 主流演进方向的技术逻辑)
- 本篇小结
前言
在上一篇《流密码基础(三):非线性布尔函数与组合生成器》中,我们搭建了组合生成器的架构,并梳理了布尔函数的五大密码学性质。但有一个关键问题没有展开:相关攻击究竟是如何攻破组合生成器的?
相关攻击是流密码分析史上的里程碑。它利用布尔函数的统计偏差对多路 LFSR 实施分治破解,直接打破了"非线性组合 = 安全"的幻想,把组合生成器的安全评估从"线性复杂度"单一维度,推向了"相关免疫性"这个全新战场。
本篇我们将从相关系数和 Walsh 谱出发,搭建相关攻击的完整理论框架;然后以经典 Geffe 生成器为例,走一遍完整攻击流程;最后介绍快速相关攻击的基本思想。
这是一场从统计偏差到密钥恢复的完整攻防推演。
Crypto专栏:https://blog.csdn.net/r_feynman_/category_13190241.html
Crypto 密码解析实战靶场:https://blog.csdn.net/r_feynman_/category_13194584.html
1. 相关攻击的数学基础
相关攻击的核心逻辑只有一句话:如果输出和某个输入存在统计相关性,就可以分治破解。
但"相关性"怎么量化?多强的相关才能被利用?需要多少样本才能保证攻击成功?这些问题需要一套完整的数学工具来回答。
本章我们从相关系数出发,建立相关攻击的数学地基------地基打牢了,后面的攻击原理才能真正看懂。
1.1 相关系数:衡量信息泄露的程度
1.1.1 什么是相关系数
先从最直观的问题说起:怎么量化"输出和某个输入之间有没有关系"?
假设我们有一个 n 元布尔函数 f ( x 1 , x 2 , ... , x n ) f(x_1, x_2, \ldots, x_n) f(x1,x2,...,xn)。我们想知道:输出 f ( x ) f(x) f(x) 和第 i i i 个输入 x i x_i xi 之间,到底有多大的关联?
一个自然的想法是:统计输出和输入相等的概率。
如果输出和输入完全独立,那么相等的概率应该是 50%------就像抛两枚独立的硬币,结果相同的概率是 1/2。如果存在关联,概率就会偏离 50%。偏离得越远,关联性越强。
这就引出了相关系数(correlation coefficient)的概念。
对于布尔函数 f f f 和第 i i i 个输入变量 x i x_i xi,定义符合概率:
p i = Pr f ( x ) = x i , p_i = \Prf(x) = x_i, pi=Prf(x)=xi,
概率在所有 2 n 2^n 2n 个输入上等概率取值的意义下计算。
- p i = 1 / 2 p_i = 1/2 pi=1/2:输出与输入完全独立,无相关性
- p i ≠ 1 / 2 p_i \neq 1/2 pi=1/2:存在相关性,偏离 1/2 越远,相关性越强
直觉类比:
- 完全不相关:你抛硬币猜我抛硬币的结果,猜对概率 50%,纯瞎蒙
- 强相关:你和我抛的是同一枚硬币,猜对概率接近 100%
- 弱相关:两枚硬币有微妙联动,猜对概率 55%,比瞎蒙好一点
相关攻击的核心,就是利用这"比瞎蒙好一点"的微弱优势,通过大量样本积累,把正确密钥从海量候选中筛选出来。
1.1.2 偏差与符合概率
符合概率 p i p_i pi 可以直接描述相关性,但实际计算中更常用偏差 (bias),记作 ε i \varepsilon_i εi:
ε i = p i − 1 2 . \varepsilon_i = p_i - \frac{1}{2}. εi=pi−21.
偏差就是符合概率减去 1/2,衡量"比随机猜好多少"。
- ε i = 0 \varepsilon_i = 0 εi=0:完全不相关
- ε i > 0 \varepsilon_i > 0 εi>0:正相关,输出倾向于等于输入
- ε i < 0 \varepsilon_i < 0 εi<0:负相关,输出倾向于不等于输入
- ∣ ε i ∣ |\varepsilon_i| ∣εi∣ 越大:相关性越强
偏差取值范围为 − 1 / 2 , 1 / 2 -1/2, 1/2 −1/2,1/2。
不同偏差值对应的攻击难度参考(基于 99% 置信度的假设检验):
| 偏差 ε \varepsilon ε | 符合概率 p p p | 相关性强度 | 攻击所需样本量级 |
|---|---|---|---|
| 0 | 1/2 | 无 | 无法利用一阶相关 |
| 0.01 | 0.51 | 极弱 | 数万 ~ 数十万比特 |
| 0.05 | 0.55 | 较弱 | 数千比特 |
| 0.1 | 0.6 | 中等 | 数百比特 |
| 0.25 | 0.75 | 强 | 数十 ~ 数百比特 |
| 0.5 | 1 | 完全相关 | 单比特即可判定 |
攻击视角 :偏差 ε \varepsilon ε 就是攻击者的"信噪比"。后面你会看到,攻击所需样本量大致和 ε 2 \varepsilon^2 ε2 成反比------偏差减半,样本量要翻四倍。
1.1.3 相关系数与 Walsh 谱的关系
上一篇我们讲了 Walsh 谱------它可以计算非线性度、验证平衡性、判断相关免疫性。相关系数,同样可以用 Walsh 谱来表示。
具体来说,布尔函数 f f f 和第 i i i 个输入变量 x i x_i xi 的相关系数,对应着 Walsh 谱在第 i i i 个单位向量处的值。
第 i i i 个单位向量 e i e_i ei 是一个 n 维向量,第 i i i 位为 1,其余为 0。例如 e 1 = ( 1 , 0 , 0 , ... , 0 ) e_1 = (1, 0, 0, \ldots, 0) e1=(1,0,0,...,0)。
Walsh 谱在 e i e_i ei 处的值为:
W f ( e i ) = ∑ x ∈ F 2 n ( − 1 ) f ( x ) + x i . (1.1) W_f(e_i) = \sum_{x \in \mathbb{F}_2^n} (-1)^{f(x) + x_i}. \tag{1.1} Wf(ei)=x∈F2n∑(−1)f(x)+xi.(1.1)
下面我们推导它和偏差的关系。
第一步:拆分求和项
按 f ( x ) = x i f(x) = x_i f(x)=xi 和 f ( x ) ≠ x i f(x) \neq x_i f(x)=xi 拆分:
- 当 f ( x ) = x i f(x) = x_i f(x)=xi 时, f ( x ) + x i = 0 f(x) + x_i = 0 f(x)+xi=0,故 ( − 1 ) f ( x ) + x i = 1 (-1)^{f(x)+x_i} = 1 (−1)f(x)+xi=1
- 当 f ( x ) ≠ x i f(x) \neq x_i f(x)=xi 时, f ( x ) + x i = 1 f(x) + x_i = 1 f(x)+xi=1,故 ( − 1 ) f ( x ) + x i = − 1 (-1)^{f(x)+x_i} = -1 (−1)f(x)+xi=−1
设符合的输入有 N = N_= N= 个,不符合的有 N ≠ N_{\neq} N= 个,则:
W f ( e i ) = N = − N ≠ . W_f(e_i) = N_= - N_{\neq}. Wf(ei)=N=−N=.
第二步:用总输入数替换
总输入数 2 n = N = + N ≠ 2^n = N_= + N_{\neq} 2n=N=+N=,因此 N ≠ = 2 n − N = N_{\neq} = 2^n - N_= N==2n−N=,代入得:
W f ( e i ) = 2 N = − 2 n . W_f(e_i) = 2N_= - 2^n. Wf(ei)=2N=−2n.
第三步:用符合概率表示
符合概率 p i = N = / 2 n p_i = N_= / 2^n pi=N=/2n,即 N = = p i ⋅ 2 n N_= = p_i \cdot 2^n N==pi⋅2n,代入:
W f ( e i ) = 2 ⋅ p i ⋅ 2 n − 2 n = 2 n ( 2 p i − 1 ) = 2 n + 1 ( p i − 1 2 ) . \begin{aligned} W_f(e_i) &= 2 \cdot p_i \cdot 2^n - 2^n \\ &= 2^n (2p_i - 1) \\ &= 2^{n+1} \left(p_i - \frac{1}{2}\right). \end{aligned} Wf(ei)=2⋅pi⋅2n−2n=2n(2pi−1)=2n+1(pi−21).
第四步:引入偏差
由偏差定义 ε i = p i − 1 2 \varepsilon_i = p_i - \dfrac{1}{2} εi=pi−21,最终得到:
ε i = W f ( e i ) 2 n + 1 . (1.2) \varepsilon_i = \frac{W_f(e_i)}{2^{n+1}}. \tag{1.2} εi=2n+1Wf(ei).(1.2)
这个公式把概率意义上的"偏差"和代数意义上的"Walsh 谱值"直接联系了起来。两者本质上是同一个相关性的两种计量单位,差一个换算系数 2 n + 1 2^{n+1} 2n+1。
这也是为什么上一篇说相关免疫性可以用 Walsh 谱的零点来判断。
如果 W f ( e i ) = 0 W_f(e_i) = 0 Wf(ei)=0,则 ε i = 0 \varepsilon_i = 0 εi=0,说明输出和第 i i i 个输入完全不相关。如果所有单个变量对应的 Walsh 谱都是 0,那就是 1 阶相关免疫。
Walsh 谱就像一把万能钥匙------非线性度、平衡性、相关免疫性,都可以通过它来计算。
1.2 相关性从哪里来
1.2.1 非线性 ≠ 统计独立
一个常见误区:只要布尔函数是非线性的,就不会泄露信息。
这个想法是错的。 非线性和统计独立是两个完全不同维度的概念:
- 非线性:函数能否写成输入的线性组合(代数次数是否 > 1)
- 统计独立:输出与某个输入的联合分布是否等于边缘分布的乘积
非线性函数完全可以有很强的统计相关性。我们用最简单的例子来验证:二元与函数 f ( x 1 , x 2 ) = x 1 x 2 f(x_1, x_2) = x_1x_2 f(x1,x2)=x1x2。
这个函数代数次数为 2,显然是非线性的。但它和输入 x 1 x_1 x1 之间有什么关系?我们列真值表来看:
| x 1 x_1 x1 | x 2 x_2 x2 | f ( x ) = x 1 x 2 f(x) = x_1x_2 f(x)=x1x2 | f = x 1 f = x_1 f=x1? |
|---|---|---|---|
| 0 | 0 | 0 | 是 |
| 0 | 1 | 0 | 是 |
| 1 | 0 | 0 | 否 |
| 1 | 1 | 1 | 是 |
我们来手动算一下符合概率:
全部 4 组输入中,有 3 组满足 f ( x ) = x 1 f(x) = x_1 f(x)=x1(第 1、2、4 行)。
p 1 = 符合的行数 总行数 = 3 4 = 0.75 p_1 = \frac{\text{符合的行数}}{\text{总行数}} = \frac{3}{4} = 0.75 p1=总行数符合的行数=43=0.75
偏差就是符合概率减去 1/2:
ε 1 = p 1 − 1 2 = 3 4 − 1 2 = 1 4 = 0.25 \varepsilon_1 = p_1 - \frac{1}{2} = \frac{3}{4} - \frac{1}{2} = \frac{1}{4} = 0.25 ε1=p1−21=43−21=41=0.25
0.25 的偏差是什么概念?回头看 1.1.2 的表格------这已经是强相关了,只需要几十到上百比特的样本就能利用。
为什么会这样? 直观理解:变量对输出的约束强度不均。
在 AND 函数中,当 x 1 = 0 x_1 = 0 x1=0 时,无论 x 2 x_2 x2 是什么,输出恒为 0。 x 1 x_1 x1 对输出有"一票否决权",这种强约束自然形成了统计偏置。
相关免疫性高的布尔函数,本质上是各变量对输出的影响力被均匀稀释了,单变量无法有效推测输出。
1.2.2 一阶相关与高阶相关
上面讨论的"输出与单个输入变量的相关性"称为一阶相关。
那什么是高阶相关?我们还是用 AND 函数 f ( x 1 , x 2 ) = x 1 x 2 f(x_1, x_2) = x_1x_2 f(x1,x2)=x1x2 来举例。
这次我们不算 f f f 和 x 1 x_1 x1 的关系,而是算 f f f 和 x 1 ⊕ x 2 x_1 \oplus x_2 x1⊕x2(两个输入的异或)的关系。
| x 1 x_1 x1 | x 2 x_2 x2 | x 1 ⊕ x 2 x_1 \oplus x_2 x1⊕x2 | f ( x ) = x 1 x 2 f(x) = x_1x_2 f(x)=x1x2 | f = x 1 ⊕ x 2 f = x_1 \oplus x_2 f=x1⊕x2? |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 是 |
| 0 | 1 | 1 | 0 | 否 |
| 1 | 0 | 1 | 0 | 否 |
| 1 | 1 | 0 | 1 | 否 |
4 组输入中只有 1 组符合,符合概率 p = 1 / 4 p = 1/4 p=1/4,偏差 ε = − 1 / 4 \varepsilon = -1/4 ε=−1/4。
这就是二阶相关------输出和两个变量的线性组合(异或)之间的统计关联。
一般地,对任意非零向量 ω ∈ F 2 n \omega \in \mathbb{F}_2^n ω∈F2n,输出与线性组合 ω ⋅ x \omega \cdot x ω⋅x 的相关系数阶数,等于 ω \omega ω 的汉明重量(向量中 1 的个数)。
| 相关阶数 | ω \omega ω 重量 | 对应含义 | 攻击方式 | 攻击复杂度 |
|---|---|---|---|---|
| 一阶 | 1 | 单个变量与输出相关 | 单独猜一个 LFSR | O ( 2 L i ) O(2^{L_i}) O(2Li) |
| 二阶 | 2 | 两变量异或与输出相关 | 同时猜两个 LFSR | O ( 2 L i + L j ) O(2^{L_i+L_j}) O(2Li+Lj) |
| k 阶 | k | k 个变量线性组合与输出相关 | 同时猜 k 个 LFSR | O ( 2 ∑ L i ) O(2^{\sum L_i}) O(2∑Li) |
如果函数是 k 阶相关免疫的,那么所有权重 ≤ k 的向量 ω \omega ω 对应偏差均为 0------这与 Xiao-Massey 定理完全一致。
对攻击的影响:相关免疫阶数每提高 1,攻击者需要同步枚举的 LFSR 数量就增加 1,攻击复杂度呈指数级上升。
1.2.3 为什么非线性也挡不住相关性
根本原因:n 位输入压缩到 1 位输出,变量权重天然难以完全均匀。
布尔函数从 2 n 2^n 2n 种输入映射到 1 位输出,压缩过程必然丢失信息,不同变量在映射中的"话语权"往往不对等,权重大的变量自然产生统计相关性。
要完全消除 k 阶以下所有相关性,要求 Walsh 谱在所有权重 ≤ k 的点上全部为 0,条件极其严格。
而且更要命的是 Siegenthaler 不等式(上一篇讲过):
对于 n 元 m 阶相关免疫的布尔函数,代数次数 d ≤ n − m d \leq n - m d≤n−m。
我们代入几个具体数字看看:
- 3 元函数,2 阶相关免疫 → 代数次数 ≤ 1,直接退化成线性函数
- 4 元函数,2 阶相关免疫 → 代数次数 ≤ 2,还有点非线性空间
- 5 元函数,3 阶相关免疫 → 代数次数 ≤ 2,非线性度被严重压缩
这也解释了为什么实际密码设计中,相关免疫阶数很少超过 2~3 阶------再往上堆,非线性度和代数次数会掉得没法看。
密码设计的本质是多维度权衡博弈。相关攻击的威力,恰恰在于它把设计者逼到了权衡的死角。
2. 相关攻击原理详解
有了相关系数和偏差的数学工具,问题来了:攻击者具体怎么利用相关性恢复密钥?
答案是分治------把高复杂度的联合穷举,拆成多个独立的低复杂度子问题。这是相关攻击最核心的精髓。
本章我们完整走一遍攻击流程:从分治思想的起源,到假设检验的数学原理,再到样本量与成功率的定量关系。搞懂这一章,你就明白为什么相关免疫性是组合生成器的命门。
2.1 分治思想:化整为零的密钥恢复
2.1.1 暴力穷举的复杂度困境
组合生成器由 n n n 个级数为 L 1 , L 2 , ... , L n L_1, L_2, \ldots, L_n L1,L2,...,Ln 的 LFSR 构成,密钥空间是所有寄存器初始状态的笛卡尔积:
∣ K ∣ = 2 L 1 × 2 L 2 × ⋯ × 2 L n = 2 ∑ i = 1 n L i . (2.1) |\mathcal{K}| = 2^{L_1} \times 2^{L_2} \times \cdots \times 2^{L_n} = 2^{\sum_{i=1}^n L_i}. \tag{2.1} ∣K∣=2L1×2L2×⋯×2Ln=2∑i=1nLi.(2.1)
举个具体例子:3 个 LFSR,级数分别为 31、37、41,总密钥空间:
2 31 + 37 + 41 = 2 109 ≈ 6.4 × 10 32 . 2^{31+37+41} = 2^{109} \approx 6.4 \times 10^{32}. 231+37+41=2109≈6.4×1032.
这是什么概念?假设你有一台每秒能枚举 10 16 10^{16} 1016 个密钥的超算,遍历完需要约 2 × 10 9 2 \times 10^9 2×109 年------比宇宙年龄还长。暴力穷举在这个量级下完全不可行。
早期设计者正是被"巨大密钥空间"迷惑了,以为这样就安全。但密码分析从不硬碰硬------找对软肋,再大的密钥空间也能拆开来打。
相关性,就是组合生成器最致命的软肋。
2.1.2 相关性如何允许分治
相关性带来的关键突破是:你可以独立验证单个 LFSR 初始状态猜测的正确性,不需要知道其他寄存器的状态。
设截获的密钥流比特为 z t z_t zt, LFSR 1 \text{LFSR}1 LFSR1 的真实输出比特为 x 1 , t x{1,t} x1,t。二者存在统计相关性:相等的概率为 p = 1 2 + ε p = \dfrac{1}{2} + \varepsilon p=21+ε。
- ε \varepsilon ε 称为偏差 , ε > 0 \varepsilon > 0 ε>0;
- 如果完全随机无关,相等概率恰好是 1 / 2 1/2 1/2;存在相关性时,就会偏离 1 / 2 1/2 1/2。
攻击者的操作很简单,就三步:
- 随便猜一组 LFSR 1 \text{LFSR}_1 LFSR1 的初始状态;
- 用这个初始状态模拟生成一串候选比特序列 x 1 , t ′ x_{1,t}' x1,t′;
- 把生成序列和截获的密钥流逐位对比,统计一共有多少位相等,记为 C C C。
猜得对不对,看匹配位数 C C C 就知道。 因为两种情况的统计规律完全不一样:
| 场景 | 任意一位相等的概率 | 直观解释 | N N N 比特样本下的预期匹配位数 |
|---|---|---|---|
| 猜测正确 | p = 1 2 + ε p = \dfrac{1}{2} + \varepsilon p=21+ε | 生成序列就是真实 LFSR 输出,天然和密钥流更容易匹配 | N ⋅ ( 1 2 + ε ) N \cdot \left(\dfrac{1}{2} + \varepsilon\right) N⋅(21+ε) |
| 猜测错误 | 1 2 \dfrac{1}{2} 21 | 错误初态生成的序列和真实输出互不相关,等价随机序列,纯碰运气匹配 | N 2 \dfrac{N}{2} 2N |
为什么错误猜测的匹配概率一定是 1/2?
LFSR 不同初始状态产生的序列相互统计独立。一条随机二进制序列和另一条固定二进制序列逐位相等的概率,恒等于 1/2------就像抛硬币猜正反面,猜对概率就是一半。
我们一共观测 N N N 位密钥流( N N N 就是样本长度)。两种情况的预期匹配位数:
- 正确初态 : N 2 + N ε \dfrac{N}{2} + N\varepsilon 2N+Nε
- 错误初态 : N 2 \dfrac{N}{2} 2N
两者的期望值相差 N ε \boldsymbol{N\varepsilon} Nε。
样本量 N N N 越大,这个差值越明显。举个直观例子:
ε = 0.05 \varepsilon = 0.05 ε=0.05, N = 1000 N = 1000 N=1000,差值 N ε = 50 N\varepsilon = 50 Nε=50。
- 正确候选平均匹配 550 次
- 错误候选平均匹配 500 次
只要样本足够长,两组数据会明显分成两堆:一堆集中在 500 附近(全是猜错的),一堆集中在 550 附近(正确初态)。
攻击者只需要设一个分界阈值,高于阈值的候选保留,低于阈值的直接丢弃。
分治思想的核心结论:
判断某一路 LFSR 的初始状态对不对,只需要密钥流,不需要另外几路 LFSR 的任何信息。
原本需要同时猜所有 LFSR(复杂度是各寄存器长度指数相乘,天文数字);
现在可以一路一路单独破解,复杂度变成指数相加。
也就是:乘积难度 → 加法难度,攻击难度大幅下降。
2.1.3 分治前后的复杂度对比
还是用 31、37、41 级 LFSR 的例子,对比一下:
暴力穷举(复杂度是乘积):
2 31 × 2 37 × 2 41 = 2 109 ≈ 6.4 × 10 32 . 2^{31} \times 2^{37} \times 2^{41} = 2^{109} \approx 6.4 \times 10^{32}. 231×237×241=2109≈6.4×1032.
完全不可行。
相关攻击(一阶相关,复杂度是和):
2 31 + 2 37 + 2 41 ≈ 2.1 × 10 9 + 1.4 × 10 11 + 2.2 × 10 12 ≈ 2.4 × 10 12 . 2^{31} + 2^{37} + 2^{41} \approx 2.1 \times 10^9 + 1.4 \times 10^{11} + 2.2 \times 10^{12} \approx 2.4 \times 10^{12}. 231+237+241≈2.1×109+1.4×1011+2.2×1012≈2.4×1012.
从 10 32 10^{32} 1032 降到 10 12 10^{12} 1012------降低了 20 个数量级。现代 GPU 集群跑几天就能搞定。
相关免疫阶数直接决定攻击难度:
- 0 阶相关免疫 (存在一阶相关):单独枚举单个 LFSR,复杂度 O ( 2 L i ) O(2^{L_i}) O(2Li);
- 1 阶相关免疫 (无一阶相关,但有二阶相关):必须同时枚举两个 LFSR,复杂度 O ( 2 L i + L j ) O(2^{L_i+L_j}) O(2Li+Lj),难度飙升。
攻击视角:相关免疫阶数每提高 1,攻击复杂度就指数级跳一档。但设计者也不能无限堆相关免疫------Siegenthaler 不等式在那儿等着呢。这就是组合生成器设计的核心矛盾。
这就是为什么相关免疫性成为组合生成器核心安全指标的根本原因。
2.2 攻击完整流程
2.2.1 选择攻击目标
优先选取攻击成本最低的 LFSR 作为突破口。
攻击成本近似正比于 2 L i / ε i 2 2^{L_i} / \varepsilon_i^2 2Li/εi2,即:
Cost i ∝ 2 L i ε i 2 . (2.2) \text{Cost}_i \propto \frac{2^{L_i}}{\varepsilon_i^2}. \tag{2.2} Costi∝εi22Li.(2.2)
为什么是这个形式? 简单推导一下:
- 枚举所有初始状态需要 2 L i 2^{L_i} 2Li 次尝试;
- 每次尝试需要生成 N 位序列并比对,而样本量 N 大致和 1 / ε i 2 1/\varepsilon_i^2 1/εi2 成正比(后面会严格推导);
- 两者相乘就是总运算量。
因此寄存器越短、偏差越大,攻击成本越低。攻击者会优先挑最软的柿子捏。
设计启示:避免单个 LFSR 形成明显短板,平衡各寄存器长度与布尔函数带来的相关偏差,提升攻击者的最低攻击成本。
2.2.2 枚举初始状态,生成候选序列
选定目标寄存器(如 LFSR 1 \text{LFSR}_1 LFSR1),遍历全部 2 L 1 2^{L_1} 2L1 组初始状态。
对每组候选初态 s 0 ′ s_0' s0′,执行两步操作:
1. 生成候选序列
模拟 LFSR 的线性递推,生成 N 位候选序列 x 1 , t ′ x_{1,t}' x1,t′:
s t + 1 ′ = L ( s t ′ ) , x 1 , t ′ = 输出位 ( s t ′ ) , s_{t+1}' = L(s_t'), \quad x_{1,t}' = \text{输出位}(s_t'), st+1′=L(st′),x1,t′=输出位(st′),
其中 L ( ⋅ ) L(\cdot) L(⋅) 是 LFSR 的反馈函数(线性变换)。每移位一次输出一位,N 位样本共需移位 N 次。
2. 统计匹配位数
将候选序列与截获密钥流 z t z_t zt 逐位比对,统计相等的位数:
C ( s 0 ′ ) = ∑ t = 1 N 1 { x 1 , t ′ = z t } , (2.3) C(s_0') = \sum_{t=1}^{N} \mathbf{1}\{x_{1,t}' = z_t\}, \tag{2.3} C(s0′)=t=1∑N1{x1,t′=zt},(2.3)
其中 1 { ⋅ } \mathbf{1}\{\cdot\} 1{⋅} 是指示函数,条件成立时为 1,否则为 0。
整体计算复杂度 : O ( N ⋅ 2 L 1 ) O(N \cdot 2^{L_1}) O(N⋅2L1)。
代入数值感受一下:若 L 1 = 31 L_1 = 31 L1=31, N = 1000 N = 1000 N=1000,则约为 2 × 10 12 2 \times 10^{12} 2×1012 次基本位运算,GPU 加速后完全可行。
拓展 :本章介绍的是标准相关攻击,需要完整枚举所有初始状态。后续章节讲解快速相关攻击,借助纠错码译码思想规避全域枚举,进一步降低计算开销。
2.2.3 设定阈值,筛选候选
枚举完所有初始状态后,攻击者手中有 2 L 1 2^{L_1} 2L1 个匹配位数 C ( s 0 ′ ) C(s_0') C(s0′)。如何从中挑出正确的那个?
这本质上是一个二元假设检验问题:
- 零假设 H 0 H_0 H0 :初始状态错误,匹配位数 C ∼ B i n o m i a l ( N , 1 / 2 ) C \sim \mathrm{Binomial}(N, 1/2) C∼Binomial(N,1/2)
- 备择假设 H 1 H_1 H1 :初始状态正确,匹配位数 C ∼ B i n o m i a l ( N , p ) C \sim \mathrm{Binomial}(N, p) C∼Binomial(N,p),其中 p = 1 / 2 + ε p = 1/2 + \varepsilon p=1/2+ε
攻击者设定阈值 T T T:
- C ≥ T C \ge T C≥T → 判定为 H 1 H_1 H1(保留候选)
- C < T C < T C<T → 判定为 H 0 H_0 H0(丢弃候选)
两类错误:
-
漏报(第二类错误) :正确状态被误判为错误。概率:
β = P ( C < T ∣ H 1 ) = ∑ k = 0 T − 1 ( N k ) p k ( 1 − p ) N − k . \beta = P(C < T \mid H_1) = \sum_{k=0}^{T-1} \binom{N}{k} p^k (1-p)^{N-k}. β=P(C<T∣H1)=k=0∑T−1(kN)pk(1−p)N−k.
漏报率太高会导致正确解被丢弃,攻击失败。
-
误报(第一类错误) :错误状态被误判为正确。概率:
α = P ( C ≥ T ∣ H 0 ) = ∑ k = T N ( N k ) ( 1 2 ) N . \alpha = P(C \ge T \mid H_0) = \sum_{k=T}^{N} \binom{N}{k} \left(\frac{1}{2}\right)^N. α=P(C≥T∣H0)=k=T∑N(kN)(21)N.
误报率太高会导致保留的候选太多,后续验证工作量过大。
正态近似(大样本下)
当 N 较大时,二项分布可以用正态分布近似:
- H 0 H_0 H0 下: C ≈ N ( μ 0 , σ 0 2 ) C \approx \mathcal{N}(\mu_0, \sigma_0^2) C≈N(μ0,σ02),其中 μ 0 = N / 2 \mu_0 = N/2 μ0=N/2, σ 0 2 = N / 4 \sigma_0^2 = N/4 σ02=N/4
- H 1 H_1 H1 下: C ≈ N ( μ 1 , σ 1 2 ) C \approx \mathcal{N}(\mu_1, \sigma_1^2) C≈N(μ1,σ12),其中 μ 1 = N p \mu_1 = Np μ1=Np, σ 1 2 = N p ( 1 − p ) \sigma_1^2 = Np(1-p) σ12=Np(1−p)
用正态近似可以快速估算阈值和错误率。
数值示例 : N = 1000 N = 1000 N=1000, ε = 0.25 \varepsilon = 0.25 ε=0.25(即 p = 0.75 p = 0.75 p=0.75)
- H 0 H_0 H0:期望 500,标准差 1000 / 4 ≈ 15.8 \sqrt{1000/4} \approx 15.8 1000/4 ≈15.8
- H 1 H_1 H1:期望 750,标准差 1000 × 0.75 × 0.25 ≈ 13.7 \sqrt{1000 \times 0.75 \times 0.25} \approx 13.7 1000×0.75×0.25 ≈13.7
均值差 250,是标准差的十几倍------两个分布几乎完全不重叠。取阈值 T = 625 T = 625 T=625(中间位置),误报率和漏报率都趋近于 0,攻击几乎 100% 成功。
如果偏差只有 ε = 0.05 \varepsilon = 0.05 ε=0.05( p = 0.55 p = 0.55 p=0.55),均值差只有 50,和标准差差不多,两个分布严重重叠,就需要更多样本才能可靠区分。
?工程策略 :选用相对宽松的阈值,压低漏报率(比如 β < 10 − 6 \beta < 10^{-6} β<10−6),保证正确解几乎一定能通过筛选;此时误报的候选可能有几十个到几百个,再用更多样本做第二轮、第三轮验证,逐步缩小范围,最终锁定唯一正确解。
2.2.4 逐个击破,恢复所有 LFSR
攻破第一个 LFSR 后,重复上述流程,攻击其余具备一阶相关的 LFSR。
对于不具备一阶相关的剩余 LFSR,有两种求解思路:
1. 函数约束反推
已知 n − 1 n-1 n−1 路寄存器的输出序列和密钥流,代入组合布尔函数的约束关系,求解剩余一路序列。
如果组合函数对剩余变量是"仿射"的(比如 f = x 3 ⋅ g ( x 1 , x 2 ) ⊕ h ( x 1 , x 2 ) f = x_3 \cdot g(x_1, x_2) \oplus h(x_1, x_2) f=x3⋅g(x1,x2)⊕h(x1,x2) 的形式),那么在已知 x 1 , x 2 x_1, x_2 x1,x2 和 z z z 的情况下,可以直接解出 x 3 x_3 x3:
x 3 = z ⊕ h ( x 1 , x 2 ) g ( x 1 , x 2 ) , 当 g ( x 1 , x 2 ) ≠ 0 时 . x_3 = \frac{z \oplus h(x_1, x_2)}{g(x_1, x_2)}, \quad \text{当 } g(x_1, x_2) \neq 0 \text{ 时}. x3=g(x1,x2)z⊕h(x1,x2),当 g(x1,x2)=0 时.
如果不完全可逆,也能得到部分约束,再结合 LFSR 的线性递推结构验证求解。
2. 高阶相关降级
利用已恢复的寄存器序列,将高阶相关性转化为一阶相关。
例如:已知输出 z z z 和 x 1 ⊕ x 2 x_1 \oplus x_2 x1⊕x2 有二阶相关,偏差为 ε \varepsilon ε。若已恢复 x 1 x_1 x1,则:
z ⊕ x 1 和 x 2 z \oplus x_1 \quad \text{和} \quad x_2 z⊕x1和x2
之间就有了一阶相关,偏差同样是 ε \varepsilon ε。可以继续用普通相关攻击恢复 x 2 x_2 x2。
防御思路 :提升布尔函数的相关免疫阶数,迫使攻击者必须同时枚举更多 LFSR 才能找到统计关联,将攻击复杂度从 O ( 2 L i ) O(2^{L_i}) O(2Li) 抬高到 O ( 2 L i + L j ) O(2^{L_i+L_j}) O(2Li+Lj) 甚至更高。
2.3 样本量与攻击置信度
2.3.1 偏差越小,所需样本越多
相关攻击需要多少位密钥流样本才能成功?答案是:取决于偏差大小------偏差越小,需要的样本越多。
样本量与偏差满足平方反比关系:偏差减半,所需样本量翻四倍。粗略估计公式:
N ≈ c ε 2 , (2.4) N \approx \frac{c}{\varepsilon^2}, \tag{2.4} N≈ε2c,(2.4)
其中 c c c 是与置信度要求相关的常数(通常在几到几十之间)。
典型参考:
| 偏差 ε \varepsilon ε | 所需样本量量级 |
|---|---|
| 0.25 | 几十 ~ 数百位 |
| 0.1 | 数百 ~ 数千位 |
| 0.01 | 数万 ~ 数十万位 |
| 0.001 | 数百万位 |
实际场景中,攻击者很容易获取数万位密钥流(比如加密 1KB 数据就有 8000 多位)。因此只要存在可利用的偏差,攻击通常就具备可行性。
设计目标:要么完全消除相关性(达到相关免疫),要么将偏差压低到所需样本量超出攻击者可获取上限的程度。
2.3.2 样本量的严格推导:假设检验视角
我们从假设检验的角度,严格推导样本量与偏差的关系。
当样本量 N N N 较大时,根据中心极限定理,二项分布可以用正态分布近似:
- 错误候选 ( H 0 H_0 H0): C 0 ∼ N ( μ 0 = N 2 , σ 0 2 = N 4 ) C_0 \sim \mathcal{N}\left(\mu_0 = \dfrac{N}{2},\ \sigma_0^2 = \dfrac{N}{4}\right) C0∼N(μ0=2N, σ02=4N)
- 正确候选 ( H 1 H_1 H1): C 1 ∼ N ( μ 1 = N ( 1 2 + ε ) , σ 1 2 = N p ( 1 − p ) ) C_1 \sim \mathcal{N}\left(\mu_1 = N\left(\dfrac{1}{2} + \varepsilon\right),\ \sigma_1^2 = Np(1-p)\right) C1∼N(μ1=N(21+ε), σ12=Np(1−p))
两个分布的均值差:
Δ μ = μ 1 − μ 0 = N ε . \Delta\mu = \mu_1 - \mu_0 = N\varepsilon. Δμ=μ1−μ0=Nε.
标准差方面,当 ε \varepsilon ε 较小时 p ≈ 1 / 2 p \approx 1/2 p≈1/2,因此 σ 1 ≈ σ 0 ≈ N / 2 \sigma_1 \approx \sigma_0 \approx \sqrt{N}/2 σ1≈σ0≈N /2。
要让两个分布能够可靠区分,需要均值差显著大于标准差------信号(均值差)要明显大于噪声(分布波动):
Δ μ ≫ σ 0 . \Delta\mu \gg \sigma_0. Δμ≫σ0.
代入具体表达式:
N ε ≫ N 2 . N\varepsilon \gg \frac{\sqrt{N}}{2}. Nε≫2N .
两边同时除以 N \sqrt{N} N :
N ⋅ ε ≫ 1 2 . \sqrt{N} \cdot \varepsilon \gg \frac{1}{2}. N ⋅ε≫21.
两边平方:
N ⋅ ε 2 ≫ 1 4 . N \cdot \varepsilon^2 \gg \frac{1}{4}. N⋅ε2≫41.
整理得:
N ≫ 1 4 ε 2 . (2.5) N \gg \frac{1}{4\varepsilon^2}. \tag{2.5} N≫4ε21.(2.5)
这就严格证明了样本量与偏差平方成反比的关系。
实用估算公式
如果要求更精确,考虑具体的置信度------比如要求两个分布的均值之间相差 k k k 个标准差( k k k 通常取 3 ~ 5,对应不同的误报/漏报率),则:
N ε ≈ k ⋅ N 2 . N\varepsilon \approx k \cdot \frac{\sqrt{N}}{2}. Nε≈k⋅2N .
两边除以 N \sqrt{N} N 再平方,得到:
N ≈ k 2 4 ε 2 . (2.6) N \approx \frac{k^2}{4\varepsilon^2}. \tag{2.6} N≈4ε2k2.(2.6)
取 k = 4 k = 4 k=4(对应很高的置信度),则 N ≈ 4 / ε 2 N \approx 4 / \varepsilon^2 N≈4/ε2。验证一下:
- ε = 0.25 \varepsilon = 0.25 ε=0.25: N ≈ 4 / 0.0625 = 64 N \approx 4 / 0.0625 = 64 N≈4/0.0625=64 位
- ε = 0.1 \varepsilon = 0.1 ε=0.1: N ≈ 4 / 0.01 = 400 N \approx 4 / 0.01 = 400 N≈4/0.01=400 位
- ε = 0.01 \varepsilon = 0.01 ε=0.01: N ≈ 4 / 0.0001 = 40000 N \approx 4 / 0.0001 = 40000 N≈4/0.0001=40000 位
与经验估计完全吻合。
信号检测视角:偏差是统计信号的强度,样本量是观测时长。信号越微弱,需要的观测时间就越长,才能把有效信号从随机噪声中分辨出来。相关攻击本质上就是一个"从噪声中提取微弱统计信号"的检测问题。
下一章,我们结合经典的 Geffe 生成器,完整演示相关攻击的实操流程。
3. Geffe 生成器实战分析
前两章我们搭建了相关攻击完整理论框架:从匹配概率、偏差、Walsh谱等价关系,到分治攻击核心思路、样本量定量计算。本章落地经典 Geffe 生成器实战推演,完整演算其一阶相关漏洞、标准化相关攻击全流程、量化攻防复杂度,直观展示低相关免疫组合生成器的致命缺陷。
Geffe 生成器是密码分析标志性案例:当年设计者认为非线性+长周期足以安全,Siegenthaler 提出的相关攻击直接将其彻底破解,也是学习分治密钥恢复最标准的教学载体。
免责声明:下文仅用于密码学学习、靶场与CTF演练,禁止用于未经授权的系统破解。
3.1 Geffe 生成器回顾
3.1.1 架构与标准组合函数
Geffe 生成器是 1973 年由密码学家 P. R. Geffe 提出的一种组合生成器方案,是早期流密码设计的典型代表。它的核心思想很朴素:用多个 LFSR 产生长周期序列,再通过一个非线性布尔函数把它们"揉"在一起,既保留长周期的优势,又引入非线性来抵御线性攻击。
整体架构:
Geffe 生成器由 3 路独立的本原 LFSR 和 1 个 3 元非线性布尔函数 组成:
bash
LFSR₁ (x₁) ──┐
├─→ f (x₁,x₂,x₃) ──→ 密钥流 z
LFSR₂ (x₂) ──┤
│
LFSR₃ (x₃) ──┘
三路 LFSR 的输出记为 x 1 , x 2 , x 3 x_1, x_2, x_3 x1,x2,x3,分别对应 LFSR 1 , LFSR 2 , LFSR 3 \text{LFSR}_1, \text{LFSR}_2, \text{LFSR}_3 LFSR1,LFSR2,LFSR3。每一路 LFSR 都使用不同的本原多项式,确保序列周期最长且统计特性良好。
什么是本原 LFSR?
LFSR 的反馈多项式如果是本原多项式 (primitive polynomial),那么它生成的序列周期就能达到最大值 2 L − 1 2^L - 1 2L−1( L L L 是寄存器级数)。这种序列称为 m 序列,具有理想的伪随机特性:0 和 1 的个数几乎相等、游程分布均匀、自相关性尖锐。
早期流密码设计几乎都用本原 LFSR 作为基础组件,就是因为它的周期和统计特性有严格的数学保证。
标准组合函数(ANF 形式):
Geffe 提出的标准布尔函数,写成代数正规型(Algebraic Normal Form, ANF)是:
f ( x 1 , x 2 , x 3 ) = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 f(x_1, x_2, x_3) = x_1x_2 \oplus x_2x_3 \oplus x_3 f(x1,x2,x3)=x1x2⊕x2x3⊕x3
代数正规型就是把布尔函数写成若干个单项式的异或和,每个单项式是若干个变量的乘积。比如 x 1 x 2 x_1x_2 x1x2 就是二次项, x 3 x_3 x3 就是一次项。
从 ANF 可以直接读出代数次数:最高次项的次数就是函数的代数次数。这里最高次是 x 1 x 2 x_1x_2 x1x2 和 x 2 x 3 x_2x_3 x2x3,都是二次项,因此 deg ( f ) = 2 \deg(f) = 2 deg(f)=2。
变形为选择器形式:
我们对 ANF 做一个简单的代数变形,就能看出这个函数的真实结构:
f = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 = x 1 x 2 ⊕ x 3 ( x 2 ⊕ 1 ) (提取公因子 x 3 ) \begin{aligned} f &= x_1x_2 \oplus x_2x_3 \oplus x_3 \\ &= x_1x_2 \oplus x_3(x_2 \oplus 1) \quad \text{(提取公因子 } x_3\text{)} \end{aligned} f=x1x2⊕x2x3⊕x3=x1x2⊕x3(x2⊕1)(提取公因子 x3)
为什么 x 2 x 3 ⊕ x 3 = x 3 ( x 2 ⊕ 1 ) x_2x_3 \oplus x_3 = x_3(x_2 \oplus 1) x2x3⊕x3=x3(x2⊕1)?
在布尔代数中, ⊕ \oplus ⊕ 就是异或(模 2 加法),乘法就是与运算。分配律依然成立:
x 2 x 3 ⊕ x 3 = x 2 x 3 ⊕ 1 ⋅ x 3 = x 3 ( x 2 ⊕ 1 ) x_2x_3 \oplus x_3 = x_2x_3 \oplus 1 \cdot x_3 = x_3(x_2 \oplus 1) x2x3⊕x3=x2x3⊕1⋅x3=x3(x2⊕1)
注意这里的 1 1 1 是布尔常量 1, x 2 ⊕ 1 x_2 \oplus 1 x2⊕1 就是对 x 2 x_2 x2 取反。
变形后的形式就非常直观了:
f = x 1 ⋅ x 2 ⊕ x 3 ⋅ ( x 2 ⊕ 1 ) f = x_1 \cdot x_2 \oplus x_3 \cdot (x_2 \oplus 1) f=x1⋅x2⊕x3⋅(x2⊕1)
这就是一个标准的二选一数据选择器(multiplexer):
- 当 x 2 = 1 x_2 = 1 x2=1 时: x 2 ⊕ 1 = 0 x_2 \oplus 1 = 0 x2⊕1=0,第二项消失, f = x 1 ⋅ 1 = x 1 f = x_1 \cdot 1 = x_1 f=x1⋅1=x1
- 当 x 2 = 0 x_2 = 0 x2=0 时: x 1 ⋅ x 2 = 0 x_1 \cdot x_2 = 0 x1⋅x2=0,第一项消失, f = x 3 ⋅ 1 = x 3 f = x_3 \cdot 1 = x_3 f=x3⋅1=x3
换句话说:
| 控制位 x 2 x_2 x2 | 选中的数据源 | 输出 f f f |
|---|---|---|
| 1 | LFSR 1 \text{LFSR}_1 LFSR1 | x 1 x_1 x1 |
| 0 | LFSR 3 \text{LFSR}_3 LFSR3 | x 3 x_3 x3 |
LFSR 2 \text{LFSR}_2 LFSR2 不直接参与输出,只充当选择开关 ,在两路数据源之间来回切换; LFSR 1 \text{LFSR}_1 LFSR1 和 LFSR 3 \text{LFSR}_3 LFSR3 是真正的数据源,交替输出到密钥流中。
为什么要用选择器结构?
当时的设计思路是:让输出在两路之间"跳来跳去",攻击者就很难看出规律。而且因为有 x 2 x_2 x2 这个开关变量,输出序列不会直接等于任何一路 LFSR 的输出,似乎就"安全"了。
但后来的相关攻击证明,这种选择器结构恰恰是信息泄露最严重的------因为一半时间输出就是明文的 x 1 x_1 x1,另一半时间是明文的 x 3 x_3 x3,统计相关性非常强。
3.1.2 曾经的安全预期
Geffe 生成器刚提出时,学界对它的安全性评价相当高。当时的密码分析主要聚焦在线性攻击上,而 Geffe 生成器在三个维度上看起来都"足够安全":
1. 非线性:抵御 BM 算法
Berlekamp-Massey(BM)算法是线性攻击的利器------只要拿到 2 L 2L 2L 位连续的 LFSR 输出,就能在 O ( L 2 ) O(L^2) O(L2) 时间内还原出整个寄存器的初始状态和反馈多项式。
但 BM 算法只对线性序列有效。如果序列是非线性的,BM 算法算出来的"最短 LFSR"就不是真正的生成器,攻击也就失效了。
Geffe 函数的代数次数是 2,属于非线性函数,输出序列不是任何单个 LFSR 能直接生成的。当时普遍认为,只要引入了非线性,线性攻击就拿它没办法。
2. 长周期:抗穷尽攻击
三路本原 LFSR,如果级数两两互质(比如 31、37、41 都是质数),那么输出序列的总周期是三个周期的乘积:
T = ( 2 L 1 − 1 ) ( 2 L 2 − 1 ) ( 2 L 3 − 1 ) T = (2^{L_1} - 1)(2^{L_2} - 1)(2^{L_3} - 1) T=(2L1−1)(2L2−1)(2L3−1)
代入 L 1 = 31 , L 2 = 37 , L 3 = 41 L_1 = 31, L_2 = 37, L_3 = 41 L1=31,L2=37,L3=41,感受一下这个数字有多大:
T ≈ 2 31 × 2 37 × 2 41 = 2 109 ≈ 6.4 × 10 32 \begin{aligned} T &\approx 2^{31} \times 2^{37} \times 2^{41} \\ &= 2^{109} \\ &\approx 6.4 \times 10^{32} \end{aligned} T≈231×237×241=2109≈6.4×1032
这是什么概念?就算你每秒能检验 10 16 10^{16} 1016 个状态(超算量级),遍历完也需要约 2 × 10 9 2 \times 10^9 2×109 年------比宇宙年龄还长。当时认为,这么长的周期,穷尽攻击是完全不可能的。
3. 高线性复杂度:抗线性逼近
线性复杂度(linear complexity)是衡量序列"有多像线性序列"的指标。线性复杂度越低,越容易被 BM 算法破解;线性复杂度越高,理论上越安全。
单个 LFSR 的线性复杂度就是它的级数 L L L。但经过非线性组合后,输出序列的线性复杂度会大幅提高。对于 Geffe 生成器,输出的线性复杂度大约是:
L C ≈ L 1 + L 2 + L 3 LC \approx L_1 + L_2 + L_3 LC≈L1+L2+L3
(精确值取决于具体的组合函数和反馈多项式,但量级是对的。)
代入 31、37、41,线性复杂度大约是 109 位。这意味着攻击者如果想用线性逼近,至少需要 200 多位样本才能用 BM 算法尝试------而且即使试了,得到的也只是"线性逼近",不是真正的密钥。
三层保障加起来,当时的设计者觉得 Geffe 生成器已经相当安全了:
- 非线性 → 线性攻击无效
- 长周期 → 穷尽攻击无效
- 高线性复杂度 → 线性逼近也很难
但他们犯了一个致命的错误:只考虑了线性层面的攻击,完全忽略了统计层面的信息泄露。
1985 年,Siegenthaler 提出了相关攻击理论,直接把 Geffe 生成器这类"非线性组合 + 长周期"的方案打穿了。攻击者根本不需要跟非线性硬碰硬,只要利用统计相关性,就能一路一路地把 LFSR 分治破解。
3.2 计算 Geffe 组合函数一阶相关弱点
Siegenthaler 相关攻击的核心前提:寻找布尔函数输出 z = f ( x 1 , x 2 , x 3 ) z=f(x_1,x_2,x_3) z=f(x1,x2,x3) 与单个输入变量 x i x_i xi 之间的统计依赖关系,使用匹配概率 与偏差 量化相关性强弱。
两种标准计算手段:真值表穷举统计(直观手工验证)、Walsh-Hadamard 谱计算(理论通用方法)。本节分别使用两种方案交叉验算 Geffe 函数相关性,打通理论定义与工程观测结果。
3.2.1 完整无错真值表
3 元布尔函数定义域为 F 2 3 \mathbb{F}_2^3 F23,总计 2 3 = 8 2^3 = 8 23=8 组输入组合。将每组 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 代入组合函数:
f ( x 1 , x 2 , x 3 ) = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 f(x_1,x_2,x_3) = x_1x_2 \oplus x_2x_3 \oplus x_3 f(x1,x2,x3)=x1x2⊕x2x3⊕x3
计算输出比特;随后分别对比输出 f f f 与 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 是否相等,相等标记 ✓,不等标记 ✗。
| x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 | f = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 f = x_1x_2 \oplus x_2x_3 \oplus x_3 f=x1x2⊕x2x3⊕x3 | f = x 1 f = x_1 f=x1 | f = x 3 f = x_3 f=x3 | f = x 2 f = x_2 f=x2 |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | ✓ | ✓ | ✓ |
| 0 | 0 | 1 | 1 | ✗ | ✓ | ✗ |
| 0 | 1 | 0 | 0 | ✓ | ✓ | ✗ |
| 0 | 1 | 1 | 0 | ✓ | ✗ | ✗ |
| 1 | 0 | 0 | 0 | ✗ | ✓ | ✓ |
| 1 | 0 | 1 | 1 | ✓ | ✓ | ✗ |
| 1 | 1 | 0 | 1 | ✓ | ✗ | ✓ |
| 1 | 1 | 1 | 1 | ✓ | ✓ | ✓ |
逐列统计匹配成功的输入组数:
- f f f 与 x 1 x_1 x1 匹配组数:6 组
- f f f 与 x 3 x_3 x3 匹配组数:6 组
- f f f 与 x 2 x_2 x2 匹配组数:4 组
回顾第一章基础定义:
设 n n n 为布尔函数输入变量个数, N = N_= N= 为输出与变量相等的输入数量。
匹配概率:
p = N = 2 n p = \frac{N_=}{2^n} p=2nN=
偏差(统计偏移量,相关攻击核心参数):
ε = p − 1 2 \varepsilon = p - \frac{1}{2} ε=p−21
代入数值计算:
ε 1 = 6 8 − 1 2 = 0.75 − 0.5 = 0.25 ε 3 = 6 8 − 1 2 = 0.75 − 0.5 = 0.25 ε 2 = 4 8 − 1 2 = 0.5 − 0.5 = 0 \begin{aligned} \varepsilon_1 &= \frac{6}{8} - \frac{1}{2} = 0.75 - 0.5 = 0.25 \\ \varepsilon_3 &= \frac{6}{8} - \frac{1}{2} = 0.75 - 0.5 = 0.25 \\ \varepsilon_2 &= \frac{4}{8} - \frac{1}{2} = 0.5 - 0.5 = 0 \end{aligned} ε1ε3ε2=86−21=0.75−0.5=0.25=86−21=0.75−0.5=0.25=84−21=0.5−0.5=0
ε > 0 \varepsilon>0 ε>0 代表输出与变量倾向相等; ε = 0 \varepsilon=0 ε=0 代表二者统计独立,不存在一阶相关性。
3.2.2 Walsh 谱交叉验证
真值表适合低元布尔函数手工验算;当变量增多( n ≥ 5 n\ge5 n≥5),穷举真值表不再可行,Walsh-Hadamard 谱是分析相关性的通用数学工具。
一阶 Walsh 谱定义:
对于单位向量 e i = ( 0 , ... , 1 , ... , 0 ) e_i=(0,\dots,1,\dots,0) ei=(0,...,1,...,0)(第 i i i 位为1,其余为0):
W f ( e i ) = ∑ x ∈ F 2 n ( − 1 ) f ( x ) ⊕ x i W_f(e_i) = \sum_{x \in \mathbb{F}_2^n} (-1)^{f(x) \oplus x_i} Wf(ei)=x∈F2n∑(−1)f(x)⊕xi
符号含义: ( − 1 ) a ⊕ b = 1 (-1)^{a\oplus b}=1 (−1)a⊕b=1 当 a = b a=b a=b; ( − 1 ) a ⊕ b = − 1 (-1)^{a\oplus b}=-1 (−1)a⊕b=−1 当 a ≠ b a\neq b a=b。求和结果本质是「匹配次数 - 不匹配次数」。
偏差与 Walsh 谱标准换算公式(前文理论章节已推导):
ε i = W f ( e i ) 2 n + 1 \varepsilon_i = \frac{W_f(e_i)}{2^{n+1}} εi=2n+1Wf(ei)
先计算 W f ( e 1 ) W_f(e_1) Wf(e1), e 1 = ( 1 , 0 , 0 ) e_1=(1,0,0) e1=(1,0,0),观测输出与 x 1 x_1 x1 的相关性,逐项带入真值表:
- ( 0 , 0 , 0 ) : ( − 1 ) 0 + 0 = 1 (0,0,0): (-1)^{0+0}=1 (0,0,0):(−1)0+0=1
- ( 0 , 0 , 1 ) : ( − 1 ) 1 + 0 = − 1 (0,0,1): (-1)^{1+0}=-1 (0,0,1):(−1)1+0=−1
- ( 0 , 1 , 0 ) : ( − 1 ) 0 + 0 = 1 (0,1,0): (-1)^{0+0}=1 (0,1,0):(−1)0+0=1
- ( 0 , 1 , 1 ) : ( − 1 ) 0 + 0 = 1 (0,1,1): (-1)^{0+0}=1 (0,1,1):(−1)0+0=1
- ( 1 , 0 , 0 ) : ( − 1 ) 0 + 1 = − 1 (1,0,0): (-1)^{0+1}=-1 (1,0,0):(−1)0+1=−1
- ( 1 , 0 , 1 ) : ( − 1 ) 1 + 1 = 1 (1,0,1): (-1)^{1+1}=1 (1,0,1):(−1)1+1=1
- ( 1 , 1 , 0 ) : ( − 1 ) 1 + 1 = 1 (1,1,0): (-1)^{1+1}=1 (1,1,0):(−1)1+1=1
- ( 1 , 1 , 1 ) : ( − 1 ) 1 + 1 = 1 (1,1,1): (-1)^{1+1}=1 (1,1,1):(−1)1+1=1
逐项累加:
W f ( e 1 ) = 1 − 1 + 1 + 1 − 1 + 1 + 1 − 1 = 4 W_f(e_1)=1 -1 +1 +1 -1 +1 +1 -1 =4 Wf(e1)=1−1+1+1−1+1+1−1=4
代入换算式, n = 3 , 2 n + 1 = 16 n=3,2^{n+1}=16 n=3,2n+1=16:
ε 1 = 4 16 = 0.25 \varepsilon_1 = \frac{4}{16} = 0.25 ε1=164=0.25
与真值表统计结果完全吻合。
同理可以计算剩余两路:
- W f ( e 3 ) = 4 ⟹ ε 3 = 0.25 W_f(e_3)=4 \implies \varepsilon_3=0.25 Wf(e3)=4⟹ε3=0.25
- W f ( e 2 ) = 0 ⟹ ε 2 = 0 W_f(e_2)=0 \implies \varepsilon_2=0 Wf(e2)=0⟹ε2=0
关键结论:两种计算方式得到完全一致的偏差,证明结果可靠。Walsh 谱方法可以推广到多元布尔函数,是后续分析高阶相关免疫的基础工具。
3.2.3 Geffe 各变量相关特性汇总表
整合上面所有计算结果,汇总三路输入变量的一阶相关特性:
| 输入变量 | 对应 LFSR | 符合概率 p p p | 偏差 ε \varepsilon ε | 一阶相关特性 | 能否直接单路相关攻击 |
|---|---|---|---|---|---|
| x 1 x_1 x1 | L F S R 1 LFSR_1 LFSR1 | 3 / 4 3/4 3/4 | 0.25 0.25 0.25 | 强一阶相关 | 可以 |
| x 2 x_2 x2 | L F S R 2 LFSR_2 LFSR2 | 1 / 2 1/2 1/2 | 0 0 0 | 无任何一阶相关 | 不可以 |
| x 3 x_3 x3 | L F S R 3 LFSR_3 LFSR3 | 3 / 4 3/4 3/4 | 0.25 0.25 0.25 | 强一阶相关 | 可以 |
术语补充:若布尔函数对所有单变量满足 ε i = 0 \varepsilon_i=0 εi=0,称该函数一阶相关免疫 。Geffe 函数存在 ε ≠ 0 \varepsilon\neq0 ε=0,属于0阶相关免疫布尔函数,天然无法抵御一阶相关攻击。
3.2.4 漏洞底层逻辑解释
偏差数值只是表象,根源来自 Geffe 函数的二选一选择器结构。我们结合 x 2 x_2 x2 的分布直观解释偏差来源。
三路 LFSR 独立工作,输出比特均匀分布, x 2 = 0 x_2=0 x2=0、 x 2 = 1 x_2=1 x2=1 概率各 50%。
- 当 x 2 = 1 x_2=1 x2=1:选择器导通 LFSR 1 \text{LFSR}_1 LFSR1, f = x 1 f=x_1 f=x1。此时密钥流与 x 1 x_1 x1 100%匹配;
- 当 x 2 = 0 x_2=0 x2=0:选择器导通 LFSR 3 \text{LFSR}_3 LFSR3, f = x 3 f=x_3 f=x3。 x 1 x_1 x1 与 x 3 x_3 x3 相互独立,密钥流与 x 1 x_1 x1 匹配概率仅 50%。
使用全概率公式计算全局匹配概率:
p = P ( x 2 = 1 ) ⋅ P ( f = x 1 ∣ x 2 = 1 ) + P ( x 2 = 0 ) ⋅ P ( f = x 1 ∣ x 2 = 0 ) = 0.5 × 1 + 0.5 × 0.5 = 0.75 \begin{aligned} p &= \mathbf{P}(x_2=1)\cdot \mathbf{P}(f=x_1|x_2=1) + \mathbf{P}(x_2=0)\cdot \mathbf{P}(f=x_1|x_2=0) \\ &= 0.5 \times 1 + 0.5 \times 0.5 \\ &= 0.75 \end{aligned} p=P(x2=1)⋅P(f=x1∣x2=1)+P(x2=0)⋅P(f=x1∣x2=0)=0.5×1+0.5×0.5=0.75
偏差 ε = 0.75 − 0.5 = 0.25 \varepsilon=0.75-0.5=0.25 ε=0.75−0.5=0.25。
分析 x 3 x_3 x3 时逻辑完全对称:
- x 2 = 0 x_2=0 x2=0: f = x 3 f=x_3 f=x3,匹配概率100%;
- x 2 = 1 x_2=1 x2=1: f = x 1 f=x_1 f=x1, x 1 , x 3 x_1,x_3 x1,x3独立,匹配概率50%;
最终同样得到 p = 0.75 , ε = 0.25 p=0.75,\varepsilon=0.25 p=0.75,ε=0.25。
再分析控制变量 x 2 x_2 x2:无论选择器选中 x 1 x_1 x1 还是 x 3 x_3 x3,输出比特和 x 2 x_2 x2 不存在稳定的相等/不等倾向,长期统计下匹配概率稳定在 1/2,偏差为0,不存在一阶相关性。
拓展思考: LFSR 2 \text{LFSR}_2 LFSR2 无法直接使用一阶相关攻击。但当攻击者恢复 LFSR 1 \text{LFSR}_1 LFSR1、 LFSR 3 \text{LFSR}_3 LFSR3 完整序列后,依靠组合函数约束条件,能够间接求解 LFSR 2 \text{LFSR}_2 LFSR2。完整流程在下一节攻击演示中展开。
3.3 完整攻击演示
本节演示经典Siegenthaler一阶相关攻击 完整流程。
攻击前置条件:攻击者已知三路LFSR对应的本原反馈多项式,仅未知三路初始状态;攻击者能够捕获一段连续密钥流 z t z_t zt。
设定标准参数: L 1 = 31 , L 2 = 37 , L 3 = 41 L_1 = 31,\ L_2 = 37,\ L_3 = 41 L1=31, L2=37, L3=41,三路全部采用本原LFSR。
说明:本节采用基础枚举筛选型相关攻击,并非快速相关攻击;适合直观理解分治思路。工程上可使用快速相关攻击进一步降低计算开销。
3.3.1 第一步:攻击 LFSR 1 \text{LFSR}_1 LFSR1
(1)攻击优先级评估
相关攻击计算开销核心经验公式: Cost i ∝ 2 L i ε i 2 \text{Cost}_i \propto \dfrac{2^{L_i}}{\varepsilon_i^2} Costi∝εi22Li。
寄存器级数越小、偏差越大,整体攻击成本越低。
| 寄存器 | 级数 L i L_i Li | 初始状态总数 2 L i 2^{L_i} 2Li | 偏差 ε \varepsilon ε | 攻击成本 2 L i / ε 2 2^{L_i}/\varepsilon^2 2Li/ε2 | 攻击优先级 |
|---|---|---|---|---|---|
| L F S R 1 LFSR_1 LFSR1 | 31 | 2 31 ≈ 2.1 × 10 9 2^{31} \approx 2.1 \times 10^9 231≈2.1×109 | 0.25 | 3.4 × 10 10 3.4 \times 10^{10} 3.4×1010 | 最高 |
| L F S R 3 LFSR_3 LFSR3 | 41 | 2 41 ≈ 2.2 × 10 12 2^{41} \approx 2.2 \times 10^{12} 241≈2.2×1012 | 0.25 | 3.5 × 10 13 3.5 \times 10^{13} 3.5×1013 | 次高 |
| L F S R 2 LFSR_2 LFSR2 | 37 | 2 37 ≈ 1.4 × 10 11 2^{37} \approx 1.4 \times 10^{11} 237≈1.4×1011 | 0 | 无 | 无法直接攻击 |
解读:
虽然 LFSR 2 \text{LFSR}_2 LFSR2 级数介于另外两者之间,但其一阶偏差 ε = 0 \varepsilon=0 ε=0,输出与 x 2 x_2 x2 不存在统计相关性,无法直接采用一阶相关攻击。
对比 LFSR 1 \text{LFSR}_1 LFSR1 与 LFSR 3 \text{LFSR}_3 LFSR3,二者偏差相同,但 LFSR 1 \text{LFSR}_1 LFSR1 枚举空间远更小,因此优先作为突破口。
拓展思考:如果调换顺序先攻击 LFSR 3 \text{LFSR}_3 LFSR3,枚举量直接扩大1000倍,算力要求急剧上升,工程上不推荐。
(2)所需密钥样本量计算
沿用第2章经正态近似推导出的样本量公式:
N = k 2 4 ε 2 N = \frac{k^2}{4\varepsilon^2} N=4ε2k2
k k k 为标准差分离系数,控制真假候选分布的区分能力;取 k = 6 k = 6 k=6(6σ准则,高置信度,大幅降低误报、漏报概率),代入 ε = 0.25 \varepsilon=0.25 ε=0.25:
N = 6 2 4 × 0.25 2 = 36 0.25 = 144 N = \frac{6^2}{4 \times 0.25^2} = \frac{36}{0.25} = 144 N=4×0.25262=0.2536=144
理论上仅需 144 位连续密钥流样本,即可完成候选初始状态筛选。
原理补充:对于正确的LFSR初始状态,候选序列与密钥流匹配概率 p = 0.75 p=0.75 p=0.75;错误初始状态生成的随机序列与密钥流匹配概率 p = 0.5 p=0.5 p=0.5。当样本足够多时,两组匹配总数 C C C 形成两个独立正态分布; k k k 的作用是设置分界线,把两组分布分开。
(3)枚举筛选流程
- 遍历全部 2 31 2^{31} 231 种31位初始状态;
- 每组初始状态代入已知反馈多项式驱动LFSR持续移位,生成144位候选序列 x 1 , t ′ x_{1,t}' x1,t′;
- 将候选序列与截获密钥流 z t z_t zt 逐位比对,统计匹配总位数 C C C;
- 分布分界阈值:
T = N 2 + k N 2 T = \frac{N}{2} + \frac{k\sqrt{N}}{2} T=2N+2kN
判定规则:若 C > T C > T C>T,保留该初始状态作为候选;否则直接丢弃。
阈值来源:把两条正态分布拉开 k k k 倍标准差作为分界,和第2.3.2节分布区分理论完全对应。
(4)误报情况定量分析
k = 6 k=6 k=6 对应正态分布单侧尾部概率约 10 − 9 10^{-9} 10−9。
总共有约 2.1 × 10 9 2.1\times10^{9} 2.1×109 组错误初始状态,数学期望下只会产生2个误报候选。
获取少量额外密钥流进行二次核验,即可唯一锁定正确的 LFSR 1 \text{LFSR}1 LFSR1 初始状态,恢复完整 x 1 , t x{1,t} x1,t 序列。
3.3.2 第二步:攻击 LFSR 3 \text{LFSR}_3 LFSR3
攻击底层数学逻辑与 LFSR 1 \text{LFSR}_1 LFSR1 完全对称:
- LFSR 3 \text{LFSR}_3 LFSR3 同样拥有 ε = 0.25 \varepsilon = 0.25 ε=0.25 的强一阶偏差,理论样本量同样仅需144位;
- 核心劣势:寄存器级数41,枚举规模提升至 2 41 ≈ 2.2 × 10 12 2^{41} \approx 2.2 \times 10^{12} 241≈2.2×1012,计算量相比 LFSR 1 \text{LFSR}_1 LFSR1 扩大上千倍;普通CPU串行枚举几乎无法完成,必须依靠GPU并行、SIMD加速;
- 筛选机制、阈值、误报特性和上一步一致;筛选得到候选后,追加少量密钥流验证,恢复完整 LFSR 3 \text{LFSR}3 LFSR3 初始状态与序列 x 3 , t x{3,t} x3,t。
工程优化思路:在真实场景中,可以先完成 LFSR 1 \text{LFSR}_1 LFSR1 恢复,再设计联合统计方案降低 LFSR 3 \text{LFSR}_3 LFSR3 的枚举开销,也就是快速相关攻击的思想。
3.3.3 第三步:间接还原 LFSR 2 \text{LFSR}_2 LFSR2
此时攻击者已经完整获得密钥流 z t z_t zt、序列 x 1 , t x_{1,t} x1,t、 x 3 , t x_{3,t} x3,t。我们对Geffe原始布尔函数做代数变形,构造约束条件:
z = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 z = x 2 ( x 1 ⊕ x 3 ) ⊕ x 3 z ⊕ x 3 = x 2 ⋅ ( x 1 ⊕ x 3 ) \begin{aligned} z &= x_1x_2 \oplus x_2x_3 \oplus x_3 \\ z &= x_2(x_1 \oplus x_3) \oplus x_3 \\ z \oplus x_3 &= x_2 \cdot (x_1 \oplus x_3) \end{aligned} zzz⊕x3=x1x2⊕x2x3⊕x3=x2(x1⊕x3)⊕x3=x2⋅(x1⊕x3)
分两类场景逐时刻分析:
- 当 x 1 ⊕ x 3 = 1 x_1 \oplus x_3 = 1 x1⊕x3=1:等式简化为 x 2 = z ⊕ x 3 x_2 = z \oplus x_3 x2=z⊕x3,可以直接解出当前时刻 LFSR 2 \text{LFSR}_2 LFSR2 的输出比特;
- 当 x 1 ⊕ x 3 = 0 x_1 \oplus x_3 = 0 x1⊕x3=0:等式左侧恒等于0,无论 x 2 x_2 x2 取0或1等式均成立,不存在约束,无法确定该时刻 x 2 x_2 x2。
由于 x 1 , x 3 x_1,x_3 x1,x3 相互独立均匀序列, x 1 ⊕ x 3 = 1 x_1\oplus x_3=1 x1⊕x3=1 的概率为50%。144位样本大约可以采集72个可靠、无歧义的 LFSR 2 \text{LFSR}_2 LFSR2 输出比特。
LFSR 2 \text{LFSR}_2 LFSR2 级数仅37级,根据LFSR线性递推性质:只要收集不少于37个连续输出比特,结合已知本原反馈多项式,即可建立二元域线性方程组,直接高斯消元求解唯一初始状态。整个过程不需要暴力枚举,计算开销几乎可以忽略。
至此三路LFSR初始状态全部恢复,生成器被完全攻破。
拓展思考: LFSR 2 \text{LFSR}_2 LFSR2 不存在一阶相关性,因此无法单独攻击;这也是Siegenthaler攻击典型特征:优先攻破存在相关性的支路,再依靠布尔函数约束间接求解无直接泄露的支路。
3.3.4 全局复杂度对比表
| 攻击方案 | 整体计算复杂度 | 数值量级 | 工程可行性 |
|---|---|---|---|
| 全局暴力穷举三路 LFSR | 2 L 1 + L 2 + L 3 = 2 109 2^{L_1+L_2+L_3} = 2^{109} 2L1+L2+L3=2109 | 6.4 × 10 32 6.4 \times 10^{32} 6.4×1032 | 完全不可行 |
| 分治一阶相关攻击 | 2 31 + 2 41 2^{31} + 2^{41} 231+241 | 2.2 × 10 12 2.2 \times 10^{12} 2.2×1012 | GPU集群可实现 |
复杂度差距高达 2 68 ≈ 3 × 10 20 2^{68} \approx 3 \times 10^{20} 268≈3×1020 倍。相关攻击依靠分治思想,将破解难度降低二十多个数量级。
3.4 Geffe 生成器攻防总结
- 核心设计误区:单纯追求非线性、长周期、高线性复杂度,忽略输入输出之间的统计相关性;线性安全 ≠ 统计安全。
- 漏洞根源:Geffe函数相关免疫阶为0,两路数据源存在0.25强一阶偏差,天然适配分治式相关攻击;选择器结构极易引入相关性泄露。
- 攻防核心启示:布尔函数相关免疫阶是多路组合生成器的硬性安全底线;仅依靠非线性项无法抵御统计类密码分析(相关攻击、快速相关攻击)。
- 工程定位:Geffe生成器仅作为经典教学案例。现代流密码不再采用这种简单多路选择型布尔函数,同时会严格校验Walsh谱,消除较大偏差。
4. 快速相关攻击
前文介绍的标准Siegenthaler相关攻击,本质是穷举假设检验:遍历所有LFSR初始状态,生成候选序列,统计与密钥流的匹配个数,利用统计偏差筛选正确初始状态。
该方案仅适用于短LFSR;当级数 L L L 增大,枚举规模 2 L 2^L 2L 指数爆炸,攻击失效。
快速相关攻击(Fast Correlation Attack, FCA)的核心创新:放弃暴力枚举,利用LFSR线性递推结构,将密码分析问题转化为线性纠错码的译码问题,借助译码算法把复杂度从指数级降为多项式级。
本章先定量分析传统相关攻击固有的数学瓶颈,再严格建立「相关攻击=BSC信道译码」数学模型,最后分析攻击复杂度与密码设计约束。
4.1 标准相关攻击的数学局限
4.1.1 枚举带来的指数复杂度
设目标 L L L 级本原LFSR,初始状态共有 2 L 2^L 2L 种可能性。
截取长度 N N N 的密钥流样本。
标准相关攻击时间复杂度:
T std = O ( N ⋅ 2 L ) T_{\text{std}} = O\left(N\cdot 2^L\right) Tstd=O(N⋅2L)
复杂度核心负担来自指数项 2 L 2^L 2L。
| LFSR级数 L L L | 初始状态总数 2 L 2^L 2L | 算力需求 |
|---|---|---|
| 30 | ≈ 10 9 \approx 10^9 ≈109 | 消费级GPU可实现 |
| 40 | ≈ 10 12 \approx 10^{12} ≈1012 | 小型计算集群 |
| 50 | ≈ 10 15 \approx 10^{15} ≈1015 | 超算规模 |
| 60 | ≈ 10 18 \approx 10^{18} ≈1018 | 理论上不可完成 |
现代流密码LFSR长度常达到64位、128位,穷举方案不具备现实可行性。
4.1.2 根本缺陷:丢弃线性约束信息
L L L 级LFSR输出序列 { s t } \{s_t\} {st} 满足线性递推:
s t = c 1 s t − 1 ⊕ c 2 s t − 2 ⊕ ⋯ ⊕ c L s t − L , t ≥ L s_t = c_1 s_{t-1} \oplus c_2 s_{t-2} \oplus \cdots \oplus c_L s_{t-L},\quad t\ge L st=c1st−1⊕c2st−2⊕⋯⊕cLst−L,t≥L
c = ( c 1 , c 2 , ... , c L ) \boldsymbol{c}=(c_1,c_2,\dots,c_L) c=(c1,c2,...,cL) 为已知反馈系数。
这条递推等式是极强约束:连续 L L L 比特唯一确定整条无限长序列 。
但是标准相关攻击把每一组初始状态相互独立看待,没有利用序列内部的线性依赖关系,大量重复计算,造成算力浪费。
快速相关攻击正是利用这条线性递推约束构建译码模型。
4.2 译码模型严格数学推导
我们分三步完成模型转化,打通「布尔函数相关性」→「噪声信道」→「线性码译码」整条数学链路。
4.2.1 相关性与噪声比特的概率关系
设:
- { s t } \{s_t\} {st}:目标LFSR真实输出序列
- { z t } \{z_t\} {zt}:攻击者观测到的密钥流
- ε \varepsilon ε:一阶偏差, P ( z t = s t ) = 1 2 + ε P(z_t = s_t)=\dfrac12+\varepsilon P(zt=st)=21+ε
定义噪声比特:
e t = z t ⊕ s t e_t = z_t \oplus s_t et=zt⊕st
等价变形:
z t = s t ⊕ e t \boldsymbol{z}_t = s_t \oplus e_t zt=st⊕et
分析噪声分布:
{ e t = 0 ⟺ z t = s t , P ( e t = 0 ) = 1 2 + ε e t = 1 ⟺ z t ≠ s t , P ( e t = 1 ) = 1 2 − ε \begin{cases} e_t=0 \iff z_t = s_t,\quad P(e_t=0)=\dfrac12+\varepsilon\\4pt e_t=1 \iff z_t \neq s_t,\quad P(e_t=1)=\dfrac12-\varepsilon \end{cases} ⎩ ⎨ ⎧et=0⟺zt=st,P(et=0)=21+εet=1⟺zt=st,P(et=1)=21−ε
从通信角度:
{ s t } \{s_t\} {st} 是发送信号,经过二元对称信道BSC ,信道交叉概率 p = 1 2 − ε p=\dfrac12-\varepsilon p=21−ε,输出带噪声序列 { z t } \{z_t\} {zt}。
偏差 ε \varepsilon ε 越大,交叉概率越小,噪声越弱,越容易恢复原始序列。
关键数学结论:组合布尔函数引入的统计相关性,等价于给LFSR序列叠加BSC随机噪声。
4.2.2 LFSR输出序列构成线性分组码
取一段长度为 N N N 的有限序列:
s = ( s 0 , s 1 , ... , s N − 1 ) \boldsymbol{s} = (s_0,s_1,\dots,s_{N-1}) s=(s0,s1,...,sN−1)
所有满足同一个线性递推的序列构成集合 C \mathcal{C} C。
集合性质:
- 若 s ( 1 ) , s ( 2 ) ∈ C \boldsymbol{s}^{(1)},\boldsymbol{s}^{(2)}\in\mathcal{C} s(1),s(2)∈C,则 s ( 1 ) ⊕ s ( 2 ) ∈ C \boldsymbol{s}^{(1)}\oplus\boldsymbol{s}^{(2)}\in\mathcal{C} s(1)⊕s(2)∈C;对模2加法封闭,是线性空间。
- 自由变量仅前 L L L 位初始状态,空间维数等于 L L L。
因此: C \mathcal{C} C 是一个 N , L N,L N,L 二元线性分组码。
- 码长: N N N(截取序列长度)
- 维数: L L L(LFSR级数)
- 码字:所有合法LFSR有限输出序列
该码由递推关系隐式定义,对应一组校验方程:
c L s t − L ⊕ ⋯ ⊕ c 1 s t − 1 ⊕ s t = 0 , L ≤ t ≤ N − 1 c_L s_{t-L}\oplus\cdots\oplus c_1 s_{t-1} \oplus s_t = 0,\quad L\le t\le N-1 cLst−L⊕⋯⊕c1st−1⊕st=0,L≤t≤N−1
写成矩阵形式: H s T = 0 \boldsymbol{H}\boldsymbol{s}^T=\boldsymbol{0} HsT=0, H \boldsymbol{H} H 为校验矩阵。
4.2.3 攻击问题等价于译码
汇总模型:
- 原始合法码字: s ∈ C \boldsymbol{s}\in\mathcal{C} s∈C
- 观测接收向量: z = s ⊕ e \boldsymbol{z}=\boldsymbol{s}\oplus\boldsymbol{e} z=s⊕e
- 噪声 e \boldsymbol{e} e 独立同分布, P ( e i = 1 ) = 1 2 − ε P(e_i=1)=\dfrac12-\varepsilon P(ei=1)=21−ε
攻击者目标:已知接收向量 z \boldsymbol{z} z、码结构 C \mathcal{C} C,寻找最可能的码字 s ^ ∈ C \hat{\boldsymbol{s}}\in\mathcal{C} s^∈C。
这就是最大似然译码问题。
映射对照表
| 密码分析概念 | 纠错码概念 |
|---|---|
| LFSR输出序列 s \boldsymbol{s} s | 合法码字 |
| 密钥流 z \boldsymbol{z} z | 含噪声接收序列 |
| 偏差 ε \varepsilon ε | 信道质量, ε ↑ \varepsilon\uparrow ε↑ 噪声 ↓ \downarrow ↓ |
| 恢复LFSR初始状态 | 译码求解码字 |
核心思想转变:
标准相关攻击:遍历全部候选码字,寻找匹配最高的序列;
快速相关攻击:使用迭代译码算法,直接在码空间搜索最优码字,不暴力枚举。
4.3 Meier--Staffelbach 快速相关攻击原理(数学内核)
最早实用的快速相关攻击由 Meier 与 Staffelbach 提出,属于迭代比特翻转译码。
已知校验方程:
∑ i = 0 L c i s t − i = 0 ( m o d 2 ) \sum_{i=0}^{L} c_i s_{t-i}=0 \pmod{2} i=0∑Lcist−i=0(mod2)
将 s t = z t ⊕ e t s_t = z_t \oplus e_t st=zt⊕et 代入校验式,得到关于噪声比特 e \boldsymbol{e} e 的校验约束。
算法迭代逻辑(数学描述):
- 根据观测序列 z \boldsymbol{z} z,对每一个噪声比特 e i e_i ei 计算局部后验概率;
- 利用多条校验方程互相约束,更新每一位出错概率;
- 将概率明显偏高的比特翻转;
- 迭代直到得到满足绝大多数校验方程的序列 s ^ \hat{\boldsymbol{s}} s^。
若收敛成功,得到近似原始LFSR序列,随后直接用Berlekamp-Massey恢复初始状态。
复杂度量级:
T FCA = O ( L 2 ⋅ N ) T_{\text{FCA}} = O(L^2\cdot N) TFCA=O(L2⋅N)
多项式复杂度,不再依赖 2 L 2^L 2L。
两类攻击横向对比
| 攻击方式 | 时间复杂度 | 核心思想 | 适用场景 |
|---|---|---|---|
| 标准相关攻击 | O ( N ⋅ 2 L ) O(N\cdot 2^L) O(N⋅2L) | 穷举初始状态+假设检验 | L ≤ 40 L\le 40 L≤40,短LFSR |
| Meier-Staffelbach快速相关攻击 | O ( L 2 ⋅ N ) O(L^2\cdot N) O(L2⋅N) | 迭代译码、比特概率更新 | L ≤ 128 L\le 128 L≤128,存在可观一阶偏差 |
数值直观对比: L = 64 , N = 10000 L=64,\ N=10000 L=64, N=10000
- 标准相关攻击运算规模: 10000 × 2 64 ≈ 1.8 × 10 23 10000 \times 2^{64} \approx 1.8\times10^{23} 10000×264≈1.8×1023,无法实现
- 快速相关攻击运算规模: 64 2 × 10000 ≈ 4 × 10 7 64^2 \times 10000 \approx 4\times10^7 642×10000≈4×107,普通PC短时间完成
⚠️ 重要边界条件:
快速相关攻击不是万能方法。
当偏差 ε \varepsilon ε 极小、密钥流样本长度 N N N 不足时,译码算法无法收敛,攻击失败。攻击成功率高度依赖信道信噪比(偏差大小)。
4.4 对组合生成器密码设计的理论冲击
快速相关攻击彻底推翻一条旧设计思路:单纯加长LFSR长度无法抵御相关攻击。
在FCA出现前:
设计者认为增大 L L L,提高 2 L 2^L 2L 枚举难度,即可防御相关攻击。
FCA出现后得到全新结论:
只要布尔函数存在一阶相关性( ε ≠ 0 \varepsilon\neq0 ε=0),无论LFSR级数多长,都可以通过译码思路高效破解。
由此引出硬性设计约束:
组合生成器必须采用一阶相关免疫布尔函数(1阶弹性函数),从根源消除一阶偏差。
但这里存在经典权衡,由 Siegenthaler不等式 严格刻画:
设布尔函数相关免疫阶为 m m m,代数次数为 d d d,变量个数 n n n,满足:
m + d ≤ n − 1 m + d \le n-1 m+d≤n−1
提升相关免疫阶 m m m,必然压低最大代数次数 d d d;而代数次数降低又会削弱抗代数攻击能力。
布尔函数的非线性度同样受到约束,设计空间被大幅压缩。
正是这种固有的内在矛盾,导致多路LFSR组合生成器逐渐退出主流流密码设计。后续方案转向钟控生成器、非线性滤波生成器、ARX结构等架构,规避相关攻击风险。
5. 组合生成器的安全边界
前四章我们系统建立了相关攻击的数学体系:从偏差与Walsh谱的等价关系,到标准相关攻击的分治假设检验,再到Geffe生成器实战推演,最后到快速相关攻击的译码模型。
本章做一次完整的安全复盘:从攻击面全景、设计约束定量分析、到架构演进的技术逻辑,系统回答三个问题:
- 组合生成器到底面临哪些可量化的密码分析威胁?
- 安全的组合生成器必须满足哪些数学上的硬性边界?
- 为什么现代流密码逐渐放弃纯组合生成器架构?演进方向的技术逻辑是什么?
5.1 攻击面全景与数学本质
组合生成器的核心结构:多路LFSR线性输出 + 单一非线性布尔函数压缩。
攻击者的所有手段,本质上都是在利用这两个组件的固有弱点。
5.1.1 六大典型攻击的数学内核
| 攻击类型 | 利用的数学弱点 | 关键复杂度 | 核心防御指标 |
|---|---|---|---|
| 线性攻击(BM算法) | 输出序列线性复杂度过低,可由短LFSR等效生成 | O ( L C 2 ) O(LC^2) O(LC2), L C LC LC为线性复杂度 | 线性复杂度、非线性度 |
| 标准相关攻击 | 单变量一阶偏差 ε i ≠ 0 \varepsilon_i\neq0 εi=0,支持分治枚举 | O ( N ⋅ 2 L i ) O(N\cdot 2^{L_i}) O(N⋅2Li) | 相关免疫阶 |
| 快速相关攻击 | 一阶偏差 + LFSR线性递推结构,等价译码问题 | O ( L 2 ⋅ N ) O(L^2\cdot N) O(L2⋅N) | 相关免疫阶、低重量校验方程数量 |
| 高阶相关攻击 | k k k个变量线性组合存在非零偏差 ε ω ≠ 0 \varepsilon_\omega\neq0 εω=0 | O ( N ⋅ 2 ∑ L i ) O(N\cdot 2^{\sum L_i}) O(N⋅2∑Li) | 相关免疫阶数 m m m |
| 代数攻击 | 存在低次零化子,可建立超定线性方程组 | O ( D ω ) O(D^\omega) O(Dω), D D D为方程组规模 | 代数免疫阶AI |
| 最佳仿射逼近 | 非线性度不足,存在高概率线性逼近 | O ( 2 n / 2 ) O(2^{n/2}) O(2n/2) Walsh搜索 | 非线性度 N f N_f Nf |
下面逐项拆解每类攻击的数学逻辑。
5.1.2 相关攻击族:从一阶到高阶
相关攻击是组合生成器最核心的威胁体系,形成完整攻击谱。
一阶相关攻击(标准型)
条件:存在单位向量 e i e_i ei,使得 W f ( e i ) ≠ 0 W_f(e_i)\neq0 Wf(ei)=0,即单变量偏差 ε i ≠ 0 \varepsilon_i\neq0 εi=0。
复杂度:单独枚举第 i i i 路LFSR, O ( 2 L i ) O(2^{L_i}) O(2Li)。
快速相关攻击
条件:存在一阶偏差 ε i > 0 \varepsilon_i>0 εi>0,且LFSR存在足够多低重量校验关系。
复杂度:多项式级 O ( L 2 ⋅ N ) O(L^2\cdot N) O(L2⋅N),不再依赖指数枚举。
本质:将密码分析转化为BSC信道上的线性码译码。
高阶相关攻击
条件:存在重量为 k k k 的向量 ω \omega ω,使得 W f ( ω ) ≠ 0 W_f(\omega)\neq0 Wf(ω)=0,即 k k k 个变量的线性组合与输出存在统计相关。
复杂度:同时枚举 k k k 路LFSR, O ( 2 ∑ i ∈ ω L i ) O(2^{\sum_{i\in\omega} L_i}) O(2∑i∈ωLi)。
相关免疫阶数 m m m 的精确定义:
若对所有权重 w t ( ω ) ≤ m \mathrm{wt}(\omega)\le m wt(ω)≤m 的非零向量,均有 W f ( ω ) = 0 W_f(\omega)=0 Wf(ω)=0,则称布尔函数为 m m m 阶相关免疫。
等价表述:任意不超过 m m m 个输入变量的线性组合,均与输出统计独立。
关键结论:相关免疫阶每提高1,攻击者必须联合枚举的LFSR数量增加一路,攻击复杂度指数上升一阶。
5.1.3 代数攻击:另一维度的威胁
代数攻击是2000年后兴起的另一类强力攻击,它不关心统计偏差,而是从代数结构入手。
设组合函数为 f ( x 1 , ... , x n ) f(x_1,\dots,x_n) f(x1,...,xn),密钥流 z t = f ( x 1 , t , ... , x n , t ) z_t = f(x_{1,t},\dots,x_{n,t}) zt=f(x1,t,...,xn,t)。
代数攻击的核心思路:
寻找非零布尔函数 g g g,使得 f ⋅ g = 0 f\cdot g = 0 f⋅g=0 或 ( 1 ⊕ f ) ⋅ g = 0 (1\oplus f)\cdot g = 0 (1⊕f)⋅g=0,这样的 g g g 称为零化子。
若存在次数为 d d d 的零化子,则对每一位密钥流,可以建立关于LFSR状态变量的 d d d 次代数方程。收集足够多方程后,通过线性化技术转化为超定线性方程组求解。
代数攻击复杂度约为 O ( D ω ) O(D^\omega) O(Dω),其中 D D D 是单比特方程中出现的单项式个数, ω \omega ω 是线性方程组求解指数(约2.8)。
代数免疫阶(Algebraic Immunity, AI)
定义:布尔函数 f f f 的代数免疫阶 A I ( f ) \mathrm{AI}(f) AI(f),是其最低次非零零化子的次数。
- A I \mathrm{AI} AI 越高,零化子次数越高,方程组规模越大,代数攻击越难。
- 对 n n n 元布尔函数, A I ( f ) ≤ ⌈ n / 2 ⌉ \mathrm{AI}(f)\le \lceil n/2\rceil AI(f)≤⌈n/2⌉。
代数攻击的出现,给组合生成器的安全设计增加了新的硬性约束:布尔函数不仅要有高相关免疫,还要有高代数免疫。
5.2 设计约束的定量边界
组合生成器的安全设计,本质上是在多个相互制约的密码学指标之间寻找平衡点。
5.2.1 核心不等式约束
Siegenthaler不等式(相关免疫 ↔ 代数次数)
若 n n n 元布尔函数 f f f 是 m m m 阶相关免疫的,则其代数次数满足:
deg ( f ) ≤ n − m \deg(f) \le n - m deg(f)≤n−m
若函数同时是平衡的(弹性函数),则进一步收紧为:
deg ( f ) ≤ n − m − 1 \deg(f) \le n - m - 1 deg(f)≤n−m−1
物理意义:相关免疫阶每提高1,代数次数至少下降1。追求高相关免疫,必然牺牲代数次数,进而削弱抗代数攻击能力。
非线性度下界(相关免疫约束)
m m m 阶相关免疫布尔函数的非线性度满足:
N f ≥ 2 n − 1 − 2 n − 1 − m / 2 N_f \ge 2^{n-1} - 2^{n-1-m/2} Nf≥2n−1−2n−1−m/2
(这是宽松下界,实际构造中通常更低)
代数免疫与非线性度的关系
高代数免疫的函数,非线性度往往不是最优的。达到最优代数免疫 ⌈ n / 2 ⌉ \lceil n/2\rceil ⌈n/2⌉ 的函数,其非线性度通常低于Bent函数等最优非线性函数。
5.2.2 安全设计的硬性检查清单
设计一个具备实际安全强度的组合生成器,布尔函数至少应满足:
| 指标 | 安全阈值 | 数学含义 |
|---|---|---|
| 平衡性 | 必须满足, w t ( f ) = 2 n − 1 \mathrm{wt}(f)=2^{n-1} wt(f)=2n−1 | 输出0/1均匀分布,杜绝明显统计偏置 |
| 相关免疫阶 m m m | 至少 m ≥ 2 m\ge2 m≥2,推荐 m ≥ 3 m\ge3 m≥3 | 抵御一阶、二阶相关攻击 |
| 代数次数 deg \deg deg | 至少 deg ≥ n − m − 1 \deg\ge n-m-1 deg≥n−m−1 上限附近 | 抵御代数攻击 |
| 代数免疫 A I \mathrm{AI} AI | 尽可能接近 ⌈ n / 2 ⌉ \lceil n/2\rceil ⌈n/2⌉ | 抵御零化子攻击 |
| 非线性度 N f N_f Nf | 尽可能接近 2 n − 1 − 2 n / 2 − 1 2^{n-1}-2^{n/2-1} 2n−1−2n/2−1 | 抵御线性逼近攻击 |
| 严格雪崩SAC | 建议满足 | 输入单比特翻转扩散到输出 |
现实困境:这些指标无法同时达到最优。
例如 n = 8 n=8 n=8 的布尔函数:
- Bent函数非线性度最高(120),但相关免疫阶为0;
- 3阶弹性函数非线性度最多约112,代数次数最多4次;
- 最优代数免疫函数非线性度又会进一步下降。
设计者永远在多维度权衡中妥协,不存在"完美"的布尔函数。
5.2.3 LFSR参数设计约束
除了布尔函数,LFSR参数也有明确的设计规则:
- 本原多项式 :每路LFSR必须选用本原反馈多项式,保证序列周期达到 2 L i − 1 2^{L_i}-1 2Li−1;
- 周期互质 :各路级数 L i L_i Li 两两互质,保证输出序列总周期为各周期乘积,最大化周期长度;
- 级数下限:单路级数不宜过低,防止攻击者在获得高阶相关时联合枚举复杂度仍然可控;
- 抽头数量:LFSR反馈抽头不宜过少,否则低重量校验方程过多,快速相关攻击效率过高。
5.3 架构演进的技术逻辑
纯组合生成器在现代流密码设计中逐渐边缘化,根本原因是攻击手段的进化速度超过了防御手段。
5.3.1 为什么纯组合生成器逐渐式微
第一,相关攻击族持续强化。
从标准相关攻击到快速相关攻击,再到高阶快速相关攻击,攻击效率不断提升。设计者每提升一阶相关免疫,攻击者很快就能发展出对应阶数的高效攻击方法。而布尔函数的相关免疫阶受Siegenthaler不等式约束,不可能无限堆高。
第二,代数攻击开辟新战场。
原本在相关攻击下还算安全的高相关免疫函数,在代数攻击面前可能不堪一击。相关免疫高的函数往往代数次数低,反而更容易被代数攻击。设计者被迫在两个相反方向上同时优化,设计空间急剧收缩。
第三,硬件效率与安全的矛盾。
要达到足够的安全强度,布尔函数的输入变量数 n n n 不能太小(通常需要8~16路LFSR),硬件开销大。而新的流密码架构可以用更少的资源达到更高的安全级别。
5.3.2 主流演进方向的技术逻辑
后续流密码架构演进,核心思路都是打破"静态布尔函数 + 多路线性输出"的清晰攻击面。
1. 钟控生成器(Clock-Controlled Generator)
技术逻辑:用一路LFSR控制另一路LFSR的时钟移位,打破输出与输入之间的固定函数关系。
- 代表:Stop-and-Go、Step-1/Step-2、A5/1
- 防御效果:输出与各LFSR之间不再是静态布尔函数关系,相关攻击的统计偏差被大幅削弱
- 局限:钟控规律本身可能被利用,存在特定的钟控攻击手段
2. 非线性滤波生成器(Nonlinear Filter Generator)
技术逻辑:单LFSR + 多抽头非线性滤波函数,结构更简洁。
- 代表:E0、LILI-128
- 防御效果:只有一路LFSR,不存在"多路分治"的攻击面
- 局限:同样面临相关攻击、代数攻击威胁,且单LFSR结构下代数攻击往往更高效
3. 字级ARX流密码
技术逻辑:以字(32/64位)为单位,使用加法、旋转、异或混合操作,彻底脱离比特级LFSR+布尔函数范式。
- 代表:Salsa20、ChaCha20、RC4
- 防御效果:天然抵御比特级相关攻击、代数攻击等针对布尔函数的分析手段;软件实现效率极高
- 局限:安全性证明更困难,依赖经验性设计与持续密码分析检验
4. 非线性反馈移位寄存器(NLFSR)
技术逻辑:反馈函数本身就是非线性的,不再是纯线性递推。
- 代表:Grain、Trivium、ZUC
- 防御效果:打破了LFSR的线性结构,快速相关攻击等依赖线性递推的攻击手段失效
- 局限:NLFSR的数学性质远不如LFSR清晰,周期、统计特性等难以严格证明
共同趋势:不再依赖单一非线性布尔函数作为安全核心,而是通过动态结构、字级操作、混合反馈等方式,让攻击者难以建立清晰的数学模型。
组合生成器的"结构太清晰"既是它易于分析的优点,也是它安全上的致命弱点。
当然,组合生成器并未完全退出历史舞台。它结构简单、硬件效率高、数学分析成熟,在资源受限的嵌入式场景、轻量级密码中仍有应用价值。更重要的是,它是流密码密码分析的最佳入门载体------理解了组合生成器的攻击体系,再去理解更复杂的现代流密码,就有了坚实的理论基础。
本篇小结
本篇围绕相关攻击与组合生成器的安全边界,核心内容如下:
- 数学基础:符合概率、偏差、Walsh 谱三者等价关系,一阶与高阶相关定义。
- 攻击原理:分治思想、四步攻击流程、假设检验视角下的样本量推导。
- Geffe 实战:完整演算一阶相关漏洞、攻击流程、复杂度对比。
- 快速相关攻击:译码视角转化、指数到多项式的效率飞跃。
- 安全边界:攻击手段全景、设计约束、架构演进方向。
相关攻击是流密码分析中最重要的通用范式之一,掌握它就掌握了分析组合生成器、滤波生成器等多种架构的核心工具。
下一篇:RC4 流密码深度解析------曾经是世界上使用最广泛的流密码,最终因一系列统计偏差问题被淘汰。RC4 的兴衰史,本身就是一部生动的流密码分析史。
免责声明:本文内容仅用于密码学学术学习与 CTF 竞赛研究。未经授权对信息系统进行扫描、渗透、攻击等行为属于违法行为,请勿将文中理论与技术用于任何非法场景。