传统密码分析文献阅读:Practical-Time Related-Key Attack on GOST with Secret S-boxes
一、文章来源
文章发表于2023年美密会。详情可见:https://link.springer.com/chapter/10.1007/978-3-031-38548-3_7。
二、文章摘要
三、预备知识
-
GOST算法简介
GOST是 Feistel 结构分组密码,分组长度为 64 位,密钥长度为 256 位,加密过程采用 32 轮迭代结构。GOST轮函数可以表述为如下的变化公式:简单的密钥扩展算法,为密钥相关条件的下实施全轮差分攻击提供良好的基础。
-
相关密钥差分攻击
差分攻击本文略过。相关密码差分攻击分别由Biham和Knudsen提出,此攻击基于基本差分攻击,但是所采用的明文对可以使用两个满足特定输入差分主密钥进行加密,明文对之间并不需要满足特殊的输入差分(也就是说,在某些相关密钥差分攻击应用中,所选用的密文对是相同的)。观察明文对加密后获得的密文对所满足的输出差分值的统计特性: Pr [ E K ( P ) ⊕ E K ′ ( P ′ ) = Ω O ∣ Pr [ E K ( P ) ⊕ E K ′ ( P ′ ) = Ω O ∣ P ⊕ P ′ = Ω I ] = p \operatorname{Pr}\left[E_{K}(P) \oplus E_{K^{\prime}}\left(P^{\prime}\right)=\Omega_{O} \mid\right.\operatorname{Pr}\left[E_{K}(P) \oplus E_{K^{\prime}}\left(P^{\prime}\right)=\Omega_{O} \mid\right.\left.P \oplus P^{\prime}=\Omega_{I}\right]=p Pr[EK(P)⊕EK′(P′)=ΩO∣Pr[EK(P)⊕EK′(P′)=ΩO∣P⊕P′=ΩI]=p,表示为 Ω I ⟶ p Ω K Ω O \Omega_{I} \underset{\Omega_{K}}{\stackrel{p}{\longrightarrow}} \Omega_{O} ΩIΩK⟶pΩO。若有明显的统计特性,则可以作为相关密钥条件下的差分区分器进行密钥恢复。
四、技术细节
- 根据使用最广的GOST算法S盒的设置,其中有一个广为使用的S盒差分特征。第7个S盒 S 7 : 8 → 8 S_7:8 \rightarrow 8 S7:8→8的概率为 1 / 4 1/4 1/4,因此我们在第一轮的子密钥 K 0 K_0 K0中引入密钥差分比特 e 31 e_{31} e31,经过S盒后,左循环移位到 e 10 e_{10} e10。
- 在第二轮的子密钥中引入差分比特 e 10 e_{10} e10,可以以 1 / 2 1/2 1/2的概率消除输入差分比特 e 10 e_{10} e10。
- 在第三轮的输入差分,左侧为第一轮所产生的 e 10 e_{10} e10,右侧在第二轮中已经 1 / 2 1/2 1/2的概率消除。因此我们的目标为消除输入左侧的单比特差分 e 10 e_{10} e10。故我们在第三轮子密钥 K 2 K_2 K2中引入差分 e 31 e_{31} e31,S盒以 1 / 4 1/4 1/4的概率产生 e 31 e_{31} e31的输出差分,从而消除左侧单比特差分(类似第一轮中的设置)。
综上三轮的子密钥差分设置,生成了一个明文对输入差分为0,输出差分为0的3轮迭代差分路径(局部碰撞):
(
0
,
0
)
⟶
1
4
Ω
K
1
=
e
31
(
0
,
e
10
)
⟶
1
2
Ω
K
2
=
e
10
(
e
10
,
0
)
⟶
1
4
Ω
K
3
=
e
31
(
0
,
0
)
,
(0,0) \underset{\Omega_{K_{1}}=e_{31}}{\stackrel{\frac{1}{4}}{\longrightarrow}}\left(0, e_{10}\right) \underset{\Omega_{K_{2}}=e_{10}}{\stackrel{\frac{1}{2}}{\longrightarrow}}\left(e_{10}, 0\right) \underset{\Omega_{K_{3}}=e_{31}}{\stackrel{\frac{1}{4}}{\longrightarrow}}(0,0),
(0,0)ΩK1=e31⟶41(0,e10)ΩK2=e10⟶21(e10,0)ΩK3=e31⟶41(0,0),
上述3轮的迭代差分所需明文对输入差分为0,所需主密钥输入差分为: Ω K = ( e 31 , e 10 , e 31 , 0 , 0 , 0 , 0 , 0 ) \Omega_{K}=\left(e_{31}, e_{10}, e_{31}, 0,0,0,0,0\right) ΩK=(e31,e10,e31,0,0,0,0,0),因此4-8轮对状态差分值没有影响,故3轮迭代差分自然推广为如下8轮迭代差分: ( 0 , 0 ) ⟶ 2 − 5 Ω K ( 0 , 0 ) (0,0) \underset{\Omega_{K_{}}}{\stackrel{2^{-5}}{\longrightarrow}}\left(0, 0\right) (0,0)ΩK⟶2−5(0,0)。
1-8与9-16与17-24由于使用的子密钥均为 Ω K \Omega_{K} ΩK,故有以下24轮差分路径:
( 0 , 0 ) ⟶ 2 − 15 Ω K ( 0 , 0 ) (0,0) \underset{\Omega_{K_{}}}{\stackrel{2^{-15}}{\longrightarrow}}\left(0, 0\right) (0,0)ΩK⟶2−15(0,0)
在25-32轮加密中,所示用的子密钥为 Ω K ′ = ( 0 , 0 , 0 , 0 , 0 , e 31 , e 10 , e 31 ) \Omega_{K}'=\left(0,0,0,0,0,e_{31}, e_{10}, e_{31}\right) ΩK′=(0,0,0,0,0,e31,e10,e31),故在25-29以概率1维持 0 → 0 0\rightarrow0 0→0差分路径。在30-32轮加密中,再次使用上述3轮的迭代路径,此处解释省略。
综上我们得到了一个32轮的差分路径,输入密文差分为0,主密钥差分为 Ω K = ( e 31 , e 10 , e 31 , 0 , 0 , 0 , 0 , 0 ) \Omega_{K}=\left(e_{31}, e_{10}, e_{31}, 0,0,0,0,0\right) ΩK=(e31,e10,e31,0,0,0,0,0):
( 0 , 0 ) ⟶ 2 − 20 Ω K ( 0 , 0 ) (0,0) \underset{\Omega_{K_{}}}{\stackrel{2^{-20}}{\longrightarrow}}\left(0, 0\right) (0,0)ΩK⟶2−20(0,0)
最后三轮在整体差分路径概率上增加了 2 − 5 2^{-5} 2−5,但我们可以对最后三轮的差分走势进行推导,使用截断差分的形式表示密文对差分,从而消除最后三轮所增加的差分路径概率。
-
第30轮的输入差分为0,子密钥差分为 e 31 e_{31} e31。在S盒运算中,只有第8个S盒 S 7 S_7 S7的输入差分不为0,因此只有 S 7 S_7 S7的输出差分非0,在经过左循环移位后,可以将全部的输出差分可能表示为截断差分 ( 0 , 00000 X Y 0 ) (0,00000XY0) (0,00000XY0),其中X的最高位差分为0,因此 X ∈ { 0 , 1 , . . . , 7 } X \in \left\{ 0,1,...,7 \right\} X∈{0,1,...,7}。其中Y的低3位差分为0,因此 Y ∈ { 0 , 8 } Y\in\left\{0,8\right\} Y∈{0,8};
-
第31轮的子密钥差分为 e 10 e_{10} e10,作用于X的第三位比特,但由于是模加运算,有 1 / 2 1/2 1/2的概率向下一位进位,我们计算概率大于 99 % 99\% 99%的截断差分表示形式(1- n n n比特连续进位的概率,进位从 e 11 e_{11} e11开始): 1 − ( 1 / 2 ) n > 99 % 1-(1/2)^n > 99\% 1−(1/2)n>99%,求解 n = 9 n=9 n=9,故在截断差分的表示中,9比特以 99 % 99\% 99%是未知的([11],[12,13,14,15],[16,17,18,19]),通过S盒后的未知比特位置(0,0,0,?,?,?,0),经过循环移位后未知比特位置([15],[16,17,18,19],[20,21,22,23],[24,25,26,27],[28,29,30]),故移位后形成的阶段差分为: D 3 = Z ? ? ? W 000 D_3={Z???W000} D3=Z???W000。
-
第32轮S盒后的差分为(???000),循环移位后的差分为 D 4 = ( [ ? ? ? ? ] [ ? ? ? ? ] [ ? 000 ] [ 0000 ] [ 0000 ] [ 0 ? ? ? ] [ ? ? ? ? ] [ ? ? ? ? ] ) D_4=([????][????][?000][0000][0000][0???][????][????]) D4=([????][????][?000][0000][0000][0???][????][????])
最终形成的32轮截断差分路径为:
( 0 , 0 ) ⟶ 2 − 15 Ω K ( ? ? U 00 V ? ? , Z ? ? ? W 000 ) (0,0) \underset{\Omega_{K_{}}}{\stackrel{2^{-15}}{\longrightarrow}}\left(??U00V??, Z???W000\right) (0,0)ΩK⟶2−15(??U00V??,Z???W000)
在本小节中,将差分攻击拆解为几个步骤进行。
Step1:发现一个正确对
首先确定密文和主密钥,对主要进行差分操作,利用设定的4个特定密钥差分值,相关密钥组如下:
K , { K ⊕ Ω K 1 i } i ∈ { 0 , 1 , 2 , 3 } , Ω K 1 i = ( e 31 , e 7 + i , e 31 , 0 , 0 , 0 , 0 , 0 ) K,\left\{K \oplus \Omega_{K_{1}^{i}} \right\}i\in\left\{0,1,2,3\right\},\Omega_{K_{1}^{i}}=(e_{31},e_{7+i},e_{31},0,0,0,0,0) K,{K⊕ΩK1i}i∈{0,1,2,3},ΩK1i=(e31,e7+i,e31,0,0,0,0,0)
此处对应在3轮迭代差分的第一轮中,S盒的输入差分为8,S盒输出差分仍为单比特有4种可能,在经过左循环移位后,位于 e 7 + i e_{7+i} e7+i这四种可能。对于大多数的未知S盒设置方案,下列的差分路径对于上述4组相关密钥条件之一是有效的。
( 0 , 0 ) ⟶ p ˉ ≥ 2 − 24 Ω K 1 i ( ? ? U 00 V ? ? x , Z ? ? ? W 00 0 x ) (0,0) \underset{\Omega_{K 1}^{i}}{\stackrel{\bar{p} \geq 2^{-24}}{\longrightarrow}}\left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? ? W 000_{x}\right) (0,0)ΩK1i⟶pˉ≥2−24(??U00 V??x,Z???W000x)
在未知S盒的情况下,上述分析的三轮迭代差分路径的概率也相应减少,原先是 1 / 4 , 1 / 2 , 1 / 4 1/4,1/2,1/4 1/4,1/2,1/4变为 1 / 8 , 1 / 2 , 1 / 8 1/8,1/2,1/8 1/8,1/2,1/8,输出差分和上述的截断差分一样。(U,V,Z,W)。
- 首先随机确定一个明文P和主密钥K,对明文P进行5次加密操作,4次异或操作,判断 E K ( P ) ⊕ E K ⊕ Ω K 1 i ( P ) = ( ? ? U 00 V ? ? x , Z ? ? ? W 00 0 x ) E_{K}(P) \oplus E_{K \oplus \Omega_{K 1}^{i}}(P)=\left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? ? W 000_{x}\right) EK(P)⊕EK⊕ΩK1i(P)=(??U00 V??x,Z???W000x)是否成立。我们确定 2 27 2^{27} 227次这样的操作为一次攻击,若发现了满足截断差分的明文,继续下一步,若没有发现,则生成本次攻击失败。
我们以最小概率假设截断差分概率: 2 − 24 2^{-24} 2−24。生成 2 24 2^{24} 224个明文后可以得到 2 26 2^{26} 226个密文对(使用四组相关密钥)。因此,在这个明文选取数量下,能够找到一个正确对的概率为 1 − ( 1 − 2 − 24 ) 2 26 ≈ 1 − e 4 ≈ 0.98 1-(1-2^{-24})^{2^{26}}\approx 1-e^4\approx 0.98 1−(1−2−24)226≈1−e4≈0.98。也就是说我们以98%的概率能够获得一个正确对。
Step2:基于上述正确对生成更多的正确对
我们可以使用中性比特的概念,基于已有正确对获得更多的正确对。基于上述的3迭代差分,涉及的明文比特并不多,也就是说我们改变明文的一些比特后,3轮迭代差分仍然成立,这些比特位置为:12-22,32-38,52-63。
因此,我们通过一个正确对,在明文中改变上述的中性比特,所获得的 2 30 2^{30} 230对以相当接近概率1满足3轮迭代差分。但是由于改变了明文比特,在9-16和17-24轮加密中,仍然根据扩散的影响对最终输出差分值产生影响,因此,使用中性比特后的 2 30 2^{30} 230个明文,消除了前8轮的差分概率,保留后面的差分概率( 2 16 2^{16} 216)。
我们取25个中性比特,生成明文,根据概率,我们可以获得 2 25 × 2 − 16 = 2 9 2^{25}\times2^{-16}=2^9 225×2−16=29个正确对
Step3:猜测 K 1 K_1 K1的一部分,并且恢复 S 4 , S 5 S_4,S_5 S4,S5
已有条件如下:
- 有 2 8 = 256 2^8=256 28=256个正确对,明文已知,对应密文已知,所使用的相关密钥已知。
- 猜测的 K 1 K_1 K1的低24比特(对应 S 0 − S 5 S_0-S_5 S0−S5)
可扩展条件如下:
- 在猜测密钥的条件下,已知 D 3 D_3 D3的低24比特值,也即 S 0 − S 5 S_0-S_5 S0−S5的输入值;
- 已知密文左半边的所有比特值,和 D 1 D_1 D1中部分确定的比特值,可以计算得到 D 4 D_4 D4中部分比特位的差分值,这些比特位为:0-6,11-31位置差分值已知;
- 上述已知差分比特位有循环移位11后,已知位置为0-20,21-27。
综上已知条件可知,我们可以知道 S 0 − S 6 S_0-S_6 S0−S6的输出差分值,知道 S 0 − S 5 S_0-S_5 S0−S5的输入值。下面介绍如何利用上述已有的条件进行 S 4 , S 5 S_4,S_5 S4,S5的恢复。
算法思路的描述:
(1)首先假设S(0)=0;
(2)先把所有的S盒输出值定为-1;
(3)检查所有的数据中,若输入对中存在一个0输入(此时输入对可以表示为(0,x)),则将S盒的输出值定为输入对S(x)的差分值 d i d_i di;
(4)检查所有对中是否存在(x,y)形式的对,根据下述公式:
S ( x ) ⊕ S ( y ) = d k → S ( y ) = S ( x ) ⊕ d k → S ( y ) = d i ⊕ d k S(x) \oplus\ S(y) = d_k \rightarrow S(y)=S(x) \oplus d_k \rightarrow S(y)=d_i \oplus d_k S(x)⊕ S(y)=dk→S(y)=S(x)⊕dk→S(y)=di⊕dk
(5)如果出现了差分值冲突,则说明算法失败。
仅对 S 4 , S 5 S_4,S_5 S4,S5进行密钥恢复是为了减少猜测密钥量。
Step4:排除错误的子密钥猜测
在上一步骤中,我们首先猜测了密钥,根据猜测密钥的值对 S 4 , S 5 S_4,S_5 S4,S5进行密钥恢复,但当所猜测的密钥是错误的,则S盒恢复算法无法正确运行,因为这些密钥猜测导致S盒的值之间存在矛盾。
为了进一步减少可能的子密钥猜测的数量,提出另外三个子密钥过滤步骤。
(1)限制 K 1 [ 0 , . . . , 15 ] K_1[0,...,15] K1[0,...,15]这16比特的值的一个范围:
首先我们在已有正确对的集合中(满足 ( ? ? U 00 V ? ? x , Z ? ? ? W 00 0 x ) \left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? ? W 000_{x}\right) (??U00 V??x,Z???W000x))找到进一步满足差分条件 ( ? ? U 00 V ? ? x , Z ? ? 0 W 00 0 x ) \left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? 0 W 000_{x}\right) (??U00 V??x,Z??0W000x)的密文对,其中变化为密文对差分值的[16-19]位为0000。
已知密文对差分满足的等式: C i ⊕ C i ′ = ( ? ? U 00 V ? ? x , Z ? ? ? W 00 0 x ) C_i \oplus C_i' = \left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? ? W 000_{x}\right) Ci⊕Ci′=(??U00 V??x,Z???W000x),在密文对的16-19比特,差分值为0,观察这4比特的走势,他们经过轮密钥加后作为 S 4 S_4 S4的输入进行S盒操作,操作后进行左循环移位11位到27-30比特,27-30比特差分值满足下列等式:
D 4 [ 27 , 28 , 29 , 30 ] ⊕ D 1 [ 27 , 28 , 29 , 30 ] = C i [ 59 , 60 , 61 , 62 ] ⊕ C i ′ [ 59 , 60 , 61 , 62 ] D_4[27,28,29,30] \oplus D_1[27,28,29,30] = C_i[59,60,61,62] \oplus C_i'[59,60,61,62] D4[27,28,29,30]⊕D1[27,28,29,30]=Ci[59,60,61,62]⊕Ci′[59,60,61,62]
其中 C i ⊕ C i ′ [ 59 , 60 , 61 , 62 ] = 0000 C_i \oplus C_i'[59,60,61,62]=0000 Ci⊕Ci′[59,60,61,62]=0000, D 1 [ 27 , 28 , 29 , 30 ] = 0000 D_1[27,28,29,30]=0000 D1[27,28,29,30]=0000,故 D 4 [ 27 , 28 , 29 , 30 ] = 0000 D_4[27,28,29,30]=0000 D4[27,28,29,30]=0000,故 C i ⊞ K 1 [ 16 , 17 , 18 , 19 ] = C i ′ ⊞ K 1 [ 16 , 17 , 18 , 19 ] C_i \boxplus K_1[16,17,18,19] = C_i' \boxplus K_1[16,17,18,19] Ci⊞K1[16,17,18,19]=Ci′⊞K1[16,17,18,19]。因 C i [ 16 , 17 , 18 , 19 ] = C i ′ [ 16 , 17 , 18 , 19 ] C_i[16,17,18,19] = C_i'[16,17,18,19] Ci[16,17,18,19]=Ci′[16,17,18,19],故决定上述等式能否满足的关键在于两个密文前16比特在与 K 1 K_1 K1进行加时是否产生了进位,故猜测的 K 1 K_1 K1需保证与两个密文前16比特进行加操作时同时进位或同时不进位。从而缩小了 K 1 K_1 K1猜测的范围。
(2)限制 K 1 [ 0 , . . . , 19 ] K_1[0,...,19] K1[0,...,19]这20比特的值的一个范围:
同理,如果我们能够进一步找到一个满足差分条件 ( ? ? U 00 V ? ? x , Z ? 0 ? W 00 0 x ) \left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? 0 ? W 000_{x}\right) (??U00 V??x,Z?0?W000x)的密文对,其中变化为密文对差分值的[20-23]位为0000。则可以运用上述思想,再次限制 K 1 [ 0 , . . . , 19 ] K_1[0,...,19] K1[0,...,19]这19比特的值的一个范围。
(3)限制 K 1 [ 0 , . . . , 23 ] K_1[0,...,23] K1[0,...,23]这24比特的值的一个范围:
同理,如果我们能够进一步找到一个满足差分条件 ( ? ? U 00 V ? ? x , Z 0 ? ? W 00 0 x ) \left(? ? U 00 \mathrm{~V} ? ?_{x}, Z 0 ? ? W 000_{x}\right) (??U00 V??x,Z0??W000x)的密文对,其中变化为密文对差分值的[24-27]位为0000。则可以运用上述思想,再次限制 K 1 [ 0 , . . . , 23 ] K_1[0,...,23] K1[0,...,23]这24比特的值的一个范围。
综上我们根据(1)先排除 K 1 [ 0 − 15 ] K_1[0-15] K1[0−15]的一些情况,随后根据(2)排除 K 1 [ 0 − 19 ] K_1[0-19] K1[0−19]的一些情况,最后根据(3)排除 K 1 [ 0 − 23 ] K_1[0-23] K1[0−23]的一些情况。对于剩下的 K 1 K_1 K1的可能值,我们使用Step3进行密钥恢复和S盒猜测算法。
通过实际的实验验证Step4的有效性:在100次实验中,对 K 1 [ 0 − 23 ] K_1[0-23] K1[0−23]的 2 24 2^{24} 224种可能值,约 2 14.2 2^{14.2} 214.2种情况可以通过Step4的三次过滤,其中的 2 7.8 2^{7.8} 27.8可以通过算法1的附加过滤,使用此 2 7.8 2^{7.8} 27.8进行 S 4 , S 5 S_4,S_5 S4,S5的恢复。
进一步恢复 K 1 K_1 K1的某些比特,并且恢复两个额外的S盒 S 1 , S 2 S_1,S_2 S1,S2,方法类同恢复 S 4 , S 5 S_4,S_5 S4,S5,故不详细推导,只做简要描述。
因为恢复S盒的位置不同,上述使用的差分或推导的比特位置不能表述 S 1 , S 2 S_1,S_2 S1,S2的信息特征,故我们仍需寻找新的迭代差分路径,以确定对应 S 1 , S 2 S_1,S_2 S1,S2输入输出比特位置信息。因此,在这一阶段我们采取从特定S盒( S 1 , S 2 S_1,S_2 S1,S2)出发的角度,反向推导迭代差分路径在引入密钥差分时所需满足的条件,而不是恢复 S 4 , S 5 S_4,S_5 S4,S5时从性质最好的迭代差分路径出发。
先推导一个聚合的3轮迭代差分路径:
定义对一个S盒聚合多条差分路径的概率,对于一个S盒的4比特输入对,我们假定输入对差分是满足存在一个且仅1个连续的1序列,可以用如下的式子表示输入差分连续1的情况:
-
输入差分形式: 2 i + 2 i + 1 + . . . + 2 i + l − 1 ( i ∈ { 0 , 1 , 2 , 3 } , l ∈ { 1 , . . . , 4 − i } ) 2^i + 2^{i+1} + ... + 2^{i+l-1} (i \in \left\{ 0,1,2,3 \right\},l \in \left\{ 1,...,4-i \right\}) 2i+2i+1+...+2i+l−1(i∈{0,1,2,3},l∈{1,...,4−i})
-
输出差分形式: 2 j + 2 j + 1 + . . . + 2 j + b − 1 ( j ∈ { 0 , 1 , 2 , 3 } , b ∈ { 1 , . . . , 4 − i } ) 2^j + 2^{j+1} + ... + 2^{j+b-1} (j \in \left\{ 0,1,2,3 \right\},b \in \left\{ 1,...,4-i \right\}) 2j+2j+1+...+2j+b−1(j∈{0,1,2,3},b∈{1,...,4−i})
输入差分和输出差分皆为连续的1情况。这个输入输出差分路径概率取决于差分分布表中 2 i + 2 i + 1 + . . . + 2 i + l − 1 → 2 j + 2 j + 1 + . . . + 2 j + b − 1 2^i + 2^{i+1} + ... + 2^{i+l-1} \rightarrow 2^j + 2^{j+1} + ... + 2^{j+b-1} 2i+2i+1+...+2i+l−1→2j+2j+1+...+2j+b−1的概率。
设定相关密钥差分如下: ( Ω K 1 i = e 16 + i , Ω K 2 i = e 27 + j , Ω K 3 i = e 16 + i , 0 , 0 , 0 , 0 , 0 ) (\Omega_{K_1}^i=e_{16+i},\Omega_{K_2}^i=e_{27+j},\Omega_{K_3}^i=e_{16+i},0,0,0,0,0) (ΩK1i=e16+i,ΩK2i=e27+j,ΩK3i=e16+i,0,0,0,0,0)。
可以得到如下3轮迭代差分路径:
(
0
,
0
)
⟶
2
−
ℓ
⋅
D
D
T
S
4
[
(
i
.
.
i
+
l
−
1
)
]
[
(
j
.
.
j
+
b
−
1
)
]
Ω
K
1
i
=
e
16
+
i
(
0
,
e
27
+
j
,
27
+
j
+
1
,
…
,
27
+
j
+
b
−
1
)
(0,0) \underset{\Omega_{K_{1}}^{i}=e_{16+i}}{\stackrel{2^{-\ell} \cdot DDT_{S_{4}} [(i . . i+ l-1)] [(j . . j+b-1)] }{\longrightarrow}}\left(0, e_{27+j, 27+j+1, \ldots, 27+j+b-1}\right)
(0,0)ΩK1i=e16+i⟶2−ℓ⋅DDTS4[(i..i+l−1)][(j..j+b−1)](0,e27+j,27+j+1,…,27+j+b−1)
⟶ 2 − b Ω K 2 j = e 27 + j ( e 27 + j , 27 + j + 1 , … , 27 + j + b − 1 , 0 ) ⟶ 2 − ℓ ⋅ DDT S 4 [ ( i . . i + ℓ − 1 ) ] [ ( j . . j + b − 1 ) ] Ω K 3 i = e 16 + i ( 0 , 0 ) , \underset{\Omega_{K_{2}}^{j}=e_{27+j}}{\stackrel{2^{-b}}{\longrightarrow}}\left(e_{27+j, 27+j+1, \ldots, 27+j+b-1}, 0\right) \underset{\Omega_{K_{3}}^{i}=e_{16+i}}{\stackrel{2^{-\ell} \cdot \operatorname{DDT}_{S_{4}}[(i . . i+\ell-1)][(j . . j+b-1)] }{\longrightarrow}} (0,0), ΩK2j=e27+j⟶2−b(e27+j,27+j+1,…,27+j+b−1,0)ΩK3i=e16+i⟶2−ℓ⋅DDTS4[(i..i+ℓ−1)][(j..j+b−1)](0,0),
由连续的1转换到连续的1
where D D T S 4 [ ( i . . i + l − 1 ) ] [ ( j . . j + b − 1 ) ] DDT_{S_{4}} [(i . . i+l -1)] [(j . . j+b-1)] DDTS4[(i..i+l−1)][(j..j+b−1)]denotes the probability of the transition
( 2 i + 2 i + 1 + … + 2 i + ℓ − 1 ) ⟶ S 4 ( 2 j + 2 j + 1 + … + 2 j + b − 1 ) \left(2^{i}+2^{i+1}+\ldots+2^{i+\ell-1}\right) \underset{S_{4}}{\longrightarrow}\left(2^{j}+2^{j+1}+\ldots+2^{j+b-1}\right) (2i+2i+1+…+2i+ℓ−1)S4⟶(2j+2j+1+…+2j+b−1)
解释:
-
第一轮是在子密钥第16位引入一个比特的差分值,导致了l位进位从而导致l位连续1的状态差分( l ≤ 4 l \le 4 l≤4需满足,连续1限制在一个S盒的输入中),连续l进位的概率为 2 − l 2^{-l} 2−l;
-
经S盒,连续差分到另一个连续差分的概率由此S盒的差分分布表决定, 2 i + 2 i + 1 + . . . + 2 i + l − 1 → 2 j + 2 j + 1 + . . . + 2 j + b − 1 2^i + 2^{i+1} + ... + 2^{i+l-1} \rightarrow 2^j + 2^{j+1} + ... + 2^{j+b-1} 2i+2i+1+...+2i+l−1→2j+2j+1+...+2j+b−1,将其概率表示为: DDT S 4 [ ( i . . i + ℓ − 1 ) ] [ ( j . . j + b − 1 ) ] \operatorname{DDT}_{S_{4}}[(i . . i+\ell-1)][(j . . j+b-1)] DDTS4[(i..i+ℓ−1)][(j..j+b−1)];
-
经过循环移位后,第一轮输出的差分形式为: ( 0 , e 27 + j , 27 + j + 1 , … , 27 + j + b − 1 ) \left(0, e_{27+j, 27+j+1, \ldots, 27+j+b-1}\right) (0,e27+j,27+j+1,…,27+j+b−1)
-
第二轮的目的是引入特定的密钥差分抵消输入差分,故引入对的密钥差分为 Ω K 2 j = e 27 + j \Omega_{K_{2}}^{j}=e_{27+j} ΩK2j=e27+j,可以通过进位抵消连续b位的1差分,此概率为连续b次进位概率: 2 − b 2^{-b} 2−b,抵消后第二轮输出差分为$\left(e_{27+j, 27+j+1, \ldots, 27+j+b-1}, 0\right) $;
-
第三轮的目的是通过引入特定密钥差分值,将0输入差分经过密钥加,S盒,循环移位后转化为 e 27 + j , 27 + j + 1 , … , 27 + j + b − 1 e_{27+j, 27+j+1, \ldots, 27+j+b-1} e27+j,27+j+1,…,27+j+b−1,从而抵消输入左支差分。方法类似第一步,故不详细阐述。
上述3轮迭代差分刻画了一类高概率的迭代差分路径,我们将这一类差分路径(i,j位置均确定的情况下,遍历l,b)的概率刻画如下:
p i , j = ∑ b = 1 4 − j 2 − b ( ∑ ℓ = 1 4 − i 2 − ℓ DDT S 4 [ ( i . . i + ℓ − 1 ) ] [ ( j . . j + b − 1 ) ] ) 2 . p_{i, j}=\sum_{b=1}^{4-j} 2^{-b}\left(\sum_{\ell=1}^{4-i} 2^{-\ell} \operatorname{DDT}_{S_{4}}[(i . . i+\ell-1)][(j . . j+b-1)]\right)^{2} . pi,j=∑b=14−j2−b(∑ℓ=14−i2−ℓDDTS4[(i..i+ℓ−1)][(j..j+b−1)])2.
因此概率计算中DDT为 S 4 S_4 S4的差分分布表,我们前提条件是第一步的密钥恢复中已经成功恢复了 S 4 S_4 S4,因此,我们可以计算此概率公式下最大值的i,j值,从而确定获得3轮迭代差分路径最大概率所对应使用的相关密钥值: ( Ω K 1 i = e 16 + i , Ω K 2 i = e 27 + j , Ω K 3 i = e 16 + i , 0 , 0 , 0 , 0 , 0 ) (\Omega_{K_1}^i=e_{16+i},\Omega_{K_2}^i=e_{27+j},\Omega_{K_3}^i=e_{16+i},0,0,0,0,0) (ΩK1i=e16+i,ΩK2i=e27+j,ΩK3i=e16+i,0,0,0,0,0)。
为了大致确定 p i , j p_{i,j} pi,j的最大概率值,我们使用随机S盒进行了100次模拟实验,获得了100次最大概率值,其平均值约为 2 − 6 2^{-6} 2−6,但是在其中的99次,这个概率值均大于 2 − 7.3 2^{-7.3} 2−7.3,于是我们可以设定 p i , j ≥ 2 − 7.3 p_{i,j}\ge 2^{-7.3} pi,j≥2−7.3作为大致计算全轮迭代差分的3轮迭代差分的概率。
综上我们可以得到一个29轮相关密钥差分路径的概率: ( 0 , 0 ) ⟶ p i , j 3 ≥ 2 − 22 Ω K ( 0 , 0 ) (0,0) \underset{\Omega_{K}^{}}{\stackrel{p_{i,j}^3\ge 2^{-22}}{\longrightarrow}}(0,0) (0,0)ΩK⟶pi,j3≥2−22(0,0)
在差分路径的最后三轮,我们同样推导截断差分路径作为实际应用,具体推导过程类似上文,故不详细推导。
最终差分路径为: ( 0 , 0 ) ⟶ p i , j 3 ≥ 2 − 22 Ω K ( ? ? ? ? ? U 0 V , 0000 Z ? ? W ) , V / Z ∈ { 0 , . . . , 7 } , U / Y ∈ { 0 , 8 } (0,0) \underset{\Omega_{K}^{}}{\stackrel{p_{i,j}^3\ge 2^{-22}}{\longrightarrow}}(?????U0V,0000Z??W), V/Z\in \left\{ 0,...,7 \right\}, U/Y \in \left\{ 0,8 \right\} (0,0)ΩK⟶pi,j3≥2−22(?????U0V,0000Z??W),V/Z∈{0,...,7},U/Y∈{0,8}
具体恢复S盒和过滤密钥的过程与上文类似,理解上文后,请根据原文自行推导一遍。
所示用的相关密钥差分: ( Ω K 1 i = e 8 + i , Ω K 2 i = e 19 + j , Ω K 3 i = e 8 + i , 0 , 0 , 0 , 0 , 0 ) (\Omega_{K_1}^i=e_{8+i},\Omega_{K_2}^i=e_{19+j},\Omega_{K_3}^i=e_{8+i},0,0,0,0,0) (ΩK1i=e8+i,ΩK2i=e19+j,ΩK3i=e8+i,0,0,0,0,0)。
对应的3轮迭代差分概率(使用 S 2 S_2 S2的差分分布表):
p i , j = ∑ b = 1 4 − j 2 − b ( ∑ ℓ = 1 4 − i 2 − ℓ DDT S 2 [ ( i . . i + ℓ − 1 ) ] [ ( j . . j + b − 1 ) ] ) 2 . p_{i, j}=\sum_{b=1}^{4-j} 2^{-b}\left(\sum_{\ell=1}^{4-i} 2^{-\ell} \operatorname{DDT}_{S_{2}}[(i . . i+\ell-1)][(j . . j+b-1)]\right)^{2} . pi,j=∑b=14−j2−b(∑ℓ=14−i2−ℓDDTS2[(i..i+ℓ−1)][(j..j+b−1)])2.
对应的差分路径:
( 0 , 0 ) ⟶ p i , j 3 ≥ 2 − 22 Ω K 3 ( 0 V ? ? ? ? ? U , ? W 0000 Z ? ) , V / Z ∈ { 0 , . . . , 7 } , U / Y ∈ { 0 , 8 } (0,0) \underset{\Omega_{K_3}^{}}{\stackrel{p_{i,j}^3\ge 2^{-22}}{\longrightarrow}}(0V?????U,?W0000Z?), V/Z\in \left\{ 0,...,7 \right\}, U/Y \in \left\{ 0,8 \right\} (0,0)ΩK3⟶pi,j3≥2−22(0V?????U,?W0000Z?),V/Z∈{0,...,7},U/Y∈{0,8}
具体恢复S盒和过滤密钥的过程与上文类似,理解上文后,请根据原文自行推导一遍。
综上三个恢复S盒与密钥的步骤,我们可以恢复 S 1 , S 2 , S 4 , S 5 , S 7 S_1,S_2,S_4,S_5,S_7 S1,S2,S4,S5,S7,并在恢复S盒的过程中,逐步对 K 1 K_1 K1进行正确的筛选操作,根据文章的实际实验,仅剩下 K 1 K_1 K1的 2 4.1 2^{4.1} 24.1种可能值。
- Step 1: 恢复剩余的S盒
首先我们列出三次恢复S盒时所选择的不同差分路径,以便参考:
Stage 1: ( 0 , 0 ) ⟶ p ˉ ≥ 2 − 24 Ω K 1 i ( ? ? U 00 V ? ? x , Z ? ? ? W 00 0 x ) , V / Z ∈ { 0 , . . . , 7 } , U / W ∈ { 0 , 8 } (0,0) \underset{\Omega_{K_1}^{i}}{\stackrel{\bar{p} \geq 2^{-24}}{\longrightarrow}}\left(? ? U 00 \mathrm{~V} ? ?_{x}, Z ? ? ? W 000_{x}\right), V/Z\in \left\{ 0,...,7 \right\}, U/W \in \left\{ 0,8 \right\} (0,0)ΩK1i⟶pˉ≥2−24(??U00 V??x,Z???W000x),V/Z∈{0,...,7},U/W∈{0,8}
Stage 2: ( 0 , 0 ) ⟶ p i , j 3 ≥ 2 − 22 Ω K 2 ( ? ? ? ? ? U 0 V , 0000 Z ? ? W ) , V / Z ∈ { 0 , . . . , 7 } , U / W ∈ { 0 , 8 } (0,0) \underset{\Omega_{K_2}^{}}{\stackrel{p_{i,j}^3\ge 2^{-22}}{\longrightarrow}}(?????U0V,0000Z??W), V/Z\in \left\{ 0,...,7 \right\}, U/W \in \left\{ 0,8 \right\} (0,0)ΩK2⟶pi,j3≥2−22(?????U0V,0000Z??W),V/Z∈{0,...,7},U/W∈{0,8}
Stage 3: ( 0 , 0 ) ⟶ p i , j 3 ≥ 2 − 22 Ω K 3 ( 0 V ? ? ? ? ? U , ? W 0000 Z ? ) , V / Z ∈ { 0 , . . . , 7 } , U / W ∈ { 0 , 8 } (0,0) \underset{\Omega_{K_3}^{}}{\stackrel{p_{i,j}^3\ge 2^{-22}}{\longrightarrow}}(0V?????U,?W0000Z?), V/Z\in \left\{ 0,...,7 \right\}, U/W \in \left\{ 0,8 \right\} (0,0)ΩK3⟶pi,j3≥2−22(0V?????U,?W0000Z?),V/Z∈{0,...,7},U/W∈{0,8}
(1)恢复 S 3 S_3 S3
使用Stage1和Stage2所获得的密文对数据,他们最后三轮截断差分的 D 1 D_1 D1值分别为: 00000 X Y 0 00000XY0 00000XY0和 ? Y 00000 X ?Y00000X ?Y00000X, X ∈ { 0 , . . . , 7 } , Y ∈ { 0 , 8 } X\in\left\{0,...,7 \right\},Y\in\left\{0,8 \right\} X∈{0,...,7},Y∈{0,8}。
故 S 3 S_3 S3的输出比特位置 [ 12 , 13 , 14 , 15 ] [12,13,14,15] [12,13,14,15],循环移位后 [ 23 , 24 , 25 , 26 ] [23,24,25,26] [23,24,25,26],对应两个步骤中的 D 1 [ 23 , 24 , 25 , 26 ] = [ 0 , 0 , 0 , 0 ] D_1[23,24,25,26]=[0,0,0,0] D1[23,24,25,26]=[0,0,0,0]均成立,故若密钥与 S 3 S_3 S3均正确的前提下, S 3 S_3 S3的输出比特位置 [ 12 , 13 , 14 , 15 ] [12,13,14,15] [12,13,14,15]的差分值 = C j ⊕ C j ′ [ 23 + 32 = 55 , 56 , 57 , 58 ] =C_j\oplus C_j'[23+32=55,56,57,58] =Cj⊕Cj′[23+32=55,56,57,58]。因此可以利用此等式执行算法1恢复 S 3 S_3 S3,进一步筛选错误密钥。
(2)恢复 S 6 S_6 S6
使用Stage1和Stage3所获得的密文对数据,他们最后三轮截断差分的 D 1 D_1 D1值分别为: 00000 X Y 0 00000XY0 00000XY0和 00 X Y 0000 00XY0000 00XY0000, X ∈ { 0 , . . . , 7 } , Y ∈ { 0 , 8 } X\in\left\{0,...,7 \right\},Y\in\left\{0,8 \right\} X∈{0,...,7},Y∈{0,8}。
故 S 6 S_6 S6的输出比特位置 [ 24 , 25 , 26 , 27 ] [24,25,26,27] [24,25,26,27],循环移位后 [ 3 , 4 , 5 , 6 ] [3,4,5,6] [3,4,5,6],对应两个步骤中的 D 1 [ 3 , 4 , 5 , 6 ] = [ 0 , 0 , 0 , 0 ] D_1[3,4,5,6]=[0,0,0,0] D1[3,4,5,6]=[0,0,0,0]均成立,故若密钥与 S 6 S_6 S6均正确的前提下, S 6 S_6 S6的输出比特位置 [ 24 , 25 , 26 , 27 ] [24,25,26,27] [24,25,26,27]的差分值 = C j ⊕ C j ′ [ 3 + 32 = 35 , 36 , 37 , 38 ] =C_j\oplus C_j'[3+32=35,36,37,38] =Cj⊕Cj′[3+32=35,36,37,38]。因此可以利用此等式执行算法1恢复 S 6 S_6 S6,进一步筛选错误密钥。
(3)恢复 S 0 S_0 S0
使用Stage2和Stage3所获得的密文对数据,他们最后三轮截断差分的 D 1 D_1 D1值分别为: ? Y 00000 X ?Y00000X ?Y00000X和 00 X Y 0000 00XY0000 00XY0000, X ∈ { 0 , . . . , 7 } , Y ∈ { 0 , 8 } X\in\left\{0,...,7 \right\},Y\in\left\{0,8 \right\} X∈{0,...,7},Y∈{0,8}。
故 S 0 S_0 S0的输出比特位置 [ 0 , 1 , 2 , 3 ] [0,1,2,3] [0,1,2,3],循环移位后 [ 11 , 12 , 13 , 14 ] [11,12,13,14] [11,12,13,14],对应两个步骤中的 D 1 [ 11 , 12 , 13 , 14 ] = [ 0 , 0 , 0 , 0 ] D_1[11,12,13,14]=[0,0,0,0] D1[11,12,13,14]=[0,0,0,0]均成立,故若密钥与 S 0 S_0 S0均正确的前提下, S 0 S_0 S0的输出比特位置 [ 0 , 1 , 2 , 3 ] [0,1,2,3] [0,1,2,3]的差分值 = C j ⊕ C j ′ [ 11 + 32 = 43 , 44 , 45 , 46 ] =C_j\oplus C_j'[11+32=43,44,45,46] =Cj⊕Cj′[11+32=43,44,45,46]。因此可以利用此等式执行算法1恢复 S 0 S_0 S0,进一步筛选错误密钥。
- Step2:完全恢复S盒,将 K 1 K_1 K1的具有众多候选值部分进一步缩小范围
在恢复某一个特定的S盒,没有对其产生影响的密钥比特就不同在恢复此S盒时进行候选值的筛选,这些密钥比特主要是最后一个S盒输入对应的比特位置 [ 28 , 29 , 30 , 31 ] [28,29,30,31] [28,29,30,31],因此,我们可以对其进行猜测,从而利用倒数第二轮差分信息进一步筛选候补密钥值, K 1 K_1 K1的最高4位 [ 28 , 19 , 30 , 31 ] [28,19,30,31] [28,19,30,31],并没有实施足够的筛选实验,因此我们使用倒数第二轮进行进一步的密钥恢复。
在State1差分条件下,31轮的轮函数的输入差分为 D 1 = 00000 X Y 0 D_1=00000XY0 D1=00000XY0,猜测 K 2 [ 0 − 11 ] K_2[0-11] K2[0−11],由于在 S 1 , S 2 S_1,S_2 S1,S2输入比特位置有差分存在,可以利用差分信息对猜测密钥进行筛选,两个S盒对应输出差分 = C j ⊕ C j ′ [ 15 − 22 ] =C_j \oplus C_j'[15-22] =Cj⊕Cj′[15−22]。使用已知的 S 1 , S 2 S_1,S_2 S1,S2对猜测的候选密钥进行过滤,并且,可以将上述筛选按照S盒对应的比特位置分为两个阶段
同理,在State3差分条件下,31轮的轮函数的输入差分为 D 1 = 00 X Y 0000 D_1=00XY0000 D1=00XY0000,在 S 4 , S 5 S_4,S_5 S4,S5输入比特位置有差分存在,按上述步骤进行密钥筛选。
同理,在State2差分条件下,31轮的轮函数的输入差分为 D 1 = ? Y 00000 X ,在 D_1=?Y00000X,在 D1=?Y00000X,在S_6,S_7$输入比特位置有差分存在,按上述步骤进行密钥筛选。
- Step3:对剩下的候选密钥值进行最后筛选
可以使用倒数第三轮的轮函数继续对剩余密钥候选集进行筛选,同Step2分为三步骤,详细请通过原文献进行理解。
7. 文章实验验证结果展示
100次实验,每次重新设定随机的主密钥和S盒。