首页 > Note > 对称密码的模式(MODE)

对称密码的模式(MODE)

2017年7月16日 发表评论 阅读评论

1 科谱:密码学中的常见概念

1.1 密钥

根据密钥的使用方法,可以将密钥分为两种:

  • 对称密钥 是指在加密和解密时使用同一密钥的方式
  • 公钥 加密和解密使用的不是同一种密钥,也称 非对称密钥

1.2 单向散列

单向散列是由单向散列函数计算出来的一组数值。它不能保证数据的机密性,是用来保证数据的完整性的。例如,有安全意识的软件发布者会向用户公布软件的散列值,一般是 MD5. 可以通过检验软件的 MD5 散列值,判断软件是否被篡改过。

1.3 随机数

随机数可以通过硬件生成,也可以通过软件来生成。通过硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息来生成的,可以称为 真随机数 . 而一般由软件生成的随机数是可以周期性重现的,这种随机数称为 伪随机数 。生成随机数的软件叫做 伪随机数生成器

2 对称加密

常用的对称加密方法有 DES 与 AES 两种。

2.1 DES

DES 是一种将 64bit 的明文加密成 64bit 密文的对称密钥算法,它是密钥长度也是 64bit,但是它的密钥每隔 7bit 会设置一个用于错误检查的 bit, 所以实质上其密钥长度是 56bit . 因为 DES 每次只能加密 64bit 明文,所以需要对超过 64bit 的明文进行分组。以分组为单位进行处理的密码算法也称为 分组密码 。分组后的明文以什么样的方式进行加密,我们称之为 模式(mode) 。 DES 的基本结构以其设计者的名字(Horst Feistel)命名,也称 Feistel 网络可 Feistel结构。在 Feistel 结构中,将 64bit 明文再分作两部分,每部分 32bit。假如标记为 A B 两部分,那么有如下步骤:

  1. 对 B 使用子密钥 subkey 进行加密运算,生成 B'f(B,subkey) = B'
  2. B~ 与 A 进行异或运算,生成 C : B' XOR A = C
  3. C 与 B 组合,生成密文 D : C # B = D

这三个步骤称为一个 轮(round) .可以看到,密文D的后半部分 B 没有被加密。我们将组成 D 的 C 与 B 部分进行互置,即令 A = B, B = C,再重复上面的步骤 1 ~ 3 ,这样明文的每一个部分都被加密了。 DES 就是一种由 16 个轮循环组成的 Feistel 网络。每一轮都会生成一个不同的密钥,所以称为子密钥。

2.2 3DES

DES 可以在有限时间内被暴力破解。三重DES 作为 DES 的代替品产生了。三重DES 是为了增加 DES 的强度,将 DES 算法重复 3 次所得到的一种密码算法。也叫 TDEA(Triple Date Encryption Algorithm), 也简写作 3DES ,或 DES3 . 需要注意的,3DES 并不是将 DES 加密过程重复3将,而是将 DES 算法重复 3 次,其过程是:

  1. 使用密钥 K1 对明文进行 DES 加密
  2. 使用密钥 K2 对步骤1 产生的密文进行解密
  3. 使用密钥 K3 对步骤2 产生的 "明文" 进行加密

这一过程是由 IBM 公司设计出来的,其目的是为了兼容 DES 算法:如果这 3 个步骤使用了相同的密钥,那么其加密就与 DES 完全相同了。 如果步骤1 和步骤3 使用相同的密钥,而步骤2 使用不同的密钥,这种三重 DES 称为 DES-EDE2, EDE 表示 Encryption-Decryption-Encryption。 而正是由于 3DES 特别重视向下兼容,导致其效率低且不够安全,所以在实际中很少被使用。

2.3 AES

AES (Advanced Encryption Standard) 是取代 DES 成为新标准的一种对称密钥算法。全世界的科学家提交了多个对称密钥算法为在AES 的候选,而最终在 2000年, 从这些候选算法中先出一种名为 Rijhdeal 的对称密码算法,将其确定为 AES 算法。 和 DES 一样, AES(Rijndeal) 也是由多个 轮构成的,不过不是 Feistel 结构 ,而是 SPN 结构,每一轮分为为 SubBytes, ShiftRows, MixColumns 和 AddRoundKey 4 个步骤

 

3 分组模式

前面提到的 DES 和 AES 都只能加密固定长度的明文,如果需要加密任意长度的明文,就需要对分组密码进行迭代,这个迭代的方法就是所谓的 "模式"。分组密码的主要模式有如下 5 种:

  • ECB Electronic CodeBook mode (电子密码本)
  • CBC Cipher Block Chaining mode (密码分组链接)
  • CFB Cipher FeedBack mode (密码反馈)
  • OFB Output FeedBack mode (输出反馈)
  • CTR CounTeR mode (计数器)

3.1 ECB 模式

将明文分组直接加密的方式就是 ECB 模式。这种模式很简单,但通常不会被使用。在 ECB 模式中,明文分组成密文分组是一一对应的,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组,只要观察密文就可以知道明文中存在怎么的组合,并以此为线索来破译密码。

 

 

3.2 CBC 模式

在 CBC 模式中,密文分组是像链条一样相互连接在一起的。首先将明文分组与前一个密文分组进行 XOR 运算,再进行加密。 当加密第一个明文分组时,由于不存在 "前一个密文分组" ,因此需要事先准备一个长度为一个分组比特序列,这个比特序列称为 初始化向量(Initialzation Vector) ,通缩写为 IV 。为了安全,每次加密时都会随机产生一个随机的比特序列来作为初始化向量。

 

3.3 CFB 模式

在 CFB 模式中,前一个密文分组会被送回到密码算法的输入端。 CFB模式中的 FeedBack, 就是这里的返回输入端的意思。在 ECB 和 CBC 模式中,明文分组都是通过密码算法进行加密的,而在 CFB 模式中,明文分组并没有通过密码算法来直接进行加密,明文分组和密文分组之间只有一个 XOR 运算。

CFB 模式中由密码算法所生成的比特序列称为 密钥流(key stream) 。在 CFB 模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于伪随机数生成器的种子。在 CFB 模式中,明文数据可以被逐比特加密,因此我们可以将 CFB 模式看作是一种使用分组密码来实现流密码的方式。

3.4 OFB 模式

在 OFB 模式中,密码算法的输出会反馈到密码算法的输入中。 OFB 模式并不是通过密码算法对明文直接进行加密,而是通过将 "明文分组" 和 "密码算法和输出" 进行 XOR 来产生 "密码分组" 的.

3.5 CTR 模式

CTR 模式是一种通过将逐次累加的计数器进行加密来生成密钥的流密码。在 CTR 模式中,每个分组对应一个逐次累加的计数器,并通过计数器进行加密来生成一个密钥流。即,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行异味而得到的。

每次加密都会生成一个不同的值(nonce) 来作为计数器的初始值,当分组为 16 Byte 时,前 8 个字节为 nonce,后 8 个字节为分组序号,分组序号是会逐次累加的。

Counter Nonce Number
CounTeR 6E A6 46 55 9C 87 CE FF 00 00 00 00 00 00 00 00
CounTeR 1 6E A6 46 55 9C 87 CE FF 00 00 00 00 00 00 00 01
CounTeR 2 6E A6 46 55 9C 87 CE FF 00 00 00 00 00 00 00 02
CounTeR 3 6E A6 46 55 9C 87 CE FF 00 00 00 00 00 00 00 03