分组密码,也叫块加密,英文Block Cyper,一般先对明文m进行填充得到一个长度是固定分组长度s的整数倍明文串M;然后将M划分成一个个长度为s的分组;最后对每个分组使用同一个密钥执行加密变换。比较常见的算法有AES;DES;3DES。

前提

在看分组密码的工作模式之前,需要了解一些相关的概念。

初始向量 IV

在密码学的领域里,初始向量(英语:initialization vector,缩写为IV),或译初向量,又称初始变量(starting variable,缩写为SV)[1],是一个固定长度的输入值。一般的使用上会要求它是随机数或拟随机数(pseudorandom)。使用随机数产生的初始向量才能达到语义安全(散列函数与消息验证码也有相同要求),并让攻击者难以对原文一致且使用同一把密钥生成的密文进行破解。在区块加密中,使用了初始向量的加密模式被称为区块加密模式。

有些密码运算只要求初始向量不要重复,并只要求它用是内部求出的随机数值(这类随机数实际上不够乱)。在这类应用下,初始向量通常被称为nonce(临时使用的数值),是可控制的(stateful)而不是随机数。这种作法是因为初始向量不会被寄送到密文的接收方,而是收发两方透过事前约定的机制自行计算出对应的初始向量(不过,实现上还是经常会把nonce送过去以便检查消息的遗漏)。计数器模式中使用序列的方式来作为初始向量,它就是一种可控制之初始向量的加密模式。 ——Wikipedia

填充模式 (padding)

一般采用的填充方式有如下几种:

ANSIX923

ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。
假定块长度为8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

ISO10126

ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。
假定块长度为 8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07

PKCS7

PKCS7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
假定块长度为 8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07,如果恰好8个字节时还要补8个字节的0x08,可以让解密的数据很确定无误的移除多余的字节。 PKCS5Padding 和 PKCS7Padding 在这方面是类似的。不同点在于,选择算法的时候如果选用 PKCS5Padding 填充模式,就是明确指定块大小是 8 个字节。选用 PKCS7Padding 则是没有明确指定块大小。如果选择算法的时候选用 PKCS7Padding 填充模式,同时设置块大小为 8 字节,和选用 PKCS5Padding 填充模式,没有设置块大小(实际已经设置了 8 字节),这两种情况下,两种填充模式没有区别。另外有个值得注意的是,AES 中块大小是固定 16 字节。

Zeros

填充字符串由设置为零的字节组成

工作模式

分组密码中,无论是明文块还是密文块,块与块之间都有一些逻辑运算关系,这些关系即为运算的模式。
比较常见的分组密码运算的五种模式:

  • Electronic Code Book(ECB)电子密码本模式
  • Cipher Block Chaining(CBC)密码分组链接模式
  • Cipher Feedback Mode(CFB)加密反馈模式
  • Output Feedback Mode(OFB)输出反馈模式
  • Counter mode(CTR)计数器模式

ECB

ECB又称电子密码本模式,英文全称是Electronic codebook,是最基本的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,如果最后一块不足128位,使用填充(具体看算法,默认是0x00),之后将每个块使用相同的密钥单独加密得到密文块,然后将密文块连在一起就得到密文了。解密同理。
下图展示ECB模式加解密的过程:
Ecb_encryption.png
Ecb_decryption.png

ECB 模式特点:

优点缺点
操作简单,易于实现不能隐藏明文的模式
利于并行计算可能对明文进行主动攻击
不会传递误差

CBC

CBC又称密文分组链接模式,英文全称是Cipher Block Chaining,之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。

在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。
CBC 模式加解密流程如下:
Cbc_encryption.png
Cbc_decryption.png

CBC 模式特点:

优点缺点
明文的重复排列不会反应在密文中对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
解密可以并行计算加密无法并行计算
可以解密任意密文分组

CFB

CFB又称密文反馈,英文全称为Cipher feedback。模式类似于CBC,可以将块密码变为自同步的流密码;

加解密流程如下:
Cfb_encryption.png
Cfb_decryption.png

但这只是最简单的 CFB ,一般不会使用这个模式。关于 CFB 及其变种的详细解释可以参考这篇文章

CFB 模式特点:

优点缺点
明文不需要 padding对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
解密可以并行计算加密无法并行计算
可以解密任意密文分组无法抵御重放攻击

OFB

输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与明文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使明文中同样位置的位也产生翻转。

每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。

Ofb_encryption.png
Ofb_decryption.png

OFB 模式特点:

优点缺点
明文不需要 padding无法并行计算
可预先准备密钥流
对包含某些错误比特的密文进行解密时,只有明文中相应的 bit 会出错

CTR

与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。

CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。

注意图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。

Ctr_encryption.png
Ctr_decryption.png

OFB 模式特点:

优点缺点
明文不需要 padding不会放大错误,不适合数据完整性校验
可以并行计算
可以解密任意密文分组

Referrer

http://www.beesfun.com/2017/03/06/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F/
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

Last modification:October 10th, 2019 at 11:47 am
If you think my article is useful to you, please feel free to appreciate