BlockCipher5
huangx607087学习分组密码的笔记5
0.About
上一篇我们讲到了DES的差分攻击,这一次就讲一下AES的积分攻击中的比较有名的Square Attack。
5. AES的Square Attack
5o01 从[DASCTF2024.10] symmetric_cipher 引入Square Attack
这一次我们直接先从题目出发
1 |
|
这个题目给出了 $256$ 组明文及其对应的密文。明文格式均为 $(i,203,203,…,203)$,其中 $i$ 从 $0$ 遍历到 $256$。
回顾一下AES的过程:每一轮分别进行了字节代换、行移位、列混合和轮密钥加 4 步,其中最后一轮没有列混合操作。之所以叫积分积分攻击,可以看下面的图(参考striving师傅的博客):
在上面的图中,对于已知的 $256$ 个密文,白色的部分表示恒定值,绿色部分在 $256$ 个密文中会遍历 $0\sim255$。我们在下面用 $x$ 代表遍历$0\sim255$ 的值,$c$ 代表恒定值,下标 $00\sim33$ 表示在矩阵中的位置。也就是我们初始的结构为:
1 |
|
下面我们来分析图1中产生的效果:
在轮密钥加阶段:因为AES中,对于单个字节 $x_{00} \oplus k_{00}$,由于密钥相同意味着 $k_{00}$ 恒定,因此当 $x_{00}$ 遍历 $0\sim255$ 时,$x_{00}\oplus k_{00}$ 也会遍历 $0\sim255$,而对于不变的 $c_{01}$ 等其他值,异或一个相同的 $k_{01}$,结果依然是恒定的 $c_{01}\oplus k_{00}$(两个数都恒定,当然得到恒定值)。
在字节代换阶段,由于 $S$ 盒的可逆性,因此当 $x_{00}$ 遍历 $0\sim255$ 时,$S(x_{00})$ 也会遍历 $0\sim255$ 。而对于相同的 $c_{01}$ 等其他 $15$ 个字节,由于其不变性,最终也会导致字节代换后,得到的 $S(c_{01})$ 保持不变。
在行移位阶段,由于我们考虑的是 $x_{00}$,而AES中第一行的值不会变动位置,因此 $x_{00}$ 经过行移位还是 $x_{00}$。当然,如果一开始选择下面一行,将 $x_{10}$ 作为遍历值,则 $(x_{10},c_{11},c_{12},c_{13})$ 会变成 $(c_{10}^{(1)},c^{(1)}{11},c^{(1)}{12},x^{(1)}_{13})$。
在列混合阶段,由于涉及到矩阵乘法,因此对于第 $0$ 列的数字而言,有:
由于四个 $d$ 都有 $x$ 的参与,因此第 $0$ 列的所有值由于列混合的存在,这 $4$ 个值在 $256$ 个密文中都会遍历 $0\sim255$。
随后,图1中第二轮和第三轮到列混合前的步骤,经过第一轮的讲解,也就不难理解了。也就是到第三轮列混合前,对应给定的 $256$ 个明文,$16$ 个字节全部都会遍历 $0\sim255$。
但经过第三轮的列混合后,结果出现了变化,此时矩阵中每个数字并不会遍历 $0\sim255$ 的所有值了,也就是随着 $x_{ij}^{(3)}$ 的遍历, $d^{(3)}$ 并不会遍历 $0\sim255$。
但我们将 $d^{(3)}$ (以 $d_{00}^{(3)}$ 为例)的表达式重写一下。由于四个 $x$ 都是会遍历 $0\sim255$ 的,也就是构成一个 $0\sim255$ 的排列,因此下面分别用 $p_i$表示,也就是第 $i$ 组明文中,$x_{00}^{(3)}=p_0(i)$(剩下三个以此类推)
$$
\bigoplus_{i=0}^{255}d_{00}^{(3)}=\bigoplus_{i=0}^{255}(p_{0}(i)\oplus p_1(i)\oplus p_2(i)\oplus p_3(i))=\bigoplus_{i=0}^{255}p_0(i)\oplus\bigoplus_{i=0}^{255}p_1(i)\oplus\bigoplus_{i=0}^{255}p_2(i)\oplus\bigoplus_{i=0}^{255}p_3(i)
$$
因为 $p_0,p_1,p_2,p_3$ 都是 $0\sim255$ 的一个排列,因此
$$
\bigoplus_{i=0}^{255}p_0(i)=\bigoplus_{i=0}^{255}p_1(i)=\bigoplus_{i=0}^{255}p_2(i)=\bigoplus_{i=0}^{255}p_3(i)=\bigoplus_{i=0}^{255}i=0
$$
因此,图1中红色的数据代表的意思就是:不保证这个值会遍历 $0\sim255$,但将 $256$ 组红色部分异或起来,结果仍然为 $0$。
然而在第 4 轮,经过字节代换之后,上面的性质也消失了(红色数据变成了紫色数据)。但由于字节代换、行移位是可逆的;如果猜测轮密钥的单个字节,异或回去、再逆行移位、逆字节代换就可以得到第3轮结果的对应字节;根据前面得到的性质,可以验证该猜测是否正确,如果正确则是一个可能的轮密钥字节。平均情况下,会得到两个可能的密钥字节,最后也会有 $256$ 种情况。枚举一下应该就OK了。
故这个题可以根据这一原理出解:
1 |
|
5o02 另一个例题:0xGame2024 AES
这个题目其实还是AES-Square Attack,只是将 $4\times4$ 的矩阵变成了 $3\times 3$ 的矩阵,然后从 $GF(2^{8},x^8+x^4+x^3+x+1)$ 域中的运算变成了 $GF(3^{5},x^5+x^2+1)$ 上的运算。题目目标是拿到正确的Key,没有询问次数限制和交互时间限制。
1 |
|
一开始交了几次,发现flag老出不出来。结果本地测试后发现,因为这边基数是 $3$,需要区分正负了,最后你记录的可能的轮密钥的值,其实取负后才是真正的轮密钥(基数 $2$ 不区分正负)
1 |
|
可能的运行结果:
1 |
|