论文阅读:Differential and Linear Cryptanalysis Using Mixed-Integer Linear Programming
主要学习了“差分分析及其自动化”这个领域内的两篇论文:
- Differential and Linear Cryptanalysis Using Mixed-Integer Linear Programming,论文链接
- Automatic Security Evaluation and (Related-key) Differential Characteristic Search: Application to SIMON, PRESENT, LBlock, DES(L) and Other Bit-oriented Block Ciphers,ASIACRYPT 14',论文链接
背景知识
差分分析
一轮加密
假设有以下一轮加密过程,其中 为明文, 为密文, 为密钥, 为 S-box。
1 k_0 k_1
2 | |
3 v v
4m -> (xor) -> u -> [S] -> v -> (xor) -> c
这里 。朴素的破译方法是枚举 ,有 种可能。但假设我们知道 两个明密文对,则 ,因此
可以看出,此时只需要枚举 即可,有 种可能;这相较于 取得了极大进步。
二轮加密
假设有以下二轮加密过程,其中 为明文, 为密文, 为密钥, 为 S-box。
1 k_0 k_1 k_2
2 | | |
3 v v v
4m -> (xor) -> u -> [S] -> v -> (xor) -> w -> [S] -> x -> (xor) -> c
这里 。朴素的破译方法是枚举 ,有 种可能。如果采用一轮加密中的想法,可以不用枚举 ,只枚举 ,有 种可能:
接下来介绍的差分分析的方法,可以将可能性再次降低,降低为 。假设 S-box 如下:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6 | 4 | c | 5 | 0 | 7 | 2 | e | 1 | f | 3 | d | 8 | a | 9 | b |
当 的时候,由下表可知, 的概率最高,为 。
| 0 | f | 6 | b | d |
| 1 | e | 4 | 9 | d |
| 2 | d | c | a | 6 |
| 3 | c | 5 | 8 | d |
| 4 | b | 0 | d | d |
| 5 | a | 7 | 3 | 4 |
| 6 | 9 | 2 | f | d |
| 7 | 8 | e | 1 | f |
| 8 | 7 | 1 | e | f |
| 9 | 6 | f | 2 | d |
| a | 5 | 3 | 7 | 4 |
| b | 4 | d | 0 | d |
| c | 3 | 8 | 5 | d |
| d | 2 | a | c | 6 |
| e | 1 | 9 | 4 | d |
| f | 0 | b | 6 | d |
因此,在 的情况下,可以得到带概率的方程:
由以上分析可知,随机选取 ,取 ,计算得到 ,则跨越第一个 S-box 的输出中,
只需要枚举 ,就可以由 算出 。
借助计数器可以实现这个差分分析的过程。在统计的过程中,若 ,则计数器加一。正确密钥(称之为 Signal)的计数应该远高于错误密钥(称之为 Noise)的计数。统计计数器中数目最多的 index,即为 。
编写代码如下:
1import random
2
3S = [6, 4, 0xc, 5, 0, 7, 2, 0xe, 1, 0xf, 3, 0xd, 8, 0xa, 9, 0xb]
4S_inv = [S.index(i) for i in range(16)]
5
6
7k_0 = random.randint(0, 15)
8k_1 = random.randint(0, 15)
9k_2 = random.randint(0, 15)
10N = 1000
11
12
13def c(m):
14 return S[S[m ^ k_0] ^ k_1] ^ k_2
15
16
17if __name__ == '__main__':
18 cnt = [0 for _ in range(16)]
19 for guess in range(16):
20 for _ in range(N):
21 m_1 = random.randint(0, 15)
22 m_2 = m_1 ^ 0xf
23 c_1 = c(m_1)
24 c_2 = c(m_2)
25
26 x_1_x_2 = S_inv[c_1 ^ guess] ^ S_inv[c_2 ^ guess]
27 if x_1_x_2 == 0xd:
28 cnt[guess] += 1
29 for i in range(16):
30 print(f'[ Stat ] guess: {i}, count: {cnt[i]}')
31 guess_k_2 = cnt.index(max(cnt))
32 print(f'[ Guess ] guessed k_2: {guess_k_2}, real k_2: {k_2}')
33
34 # 继续猜测 k_1
35 cnt = [0 for _ in range(16)]
36 for guess in range(16):
37 for _ in range(N):
38 m_1 = random.randint(0, 15)
39 m_2 = random.randint(0, 15)
40 c_1 = c(m_1)
41 c_2 = c(m_2)
42
43 x_1_x_2 = S_inv[S_inv[c_1 ^ guess_k_2] ^ guess] ^ S_inv[S_inv[c_2 ^ guess_k_2] ^ guess]
44 if x_1_x_2 == m_1 ^ m_2:
45 cnt[guess] += 1
46 for i in range(16):
47 print(f'[ Stat ] guess: {i}, count: {cnt[i]}')
48 guess_k_1 = cnt.index(max(cnt))
49 print(f'[ Guess ] guessed k_1: {guess_k_1}, real k_1: {k_1}')
50
51 # 继续猜测 k_0
52 cnt = [0 for _ in range(16)]
53 m_1 = random.randint(0, 15)
54 c_1 = c(m_1)
55 guess_k_0 = S_inv[S_inv[c_1 ^ guess_k_2] ^ guess_k_1] ^ m_1
56 print(f'[ Guess ] guessed k_0: {guess_k_0}, real k_0: {k_0}')
57
58 print(f'[ Result ] guess_k_0: {guess_k_0}, \tk_0: {k_0}\n[ Result ] guess_k_1: {guess_k_1}, \tk_1: {k_1}\n[ Result ] guess_k_2: {guess_k_2}, \tk_2: {k_2}')
59
60 assert guess_k_0 == k_0, 'Guess k_0 failed!'
61 assert guess_k_1 == k_1, 'Guess k_1 failed!'
62 assert guess_k_2 == k_2, 'Guess k_2 failed!'
63 print('[ Success ] All keys guessed successfully!')
运行结果为:
1...
2[ Guess ] guessed k_2: 5, real k_2: 5
3...
4[ Guess ] guessed k_1: 13, real k_1: 13
5[ Guess ] guessed k_0: 14, real k_0: 14
6[ Result ] guess_k_0: 14, k_0: 14
7[ Result ] guess_k_1: 13, k_1: 13
8[ Result ] guess_k_2: 5, k_2: 5
9[ Success ] All keys guessed successfully!
由于以上代码中的二轮加密的算法的密钥 都是随机选取的,所以说明破译成功。
三轮加密
假设有以下三轮加密过程,其中 为明文, 为密文, 为密钥, 为 S-box。
1 k_0 k_1 k_2 k_3
2 | | | |
3 v v v v
4m -> (xor) -> u -> [S] -> (xor) -> [S] -> x -> (xor) -> y -> [S] -> z -> (xor) -> c
这里 。选择两个明密文对 ,通过猜测 ,可以得到 。此时,我们也已知 ,所以我们需要在 2 层 S-box 中找到高概率的输入输出差分对应关系。
画出 S-box 的差分特征如下表所示:
| \ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 16 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 1 | - | - | 6 | - | - | - | - | 2 | - | 2 | - | - | 2 | - | 4 | - |
| 2 | - | 6 | 6 | - | - | - | - | - | - | 2 | 2 | - | - | - | - | - |
| 3 | - | - | - | 6 | - | 2 | - | - | 2 | - | - | - | 4 | - | 2 | - |
| 4 | - | - | - | 2 | - | 2 | 4 | - | - | 2 | 2 | 2 | - | - | 2 | - |
| 5 | - | 2 | 2 | - | 4 | - | - | 4 | 2 | - | - | 2 | - | - | - | - |
| 6 | - | - | 2 | - | 4 | - | - | 2 | 2 | - | 2 | 2 | 2 | - | - | - |
| 7 | - | - | - | - | - | 4 | 4 | - | 2 | 2 | 2 | 2 | - | - | - | - |
| 8 | - | - | - | - | - | 2 | - | 2 | 4 | - | - | 4 | - | 2 | - | 2 |
| 9 | - | 2 | - | - | - | 2 | 2 | 2 | - | 4 | 2 | - | - | - | - | 2 |
| a | - | - | - | - | 2 | 2 | - | - | - | 4 | 4 | - | 2 | 2 | - | - |
| b | - | - | - | 2 | 2 | - | 2 | 2 | 2 | - | - | 4 | - | - | 2 | - |
| c | - | 4 | - | 2 | - | 2 | - | - | 2 | - | - | - | - | - | 6 | - |
| d | - | - | - | - | - | - | 2 | 2 | - | - | - | - | 6 | 2 | - | 4 |
| e | - | 2 | - | 4 | 2 | - | - | - | - | - | 2 | - | - | - | - | 6 |
| f | - | - | - | - | 2 | - | 2 | - | - | - | - | - | - | 10 | - | 2 |
对 S-box 而言,若输入对的差分 ,输出对的差分 ,则 是 S-box 的一条差分特征。将输入差分 经过 S 盒以概率 导致输出差分 ,记为 其中 为 的二进制位数,即 ; 为表格函数。随机置换的概率为 。【TODO:这个值对吗?】
由上表可知,第一个 S-box 对应 ,第二个 S-box 对应 。由此可以找到一条差分路径: 这条差分路径,对应着一个带概率的转移方程。【TODO:这里为什么要和 1/16 比较?】【TODO:无法复现这个差分特征,为什么呢?】
差分分析
一轮差分特征
对于轮函数 而言,若输入差分为 ,相应输出差分为 ,则 是轮函数的一条差分特征,即一轮加密的差分特征。
轮函数差分特征的概率:
轮差分特征
一个三元组 。其中, 和 是初始输入差分和 轮加密运算后的差分; 中的 表示第 轮的输出差分。 轮差分特征可以看作是 个一轮差分特征的级联,概率为 差分分析
- 敌手得到一个黑盒,可以选择输入并获得相应的输出,需判断该黑盒是 轮加密函数还是一个随机置换。
- 设 ,则随机选择 个明文对 ,其中 ,获得加密后的相应的密文对 ,并计数满足 的对数 。
- 若 ,则判定该算法为特定 轮加密函数;
- 否则,为随机置换。
由此可见,输入、输出差分分布的不均匀性是差分分析的基础。
差分分支数
设在 上定义有 Hamming Weight , 表示 的二进制表示中 的个数。设有一个 的函数 ,则 的差分分支数 (Differential Branch Number) 被定义为:
换句话说, 是一个“黑盒”,那么 就是所有的输入对 中,输入的差分与输出的差分之和的最小值。Branch Number - Wikipedia 中的描述如下:
In cryptography, the branch number is a numerical value that characterizes the amount of diffusion introduced by a vectorial Boolean function that maps an input vector to output vector .
所以,Branch Number 越大,说明“扩散”越强,该组件对于加密越有用。
使用 MILP 技术进行差分分析
Differential and Linear Cryptanalysis Using Mixed-Integer Linear Programming 这篇论文给出了使用混合整数动态规划 (Mixed-Integer Linear Programming) 的方式来寻找加密算法的差分路径。
XOR 模块带来的约束
设 XOR 模块的输入为 ,输出 ,则可以用以下约束来表示该 XOR 模块: 考虑 的情况,此时需要添加约束 。由于 ,所以 。
- 当 时,,因此 ,符合条件。
- 当 或 时,不妨设 ,则 ,因此 。因此 且 ,故 ,符合条件。
- 当 时,则 ,因此 。因此 且 且 ,故 ,符合条件。
线性变换带来的约束
设 分别表示线性变换 的输入和输出差分,设 是 的线性分支数,则有以下约束: 这个约束的依据是 的定义。
目标函数
某条差分路径的概率很大,那么这条路径上激活的 S-box 的个数一定很少。因此,想要得到一条大概率的差分路径,等价于求最少激活 S-box 个数。
对以上方法进行的拓展
上述模型最初主要针对面向字 (word-oriented) 的密码。论文的核心贡献之一是将其扩展到了面向比特 (bit-oriented) 的密码,这需要对 S-box 进行更精细的建模。
S-box 的激活状态
为了在比特层面进行分析,首先需要用一个 0-1 变量 来精确描述第 个 S-box 是否被激活。若第 个 S-box 被激活(输入非零),则 ;反之 。设 S-box 的输入差分比特为 ,则 和输入比特的关系由以下约束刻画: 这组约束确保了 (即 等价于输入差分非零)。
S-box 差分传播的建模
由于非零输入差分必然对应非零输出差分,可以建立输入和输出差分之间的约束: 其中 和 分别是 S-box 的输入和输出比特数。该约束保证了只要输入(或输出)差分不为零,输出(或输入)差分也必然不为零。
除此之外,还需要使用其差分分支数 来进行约束: 这个约束的核心思想是,只要 S-box 被激活(即 ),其输入和输出差分的 Hamming Weight 之和必须大于等于其分支数 。
利用 Cutting-Plane 法转为求凸包
以上建模过程表明,每条差分路径都对应 MILP 问题可行域中的一个解。但遗憾的是,MILP 的可行解并不能保证是有效的差分路径,因为仅使用这些约束条件,无法排除所有无效的差分模式。
Automatic Security Evaluation and (Related-key) Differential Characteristic Search: Application to SIMON, PRESENT, LBlock, DES(L) and Other Bit-oriented Block Ciphers 这篇论文提出了 Valid Cutting-off Inequality 的概念。剔除一个 Valid Cutting-off Inequality,能在不干扰有效差分路径的情况下,缩小 MILP 的可行域。

Conditional Differential Behavior
如果对于一个有界的变量 ,我们希望得到 满足 ,则可以用以下约束表示: Automatic Security Evaluation and (Related-key) Differential Characteristic Search: Application to SIMON, PRESENT, LBlock, DES(L) and Other Bit-oriented Block Ciphers 这篇论文给出了在 上的 与 之间的关系。 可以使用以下约束表示: 证明的简要思路:只证明 且 。记 。
- 先证明 满足上式。
- 然后证明 时, 都满足上式。
- 最后证明 不满足上式。
Convex Hull of All Possible Differentials
以上约束可以看作是一个凸包 (Convex Hull): 由于这些不等式太多了,所以直接跑 MILP 的代价太大。这些不等式(或等式)中可能有重复的部分,所以可以用计算几何相关的方法求最小凸包。
Selecting Valid Cutting-off Inequalities from the Convex Hull
用贪心的方法,每次选取一条不等式,看是否是 Cutting-off Inequality。
