MITM variant No.ThreE (All Subkey Recovery)

原始文章: All Subkeys Recovery Attack on Block Ciphers: Extending Meet-in-the-Middle Approach

从经典中间相遇攻击而来,考虑到经典中间相遇攻击的局限性:

  1. 需要子密钥相互独立,不独立情况见 “MITM variant No.TwO (3 subset)” 部分

  2. 由于密钥编排算法的限制,可能无法在仅获得部分子密钥的情况下获取主密钥

ASR 攻击注意针对第 2 个局限进行改进,即试图使用中间相遇的思想来恢复全部子密钥,从而忽略密钥编排算法的影响,如果密钥编排可逆,也可以利用所有子密钥恢复主密钥。

ASR attack

假设分组密码分组长度为 nn ,加密函数为 EE ,有 RR 轮,且每轮使用不同的加密子密钥,子密钥不需要全部独立(但需要有部分独立的情况存在)

MITM stage

  1. 攻击者确定中间碰撞状态 S (sbits)S\ (s-bits) ;这个过程并不能独立后面的步骤,和 K1,K2K_1,K_2 的选取有很大关系

    状态 SS 可以从两个方向计算得来,即 S=F1(P,K1)=F21(C,K2)S=F_{1}(P,K_1) = F_2^{-1}(C,K_2) ,其中 F1,F2F_1,F_2 分别是前向和后向的(部分)加密函数

    但并不是仅有 K1,K2K_1,K_2 就可以从明文加密到密文,还有剩余没有用上的密钥 K3K_3 ,所以有 K(1)+K(2)+K(3)=R\left|\mathcal{K}_{(1)}\right|+\left|\mathcal{K}_{(2)}\right|+\left|\mathcal{K}_{(3)}\right|=R \cdot \ell

    对于此处的 K1,K2K_1,K_2 ,需要能够保证 F1(P,K1)=F21(C,K2)F_{1}(P,K_1) = F_2^{-1}(C,K_2) 的计算是独立的;

  2. min(K1,K2)min(K_1,K_2) 得到的 (P/C,S)(P/C,S) 拿来存表,而另一部分用来做匹配,如果能够在状态 SS 匹配到,即 S=F1(P,K1)=F21(C,K2)S=F_{1}(P,K_1) = F_2^{-1}(C,K_2) ,则将使用的密钥 K1,K2K_1,K_2 加入候选密钥表;

  3. 考虑到并行操作,可以对多个明密文对并行操作进行步骤 2.

Test Stage

同样的,使用不同明密文对测试,但测试的不是是否能够从明文加密到密文,因为整个过程没有考虑 K3K_3 ,而是测试使用不同的明密文能否找到状态 SS 的匹配 ? 是这样吗??

NOTE

  1. 在步骤 2. 有 2s2^{-s} 的概率在状态 SS 匹配到,而总可能密钥数为 2Rl2^{R*l} 所以留下的候选密钥为 2Rls2^{R*l-s} 个,而并行使用 N 个明密文对留下的候选密钥就为 2RlNs2^{R*l-N*s} 个;

  2. 这里可以并行使用的明密文对数量 N 为,需要有一定的限制:

    2RlNs2Rl(K1+K2)2^{R*l-N*s} \leq 2^{R*l-(|K_1|+|K_2|)}N(K1+K2)/sN\leq(|K_1|+|K_2|)/s,如果不满足,则意味着使用 2K1+K22^{|K_1|+|K_2|} 种密钥筛掉了超过大于 2K1+K22^{|K_1|+|K_2|} 个密钥,这是不合理的;

复杂度分析

  • 时间复杂度:选 K1,K2|K_1|,|K_2| 更大的用来做匹配,对 N 个明密文对,就需要 max(2K(1),2K(2))×N\max \left(2^{\left|\mathcal{K}_{(1)}\right|}, 2^{\left|\mathcal{K}_{(2)}\right|}\right) \times N 的计算,而对剩余的密钥 K3K_3 就需要穷举,需要 2RNs2^{R \cdot \ell-N \cdot s} 的计算,所以总时间复杂度为:
Tn=Ccomp=max(2K(1),2K(2))×N+2RNs.T_n = C_{c o m p}=\max \left(2^{\left|\mathcal{K}_{(1)}\right|}, 2^{\left|\mathcal{K}_{(2)}\right|}\right) \times N+2^{R \cdot \ell-N \cdot s} .
  • 空间复杂度:选 K1,K2|K_1|,|K_2| 更小的用来建表,对 N 个明密文对,总空间复杂度为:
Sn=min(2K(1),2K(2))×NS_n = \min \left(2^{\left|\mathcal{K}_{(1)}\right|}, 2^{\left|\mathcal{K}_{(2)}\right|} \mid\right) \times N
  • 数据复杂度:并行 N 个不同的明密文对,在测试阶段,留下密钥 RlNsR*l-N*s bits,因为分组长度为 n ,所以每个新的明密文对可以筛掉 n bits(注意这个过程:PEkCP \rightarrow E_k \rightarrow C ,这里的 k_k 会遍历所有留下的候选密钥,而理论上会有 n 个被筛掉)所以需要进行 (RNs)/n\lceil(R \cdot \ell-N \cdot s) / n\rceil 次筛查,数据复杂度为:
Dn=max(N,(RNs)/n)D_n = \max (N,\lceil(R \cdot \ell-N \cdot s) / n\rceil)