Crypto入门-分组密码初探

基础知识

工作模式

设明文为$P$,密文为$C$,加密算法为$F$,解密算法为$D$。

ECB

电子密码本。

$$
\displaylines{
C_i=E(P_i)\\
P_i=D(C_i)
}
$$

CBC

密码分组链接。

$$
\displaylines{
C_0=IV\cdots C_i=E(P_i\oplus C_{i-1})\\
C_0=IV\cdots P_i=D(C_i)\oplus C_{i-1}
}
$$

OFB

输出反馈模式。

$$
\displaylines{
O_0=IV\\
O_i=E(O_{i-1})\\
C_i=P_i\oplus O_i\\
P_i=C_i\oplus O_i
}
$$

CFB

密文反馈。

$$
\displaylines{
C_0=IV\\
C_i=P_i\oplus E(C_{i-1})\\
P_i=C_i\oplus E(C_{i-1})
}
$$

CTF/ICM/SIC

整数计数模式。

费斯妥密码

明文被分为$L_0$和$R_0$两部分,每轮有:

$$
\displaylines{
L_{i+1}=R_i\\
R_{i+1}=L_i\oplus F(R_i,K_i)
}
$$

得到密文$(R_{n+1},L_{n+1})$。

解密就是整个加密操作逆序做一遍:

$$
\displaylines{
R_i=L_{i+1}\\
L_i=R_{i+1}\oplus F(L_{i+1},K_i)
}
$$

得到明文$(L_0,R_0)$。

AES常见攻击

Byte-at-a-Time

当一个块尺寸为$16$字节时,输入$15$字节,设法探测有关数据。

CBC-IV-Detection

正常CBC模式解密为:

$$
\displaylines{
P_1=D(C_1)\oplus IV\\
P_2=D(C_2)\oplus C_1\\
P_3=D(C_3)\oplus C_2
}
$$

当$C_1$与$C_3$相同,且$C_2$为一个全零的块时:

$$
\displaylines{
P_1=D(C_1)\oplus IV\\
P_2=D(‘\backslash\mathrm{x}00’*BLOCK_LEN)\oplus C_1\\
P_3=D(C_1)\oplus(‘\backslash\mathrm{x}00’*BLOCK_LEN)=D(C_1)
}
$$

可知$D(C_1)$,与$P_1$异或后可得IV。

CBC-Bit-Flipping

在解密过程中,可通过控制密文$1$字节来影响后一个块解密出的明文。

CBC-Padding-Oracle

利用PKCS#7填充算法时,Padding不正确会使服务器抛出异常。如果能获得密文$C$,则构造$C=F+Y$,则可通过修改$F$的最后$1$字节来改变$Y$解密出来的明文最后$1$字节。

一般情况下,$F$设为随机值,则当$Y$解密后最后$1$字节为'\x00'时才不会抛出错误。若倒数第$2$和第$1$字节都为'\x00'也不会报错,此时可重新生成个$Y$。

当探测到不会报错的$F(n-1)$时,可算出$Y$最后$1$字节对应的明文:

$$
P(n-1)=0\mathrm{x}1\oplus F(n-1)\oplus F(n-1)
$$