lihongjie0209 / myblog

4 stars 0 forks source link

分组密码模式 #257

Open lihongjie0209 opened 3 years ago

lihongjie0209 commented 3 years ago

分组密码

分组密码(blockcipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的一块"就称为分组(block)。

此外,一个分组的比特数就称为分组长度(blocklength)。

例如,SM4的分组长度是128比特。这些密码算法一次只能加密128比特的明文.并生成128比特的密文。
12345

模式

分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。

而迭代的方法就称为分组密码的模式(mode),分组密码的主要模式有以下5种:

ECB模式:Electronic Code Book mode(电子密码本模式:不推荐)
CBC模式:Cipher Block Chaining mode(密码分组链接模式)
CFB模式:Cipher FeedBack mode(密文反馈模式)
OFB模式:Output FeedBack mode(输出反馈模式)
CTR模式:CounTeR mode(计数器模式)
123456789

ECB 模式

ECB(Electronic Code Book, 电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。  

每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。  

K:密钥;   C:密文;   P:明文

适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。
1234567

在这里插入图片描述

使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组-->密文分组"的对应表,因此ECB模式也称为电子密码本模式当最后一个明文分组的内容小于分组长度时,需要用一特定的数据进行填充(padding),让值一个分组长度等于分组长度。

ECB模式是所有模式中最简单的一种。ECB模式中,明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。
123

CBC模式

CBC(Cipher Block Chaining, 密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。 

这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。 

IV:初始化向量;   K:密钥;   C:密文;   P:明文

CBC模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与ECB一样消息块必须填充到块大小的整倍数。
1234567

在这里插入图片描述

如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别 。

ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。
123

在这里插入图片描述

CFB 模式

CFB模式的全称是Cipher FeedBack模式(密文反馈模式)。在CFB模式中,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。

所谓反馈,这里指的就是返回输人端的意思,即前一个密文分组会被送回到密码算法的输入端。

IV:初始化向量;   K:密钥;   C:密文;   P:明文

s位:明文,反馈位数,取1、8、64、128 记为CFB-1,CFB-8,CFB-64,CFB-128;    b位:移位寄存器值

CFB模式的解密和CBC模式的加密在流程上其实是非常相似的。 
123456789

在这里插入图片描述

在ECB模式和CBC模式中,明文分组都是通过密码算法进行加密的,然而,在CFB模式中,明文分组并没有通过密码算法来直接进行加密。

从上图可以看出,明文分组和密文分组之间并没有经过"加密"这一步骤。在CFB模式中,明文分和密文分组之间只有一个XOR。

我们将CBC模式与CFB模式对比一下,就可以看出其中的差异了(如下图)。在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间则只有XOR。
12345

在这里插入图片描述

OFB 模式

OFB式的全称是Output-Feedback模式(输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中, 即上一个分组密码算法的输出是当前分组密码算法的输入(下图)。

IV:初始化向量;   K:密钥;   C:密文;   P:明文

s位:明文,反馈位数,随机序列;    b位:移位寄存器值

OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将 “明文分组" 和 “密码算法的输出” 进行XOR来产生 “密文分组” 的,在这一点上OFB模式和CFB模式非常相似。
1234567

在这里插入图片描述

在这里插入图片描述

由于CFB模式中是对密文分组进行反馈的,因此必须从第一个明文分组开始按顺序进行加密,也就是说无法跳过明文分组1而先对明文分组2进行加密。

相对地,在OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。

只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了。只要将明文与密钥流进行XOR就可以了。

和AES等密码算法相比,XOR运算的速度是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。

换个角度来看,生成密钥流的操作和进行XOR运算的操作是可以并行的。
123456789

CTR 模式

CTR模式的全称是CounTeR模式(计数器模式)。CTR摸式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码(下图)。

Counter:计数器;    K:密钥;   C:密文;   P:明文

CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。

也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。
1234567

在这里插入图片描述

在这里插入图片描述

其中前8个字节为nonce(随机数),这个值在每次加密时必须都是不同的,后8个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化:

在这里插入图片描述

按照上述生成方法,可以保证计数器的值每次都不同。由于计数器的值每次都不同,因此每个分组中将计数器进行加密所得到的密钥流也是不同的。也是说,这种方法就是用分组密码来模拟生成随机的比特序列。

在这里插入图片描述

总结

在这里插入图片描述