Crypto入门-分组密码初探

基础知识

工作模式

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

ECB

电子密码本。

Ci=E(Pi)Pi=D(Ci)

CBC

密码分组链接。

C0=IVCi=E(PiCi1)C0=IVPi=D(Ci)Ci1

OFB

输出反馈模式。

O0=IVOi=E(Oi1)Ci=PiOiPi=CiOi

CFB

密文反馈。

C0=IVCi=PiE(Ci1)Pi=CiE(Ci1)

CTF/ICM/SIC

整数计数模式。

费斯妥密码

明文被分为L0R0两部分,每轮有:

Li+1=RiRi+1=LiF(Ri,Ki)

得到密文(Rn+1,Ln+1)

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

Ri=Li+1Li=Ri+1F(Li+1,Ki)

得到明文(L0,R0)

AES常见攻击

Byte-at-a-Time

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

CBC-IV-Detection

正常CBC模式解密为:

P1=D(C1)IVP2=D(C2)C1P3=D(C3)C2

C1C3相同,且C2为一个全零的块时:

P1=D(C1)IVP2=D(x00BLOCKLEN)C1P3=D(C1)(x00BLOCKLEN)=D(C1)

可知D(C1),与P1异或后可得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(n1)时,可算出Y最后1字节对应的明文:

P(n1)=0x1F(n1)F(n1)