Loading... 分组密码,也叫块加密,英文Block Cyper,一般先对明文m进行填充得到一个长度是固定分组长度s的整数倍明文串M;然后将M划分成一个个长度为s的分组;最后对每个分组使用同一个密钥执行加密变换。比较常见的算法有AES;DES;3DES。 ## 前提 在看分组密码的工作模式之前,需要了解一些相关的概念。 ### 初始向量 IV 在密码学的领域里,初始向量(英语:initialization vector,缩写为IV),或译初向量,又称初始变量(starting variable,缩写为SV)[1],是一个固定长度的输入值。一般的使用上会要求它是随机数或拟随机数(pseudorandom)。使用随机数产生的初始向量才能达到语义安全(散列函数与消息验证码也有相同要求),并让攻击者难以对原文一致且使用同一把密钥生成的密文进行破解。在区块加密中,使用了初始向量的加密模式被称为区块加密模式。 有些密码运算只要求初始向量不要重复,并只要求它用是内部求出的随机数值(这类随机数实际上不够乱)。在这类应用下,初始向量通常被称为nonce(临时使用的数值),是可控制的(stateful)而不是随机数。这种作法是因为初始向量不会被寄送到密文的接收方,而是收发两方透过事前约定的机制自行计算出对应的初始向量(不过,实现上还是经常会把nonce送过去以便检查消息的遗漏)。计数器模式中使用序列的方式来作为初始向量,它就是一种可控制之初始向量的加密模式。 ——[Wikipedia](https://en.wikipedia.org/wiki/Initialization_vector) ### 填充模式 (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](https://blog.domineto.top/usr/uploads/2019/10/444016795.png) ![Ecb_decryption.png](https://blog.domineto.top/usr/uploads/2019/10/3433311797.png) ECB 模式特点: | 优点 | 缺点 | | :------------ | :------------ | | 操作简单,易于实现 | 不能隐藏明文的模式 | | 利于并行计算 | 可能对明文进行主动攻击 | | 不会传递误差 | | ### CBC CBC又称密文分组链接模式,英文全称是Cipher Block Chaining,之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。 在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。 CBC 模式加解密流程如下: ![Cbc_encryption.png](https://blog.domineto.top/usr/uploads/2019/10/3638463912.png) ![Cbc_decryption.png](https://blog.domineto.top/usr/uploads/2019/10/3169391419.png) CBC 模式特点: | 优点 | 缺点 | | :------------ | :------------ | | 明文的重复排列不会反应在密文中 | 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错 | | 解密可以并行计算 | 加密无法并行计算 | | 可以解密任意密文分组 | | ### CFB CFB又称密文反馈,英文全称为Cipher feedback。模式类似于CBC,可以将块密码变为自同步的流密码; 加解密流程如下: ![Cfb_encryption.png](https://blog.domineto.top/usr/uploads/2019/10/3129851094.png) ![Cfb_decryption.png](https://blog.domineto.top/usr/uploads/2019/10/3578573646.png) 但这只是最简单的 CFB ,一般不会使用这个模式。关于 CFB 及其变种的详细解释可以参考[这篇文章](http://swzero.blogspot.com/2014/01/cipher-mode-cfbcipher-feedback.html) CFB 模式特点: | 优点 | 缺点 | | :------------ | :------------ | | 明文不需要 padding | 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错 | | 解密可以并行计算 | 加密无法并行计算 | | 可以解密任意密文分组 | 无法抵御重放攻击 | ### OFB 输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与明文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使明文中同样位置的位也产生翻转。 每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。 ![Ofb_encryption.png](https://blog.domineto.top/usr/uploads/2019/10/4241750153.png) ![Ofb_decryption.png](https://blog.domineto.top/usr/uploads/2019/10/404171356.png) OFB 模式特点: | 优点 | 缺点 | | :------------ | :------------ | | 明文不需要 padding | 无法并行计算 | | 可预先准备密钥流 | | | 对包含某些错误比特的密文进行解密时,只有明文中相应的 bit 会出错 | | ### CTR 与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。 CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。 > 注意图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。 ![Ctr_encryption.png](https://blog.domineto.top/usr/uploads/2019/10/581877795.png) ![Ctr_decryption.png](https://blog.domineto.top/usr/uploads/2019/10/2055114785.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 最后修改:2019 年 10 月 10 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