代数攻击与SAT问题

代数攻击

代数攻击基本思想是将密码系统的安全性归结为求解一个多元多项式方程组的困难性。尝试将密码算法表示为关于密钥和已知量的多元多项式方程组,然后通过求解该方程组来恢复密钥

代数攻击的步骤

将密码算法内部的中间状态(密钥、轮密钥、S盒的输入/输出)和输出(密文)表示为未知变量
根据算法的每一步操作(S盒替换、线性变换、异或等)来建立变量之间的数学关系
已知或选择一定数量的明文-密文对,通过求解这个方程组,恢复出未知的密钥

SAT问题

SAT问题(布尔可满足性问题)
判断一个布尔公式是否存在一组赋值使得公式为真。它是第一个被证明为NP完全的问题,任何NP问题都可以在多项式时间内归约到SAT问题
没有一个已知的多项式时间算法能解决所有SAT实例
如果任何一个NP完全问题存在多项式时间解法,那么P=NP

SAT问题的形式

一个SAT问题实例通常由合取范式(CNF)表示,即多个子句的合取,每个子句是多个文字(变量或其否定)的析取

SAT求解器

现代SAT求解器(MiniSat、CryptoMiniSat等)使用高效的算法(DPLL、CDCL)来求解SAT问题

代数攻击过程

代数攻击中建立的多元多项式方程组可以转化为SAT问题。将每个多项式方程转化为一组CNF子句,然后使用SAT求解器来求解

从代数方程组到SAT问题

  1. 将有限域上的多元多项式方程转化为布尔方程
  2. 将布尔函数表示为ANF
  3. 将ANF转化为CNF

例如,方程 x1 ⊕ x2 ⊕ x3 = 0 可以转化为等价的CNF子句:(x1 ∨ x2 ∨ x3) ∧ (x1 ∨ ¬x2 ∨ ¬x3) ∧ (¬x1 ∨ x2 ∨ ¬x3) ∧ (¬x1 ∨ ¬x2 ∨ x3)。

将转化后的CNF公式输入SAT求解器,如果存在满足条件的赋值,则求解器会返回一组解,这组解对应于原方程组的解

实例

一个简单的代数攻击转化为SAT问题
考虑一个简单的线性反馈移位寄存器(LFSR)的代数攻击。假设LFSR的初始状态为(s0, s1, s2),满足线性递归关系:s3 = s0 ⊕ s1
观察到输出序列(s0, s1, s2, s3),并希望恢复初始状态

我们可以建立方程:
s3 = s0 ⊕ s1
已知s0, s1, s2, s3的值,我们可以将方程写为:
s0 ⊕ s1 ⊕ s3 = 0
将这个方程转化为CNF。令变量x0, x1, x2, x3分别表示s0, s1, s2, s3
方程x0 ⊕ x1 ⊕ x3 = 0等价于以下CNF子句:
(x0 ∨ x1 ∨ x3)
(x0 ∨ ¬x1 ∨ ¬x3)
(¬x0 ∨ x1 ∨ ¬x3)
(¬x0 ∨ ¬x1 ∨ x3)
然后,我们将已知的输出值作为单位子句加入
假设观察到输出序列为(1,0,1,1),则加入子句:
(x0)
(¬x1)
(x2)
(x3)
因为s0=1,s1=0,s2=1,s3=1
得到CNF公式,包含上述4个子句和4个单位子句。使用SAT求解器,可以求解这个公式,得到满足条件的赋值,即初始状态

posted @ 2025-11-15 14:30  lumiere_cloud  阅读(15)  评论(0)    收藏  举报