Crypto入门-分组密码初探
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)
$$