分组加密及模式
最近感觉做了很多分组加密的题,每次解密的模式都是赛博厨子一个一个试过来的,逻辑啥的也有点不理解,在比赛里最头疼的就是这种比较难的加密了,主要不知道为什么错,想一步一步分析步骤,又很难看,最终还是得归总一下。
常见分组加密
AES,DES,blowfish,sm4……(比赛里现在只遇到这些,以后遇到了会继续补充)
KEY
密钥是加密中最关键的一个东西,也是解密中不可获取的东西,以下为各种分组加密的表:
加密方式 | AES | DES | Blowfish | SM4 |
---|---|---|---|---|
密钥长度(位=8bits) | 16/24/32 | 8 | 4—56 | 16 |
重复次数 | 10/12/14 | 16 | 16 | 32 |
分组长度(位) | 16 | 8 | 8 | 16 |
牢记这些能有效帮助我们判断或者是确认加密类型。
IV
IV(Initialization Vector)是许多任务作模式中用于将加密随机化的一个位块,由此即使同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程。是区别ECB模式和CBC模式的关键。IV的长度一般和分组长度相同。
ECB模式
最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。
在这种工作模式下,一个明文组只能固定地被加密成一个对应的密文组,一个密文组也只能固定地被解密成对应的密文组。他们彼此是一一对应的。设想我们有一个厚厚的密码本,每次加密时,我们只需要从密码本中查出明文所对应的密文就可以。这也是电码本模式名称的由来。对于短消息,ECB模式是比较适用的。但对于长消息,ECB模式就不太安全了。
最简单的EBC模式,解密只需找密文密钥。
CBC模式
密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量iv。
其实是EBC模式的异或升级版,开局的异或交给了初始化向量,所以一般iv的长度跟分组长度相同。
加密是先异或再加密,解密是先异或再解密。
解密的话需要知道密文密钥还有iv。
Padding
有的模式,经典的AES-CBC,AES-ECB(经常被填充搞红温过),支持对非128比特整的数据进行加密,有的模式不支持。填充是用各种可以恢复的方法把数据流填充为128bits=16位。
CFB模式
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码,这个模式可以对非128比特的数据进行加密。
在CFB模式中,加密的基本过程如下:
- 初始向量(IV)被加密,生成一个伪随机的分组输出。
- 这个输出与明文的一部分(可以是一个比特,也可以是多个比特)进行异或运算,生成密文。
- 生成的密文部分作为下一个分组的输入新IV,继续进行加密。
CFB模式的结构和一次性密码本非常相似。一次性密码本是通过“明文”与“随机比特序列”进行XOR运算来生成“密文”的。而CFB模式则是通过将“明文分组”与“密码算法的输出”进行XOR运算来生成“密文分组”的。在通过 XOR来进行加密这一点上,两者是非常相似的。
CFB模式中由密码算法所生成的比特序列称为密钥流。在CFB模式中,密码算法相对于用来生成密钥流的伪随机数生成器,而初始化向量相当于伪随机数生成器的“种子”。
在CFB模式中,明文数据可以被逐比特加密,因此可以将CFB模式看作是一种使用分组密码来实现流密码的方式。
OFB模式
OFB模式是先用块加密器生成密钥流,然后将密钥流和明文流异或得到密文流,解密过程是重新异或一次。
可以一次计算出所有的密钥流,每次加解密只需要做异或操作。
这个就相对简单。
CTR模式
CTR模式是使用随机数等方式产生一个IV,经过计数器累加+1后拼接成一个串,对这个串进行加密,然后和明文做异或操作。
一般这个随机数产生的iv会放在加密后密文的最前面16位单独成一个组,或者是告诉你随机数的值,不然解密的话根本无法解密。
GCM模式
GCM是认证加密模式中的一种,一般只在AES中见到,它结合了两者的特点(GCM中的G就是指GMAC,C就是指CTR),能同时确保数据的保密性、完整性及真实性,另外,它还可以提供附加消息的完整性校验,加密流程如下图:
GCM可以提供对消息的加密和完整性校验,另外,它还可以提供附加消息的完整性校验。在实际应用场景中,有些信息是我们不需要保密,但信息的接收者需要确认它的真实性的,例如源IP,源端口,目的IP,IV,等等。因此,我们可以将这一部分作为附加消息加入到MAC值的计算当中。下图的Ek表示用对称秘钥k对输入做AES运算。最后,密文接收者会收到密文、IV(计数器CTR的初始值)、MAC值。
主要参考: