非线性组合模型和相关攻击

一、非线性组合模型结构

将多个线性反馈移位寄存器(LFSR)的输出通过一个非线性函数组合,产生伪随机密钥流。

LFSR₁ → 输出s₁⁽ⁱ⁾ \
LFSR₂ → 输出s₂⁽ⁱ⁾ ---> 非线性组合函数 g(x) → 乱数 d_i (密钥流)
...              /
LFSRₙ → 输出sₙ⁽ⁱ⁾/
  • 输入:n个LFSR的输出序列
  • 输出:经过非线性函数g(x)组合后的密钥流
  • 设计目标:提高线性复杂度、统计特性好、周期长

二、相关攻击

相关攻击(Correlation Attack),也称为分割攻击(Divide-and-Conquer Attack)

2.1 攻击思想

相关攻击的基本思想是利用密钥流与某个LFSR输出之间的统计相关性,先攻击一个或少数几个LFSR,再逐步恢复所有LFSR的状态。

关键:

  • 非线性组合函数g(x)可能存在这样的性质:密钥流\(d_i\)与某个LFSR的输出\(s_j⁽ⁱ⁾\)之间,存在显著不等于0.5的相等概率
  • 即:\(P(d_i = s_j⁽ⁱ⁾) = p ≠ 0.5\)
  • 这种相关性为攻击者提供了区分正确密钥与错误密钥的统计判据

2.2 数学基础:相关免疫函数

定义:一个n元布尔函数f(x)是m阶相关免疫的,如果对于任意m个不同的输入变量\(x_{i₁}, x_{i₂}, ..., x_{i_m}\),输出f(x)与这m个变量的任意布尔函数都是统计独立的。
设计意义:

  • m阶相关免疫意味着攻击者无法通过观察输出获取任何m个输入变量的信息
  • 但相关免疫函数与其他密码学指标(如非线性度、代数次数)存在制约关系

三、相关攻击的具体步骤

下面以经典的Geffe生成器为例,详细说明相关攻击的步骤。

3.1 Geffe生成器结构

Geffe生成器由三个LFSR和一个非线性函数组成:

LFSR₁ → a_i
LFSR₂ → b_i  → 非线性函数 g(a,b,c) = a·b ⊕ (b⊕1)·c → 输出 d_i
LFSR₃ → c_i

可证明:

  1. \(P(d_i = a_i) = 3/4\)
  2. $P(d_i = c_i) = 3/4 $
  3. \(P(d_i = b_i) = 1/2\) (无相关性)

3.2 攻击步骤

步骤1:攻击LFSR₁的初态

  1. 假设一个候选初态:对LFSR₁猜测一个初态S
  2. 生成假设序列:根据假设的初态,计算LFSR₁的输出序列{a_i}的N个比特
  3. 统计相关性:计算{a_i}与观测到的密钥流{d_i}在对应位置相等的个数n
  4. 判断初态:
    • 如果n/N ≈ 3/4,则S很可能是LFSR₁的正确初态
    • 如果n/N ≈ 1/2,则S很可能是错误初态
  5. 遍历搜索:对所有可能的LFSR₁初态重复上述过程

计算复杂度:需要测试2^{L₁}个候选初态(L₁为LFSR₁的级数)

步骤2:攻击LFSR₃的初态

采用与步骤1完全相同的方法,利用P(d_i = c_i) = 3/4的相关性恢复LFSR₃的初态。

步骤3:攻击LFSR₂的初态

此时已恢复LFSR₁和LFSR₃的初态,可计算它们的输出序列{a_i}和{c_i}。由于:

  • \(d_i = a_i·b_i ⊕ (b_i⊕1)·c_i\)
  • \(b_i=1时,d_i = a_i\)
  • \(b_i=0时,d_i = c_i\)

因此,对于每个位置i:

  • 如果\(d_i = a_i\),则\(b_i=1\)的概率较大
  • 如果\(d_i = c_i\),则\(b_i=0\)的概率较大

但更直接的方法是穷举搜索LFSR₂的初态,因为:

  1. 已知LFSR₁和LFSR₃的状态
  2. 对于每个候选的LFSR₂初态,可以生成{b_i}序列
  3. 验证生成的密钥流是否与观测的{d_i}匹配

总复杂度:\(2^{L₁} + 2^{L₂} + 2^{L₃}\),远小于同时搜索所有LFSR的复杂度\(2^{L₁+L₂+L₃}\)

3.3 攻击成功率分析

  • 正确初态:匹配比例期望为3/4
  • 错误初态:匹配比例期望为1/2
  • 区分能力:随着观测数据N增加,正确与错误初态的区分度提高

理论分析:
假设观测N个比特,正确初态的匹配数X ~ Binomial(N, 3/4),错误初态的匹配数Y ~ Binomial(N, 1/2)。

