代替-置换网络
混淆扩散范例
F k ( x ) = f 1 ( x 1 ) ⋯ f 16 ( x 16 ) F_k(x) = f_1(x_1)\cdots f_{16}(x_{16}) Fk(x)=f1(x1)⋯f16(x16)
代替置换(SP)网络
-
单轮
- 输入明文 m m m,子密钥 K 1 K_1 K1,输出 m ⊕ K 1 m \oplus K_1 m⊕K1,作为S盒的输入
- S盒对输入进行(区域)混淆,输出混淆值
- 对S盒的输出进行重排列,输出密文 c c c
-
安全性的决定因素
- S盒(Sbox)
- 混合置换(MP, mixing permutations)
- 密钥编排
设计原则
-
S盒可逆
- 必须可逆,为了解密 c c c
- 需要小心的设计,而不是盲目的随机选择,为了满足雪崩效应
-
雪崩效应
- 随机混合置换产生非常弱的雪崩效应
- 雪崩效应的要求
- S盒输入改变单比特,输出至少改变两比特
- 混合置换的设计要使任何给定的 S S S盒的输出比特被传递到下一轮不同的 S S S盒中
攻击1、2、3轮代替置换网络
-
1轮 y = F k ( x ) y = F_k(x) y=Fk(x)
- y 2 ← M P − 1 y y_2 \overset{MP^{-1}}{\leftarrow} y y2←MP−1y
- y 1 ← S b o x − 1 y 2 y_1 \overset{Sbox^{-1}}{\leftarrow} y_2 y1←Sbox−1y2
- k = x ⊕ y 1 k = x \oplus y_1 k=x⊕y1
-
2轮 b l o c k = 64 b i t S b o x = 4 b i t k ∈ { 0 , 1 } 128 block = 64bit \quad Sbox = 4bit \quad k \in \{0, 1\}^{128} block=64bitSbox=4bitk∈{ 0,1}128
-
y 2 b ← M P 2 − 1 y y^b_2 \overset{MP_2^{-1}}{\leftarrow} y y2b←MP2−1y
-
y 1 b ← S b o x 1 − 1 y 2 b y^b_1 \overset{Sbox_1^{-1}}{\leftarrow} y^b_2 y1b←Sbox1−1y2b, y 1 b = w 1 w 2 ⋯ w 16 y^b_1 = w_1w_2 \cdots w_{16} y1b=w1w2⋯w16
-
w 1 = k 1 b ⊕ α 1 w_1 = k^b_1 \oplus \alpha_1 w1=k1b⊕α1,其中
α = α 1 α 2 ⋯ α 16 \alpha = \alpha_1\alpha_2\cdots\alpha_{16} α=α1α2⋯α16为第一轮输出(未知),且
α ← M P 1 y 2 a ← S b o x 1 y 1 a = x ⊕ k a \alpha \overset{MP_1}{\leftarrow} y^a_2 \overset{Sbox_1}{\leftarrow} y^a_1 = x \oplus k^a α←MP1y2a←Sbox1y1a=x⊕ka
-
逆转 α \alpha α(不需要知道具体值)的混合置换,可以知道 α 1 \alpha_1 α1的4bit来自哪些 S b o x Sbox Sbox,最坏情况下,4bit分别来自4个不同的 S b o x Sbox Sbox,4个 S b o x Sbox Sbox的输入共16bit,由输入 x x x和第一轮密钥 k a k^a ka的对应16bit异或得到,设 k a k^a ka的对应16bit为 k l 1 a k^a_{l_1} kl1a
-
猜测 k l 1 a k^a_{l_1} kl1a,并得到相应的 α 1 ← k l 1 a \alpha_1 \leftarrow k^a_{l_1} α1←kl1a;同时猜测 k 1 b k^b_1 k1b,用 S t e p 3 Step3 Step3中的 w 1 = k 1 b ⊕ α 1 w_1 = k^b_1 \oplus \alpha_1 w1=k1b⊕α1验证猜测
由于该过程的映射为 { 0 , 1 } 16 + 4 → { 0 , 1 } 4 \{0, 1\}^{16 + 4} \rightarrow \{0, 1\}^4 { 0,1}16+4→{ 0,1}4,因此穷举空间为 2 20 2^{20} 220,通过测试的概率为 1 2 ∣ w 1 ∣ = 1 2 4 = 1 16 \frac{1}{2^{|w_1|}} = \frac{1}{2^4} = \frac{1}{16} 2∣w1∣1=241=161,因此通过测试的 k l 1 a ∣ k 1 b k^a_{l_1}|k^b_1 kl1a∣k1b的个数为 2 20 × 2 − 4 = 2 16 2^{20} \times 2^{-4} = 2^{16} 220×2−4=216
-
使用多对不同 ( x , y ) (x, y) (x,y)测试,每对测试期望筛除 15 16 \frac{15}{16} 1615(留下 1 2 4 \frac{1}{2^4} 241)的候选 k l 1 a ∣ k 1 b k^a_{l_1}|k^b_1 kl1a∣k1b,至少需要 5 ( 1 + 4 ) 5(1 + 4) 5(1+4)对输入/输出 ( x , y ) (x, y) (x,y)进行验证,才可能留下唯一的一种 k l 1 a ∣ k 1 b k^a_{l_1}|k^b_1 kl1a∣k1b
复杂度分析
-
假设使用8对 ( x , y ) (x, y) (x,y)最终确定了唯一可能的 k l 1 a ∣ k 1 b k^a_{l_1}|k^b_1 kl1a∣k1b,复杂度为 8 × 2 20 = 2 23 8 \times 2^{20} = 2^{23} 8×220=223(实际小于这个值)
-
对 k b k^b kb的所有16个部分按上述方法攻击,复杂度为 16 × 2 23 = 2 27 16 \times 2^{23} = 2^{27} 16×223=227(实际也小于这个值)
-
在确定 k b k^b kb的同时,也确定了 k a k^a ka的所有位,因此总复杂度为 2 27 2^{27} 227,这远小于穷举密钥空间 2 128 2^{128} 2128的复杂度
原因在于,2轮并没有使密钥的所有比特影响输出的所有比特(仅有20bit影响了输出的前4bit)
-
-
3轮
- 雪崩效应依然未完成,改变输入的1bit,输出将会有很多保持不变,因此很容易和随机置换区别开来
- 获得密钥需要更高的复杂度