AES-GCM
badmonkey的博客
AES-GCM是基于AES-CTR模式改编的,不同于CTR的是GCM在对明文进行加密的时候还会产生tag(类似签名的东西),可以有效的抵御选择明文攻击,因为GCM首先会看tag是否合法,然后才决定是否调用decrypt oracle 进行解密。加密的流程在这篇paper讲的很清楚,我把其中的一部分拿了出来(只有两个明文块的情况)
具体的符号定义如下:
其中: H = E n c k ( 0 128 ) H=Enc_k(0^{128}) H=Enck(0128)
经过多次的 G m u l H ( X ) Gmul_H(X) GmulH(X),最后将结果和处理后的密文C和填充的信息A异或得到T即tag。需要注意的是nonce是不能重复使用的,否则会造成H的泄露,进而伪造tag,接着应该就可以利用oracle的点了(口胡,原文只是说了TLS相关的东西)。
Forbidden Attack
利用重复使用的nonce所生成的T和C,求解H,伪造新的tag。
每次的X都是根据上一次的X计算得到的,具体的关系如下
最终的X可以表示为:
X m + n = A 1 H m + n + A 2 m + n − 1 + ⋯ + A m H n + 1 + C 1 H n + C 2 H n − 1 + ⋯ + C n H X_{m+n}=A_1H^{m+n}+A_2^{m+n-1}+ \cdots +A_mH^{n+1}+C_1H^n+C_2H^{n-1}+\cdots +C_nH Xm+n=A1Hm+n+A2m+n−1+⋯+AmHn+1+C1H