为可靠区分,需要:

  1. 设置阈值T
  2. 当匹配数 > T时,接受该初态假设

错误率:

  • 漏报率(错过正确密钥):P(X ≤ T)
  • 虚报率(接受错误密钥):P(Y > T)

通过选择合适的N和T,可使攻击成功率接近100%。

四、更一般化的相关攻击

对于一般的非线性组合函数g(x₁, x₂, ..., xₙ),相关攻击的通用步骤如下:

4.1 寻找最佳线性逼近

  1. 分析非线性函数g:计算其Walsh谱
  2. 寻找最大相关性:找到使|P(β·g(x) = α·x) - 1/2|最大的(α, β)对
  3. 确定攻击目标:选择相关性最强的LFSR或LFSR组合作为首要攻击目标

4.2 建立含错方程组

假设找到线性逼近:β·d_i ≈ α·x⁽ⁱ⁾,其中x⁽ⁱ⁾是LFSR状态向量的线性组合。

将关系式展开:

\[\beta \cdot d_i \approx (\alpha_1 s_1^{(i)} \oplus \alpha_2 s_2^{(i)} \oplus \cdots \oplus \alpha_n s_n^{(i)}) \]

每个\(s_j⁽ⁱ⁾\)可以表示为LFSR初态的线性函数:

\[s_j^{(i)} = b_j^{(i)} \cdot Key \]

因此得到关于密钥Key的线性方程组,但每个方程成立的概率为p ≠ 1。

4.3 求解含错方程组

方法1:穷举法

  • 遍历所有可能的密钥
  • 统计与观测数据的匹配数
  • 选择匹配数最高的候选密钥

方法2:快速相关攻击

  • 利用LFSR的线性递推关系
  • 将问题转化为信道编码的译码问题
  • 使用迭代译码算法(如基于图模型的算法)提高效率

所需数据量:N ∝ 1/(p-0.5)²

五、对抗相关攻击的设计策略

5.1 使用相关免疫函数

  • 选择m阶相关免疫的组合函数,使密钥流与任意m个LFSR输出独立
  • 代价:相关免疫函数往往代数次数较低,可能降低其他安全性指标

5.2 平衡设计指标

在设计非线性组合函数时,需要平衡:

  1. 相关免疫阶数:抵抗相关攻击
  2. 代数次数:抵抗代数攻击
  3. 非线性度:抵抗线性攻击
  4. 弹性阶数:同时抵抗相关攻击和代数攻击

5.3 增加LFSR数量

  • 使用更多LFSR增加攻击复杂度
  • 但需注意,增加LFSR可能引入新的安全风险

5.4 引入记忆或钟控

  • 在组合模型中添加记忆单元(如带进位组合生成器)
  • 使用钟控机制打乱LFSR输出与密钥流的时序对应关系

实例

对Geffe生成器的完整攻击演示

假设我们有如下Geffe生成器:

  • LFSR₁:级数L₁=5,反馈多项式f₁(x)=x⁵+x²+1
  • LFSR₂:级数L₂=7,反馈多项式f₂(x)=x⁷+x⁶+1
  • LFSR₃:级数L₃=9,反馈多项式f₃(x)=x⁹+x⁴+1
  • 观测到N=1000比特密钥流

攻击过程:

  1. 攻击LFSR₁:

    • 遍历2⁵=32个候选初态
    • 对每个候选,生成1000比特
    • 统计{a_i}与{d_i}的匹配数
    • 正确初态匹配数≈750,错误初态匹配数≈500
    • 成功恢复LFSR₁初态
  2. 攻击LFSR₃:

    • 同样方法遍历2⁹=512个候选初态
    • 成功恢复LFSR₃初态
  3. 攻击LFSR₂:

    • 已知LFSR₁和LFSR₃,可生成{a_i}和
    • 遍历2⁷=128个LFSR₂候选初态
    • 对每个候选,生成{b_i},计算d_i' = a_i·b_i ⊕ (b_i⊕1)·c_i
    • 比较{d_i'}与观测{d_i},找到完全匹配的初态

总计算量:32+512+128=672次测试,远小于穷举所有LFSR的2²¹≈2百万次。

总结

  1. 利用统计相关性:密钥流与某些LFSR输出之间存在非随机相关性
  2. 分割攻击策略:将大密钥空间分解为小空间分别攻击
  3. 统计判别方法:通过匹配率区分正确与错误密钥
  • 非线性组合函数必须具有足够高的相关免疫阶数
  • 实际设计中需权衡相关免疫性与其他密码学指标
  • 现代序列密码通常采用更复杂的结构(如带记忆、钟控)来抵御此类攻击
posted @ 2025-12-27 12:39  lumiere_cloud  阅读(3)  评论(0)    收藏  举报