AES算法的积分分析
积分攻击 (Integral Attack)
积分攻击是一种针对分组密码的密码分析技术,通常用来恢复密码算法的部分密钥。它由Lars Knudsen于1997年提出,主要用于分析Square密码(因此有时也称为"Square攻击"),后来被应用于Rijndael(AES)等其他密码算法。积分攻击是一种选择明文攻击方法,它是继差分密码分析和线性密码分析后,密码学界公认的最有效的密码分析方法之一。这种攻击方法更多地与算法的结构有关,而与算法部件的具体取值关系不大,适用于每一个模块均为双射的分组密码。这一攻击方法对大多以字节为变换单位的减轮密码是有效的。该方法被提出后,已经成功对AES、Camellia和FOX等著名密码进行了不同程度的攻击。
基本概念
积分攻击的核心思想是:
- 选择一组明文,这些明文在某些比特位置上是固定的,在其他比特位置上遍历所有可能值。
- 通过追踪这些明文通过密码算法加密后密文的某些比特的异或和(积分)。
- 利用积分性质(如平衡性)来恢复密钥信息。
攻击步骤
- 选择明文集:选择2^d个明文,其中d个比特位置取所有可能值,其余位置固定。
- 加密过程:获取这些明文的密文。
- 积分计算:计算密文某些比特的异或和。
- 密钥恢复:利用积分性质推断轮密钥的部分信息。
积分分析中涉及到的3个字节集:
(1)活跃字节集(A):在相同位置的字节Ai取遍(0,…,255)这256个不同值,且取每个不同值的次数相同,其中i=(0,…,255)。
(2)平衡字节集(B):在相同位置的字节Bi满足异或和等于0,即B0⊕…⊕B255=0。
(3)常量字节集(C):在相同位置的256个字节Ci取值保持不变的字节,即B0=…=B255=C。
Ⅴ结构
考虑AES算法的一个结构Ⅴ,Ⅴ有256个状态,每个状态对应于AES算法状态矩阵的16个字节,如果其中Ⅴ[j](Ⅴ的第j个状态)的第1个字节为活跃字节集A,其余的15个字节为常量字节C,那么经过3轮加密后,输出的状态中的16个字节全部为平衡字节B。
3轮AES算法积分区分器的推导(如上图所示):
(1)第一轮
第1轮的输入状态的第1个字节为活跃字节A,经过SubByte变换后仍为活跃字节A,又经过ShiftRow变换后积分性质不变,经过MixColumn变换后状态第1列4个字节都变为活跃字节A,经过AddKey变换后积分性质不变不变。
(2)第二轮
第2轮的输入状态的第1列的4个字节都为活跃字节A,经过SubByte变换后仍为活跃字节A,又经过ShiftRow变换后活跃字节的位置发生变化,经过MixColumn变换后状态矩阵中的所有16字节全部变为活跃字节集A,经过AddKey变换后积分性质不变。
(3)第三轮
第3轮的输入状态的16字节状态全部为活跃字节A,经过SubByte变换后积分性质不变,又经过ShiftRow变换后活跃字节的位置发生变化,经过MixColumn变换后16字节状态全变为平衡字节B,经过AddKey变换后差分性质不变。
记第三轮加密变换的行移位之后的状态矩阵为X=x0||…||x15,那么第三轮加密变换的列混合之后的状态矩阵为Y=y0||…||y15。则Y可以表示成关于X的表达式:
我们对y0进行求异或和,则得:
所以y0为平衡字节B,同理可证其它的15个字节也都是平衡字节B。不过在第四轮加密中的SubByte变换会破坏这一性质,故AES算法的积分区分器最长为3轮。
以上我们证明了在输入的明文数据只有1个活跃字节,其它字节全部为常量的情况下,AES算法三轮加密后的状态矩阵的全部16个字节都为平衡字节,即异或和为0。因为在随机的情况下,加密过程中间状态的异或和为字节(有0到255等256种取值),每种取值的概率都是一样的,所以三轮的积分区分器可以将AES算法与随机置换相互区分,而且我们可以以此区分器来恢复约减为4轮的AES算法的轮密钥。
密钥恢复
(1)选择一个Ⅴ结构,使得Ⅴ[j](Ⅴ的第j个状态)的第1个字节为活跃字节集A,其余的15个字节为常量字节C,对此Ⅴ结构加密4轮(我们假设AES算法只有4轮,且最后一轮没有列混合变换),密文记为C。我们记第4轮的轮密钥为RK4(128比特),则RK4[i]表示第i个密钥字节。
(2)记第4轮的输入状态为P3,则经过SubByte变换后的状态记为Q3=SubByte(P3), 经过ShiftRow变换后的状态记为R3=ShiftRow (Q3),经过AddKey变换后的状态记为C=AddKey (R3)。我们记gk=RK4[0],我们猜测gk的值,对C进行部分解密。容易证明P3[0]= SubByte-1(C[0]⊕gk)=SBOX-1(C[0]⊕gk),如上图所示,C[0]=U0。因为P3[0]为平衡字节,故其异或和等于0,如果我们猜测的gk值满足此条件,则gk可能为正确的密钥;如果猜测的gk值不满足此条件,则说明此gk为错误的密钥,可以排除。
(3)如果步骤(2)中剩下的密钥值不唯一,则可以重新选择Ⅴ结构和设置不同的初始值,反复测试,即重复步骤(1)和步骤(2),直至gk值唯一,此唯一值即为正确的密钥值。
总的来说,积分分析通过加密算法结构中的固有的弱点来恢复部分密钥,其属于是选择明文攻击。积分分析与差分分析有些类似,在攻击方式上,差分攻击(Differential Attack)主要是分析明文对的差分传播,积分攻击(Integral Attack)主要是分析明密文的积分性质;在数据需求方面,差分攻击需要大量随机明文对,积分攻击需要特定结构的选择明文;在适用场景方面,差分攻击几乎适用于所有的对称加密算法,积分攻击主要用于分析基于SPN结构和轮函数为双射的分组加密算法。