本文整理「密码」这一部分的基础知识点。

内容概述:

  • 经典密码
  • 对称密码
  • 分组密码

1. 环游密码世界(概述)

1.1 基础概念

  • 发送者、接收者和窃听者
  • 加密与解密
  • 破译
  • 密码算法、密钥

1.2 密码学家的工具箱

  • 对称密码: 在加密和解密,使用同一个密钥的方式。
  • 公钥密码/非对称密码: 是指在加密和解密时使用不同密钥的方式。
  • 单向散列函数/哈希值/密码校验/消息摘要:所保证的并不是机密性,而是完整性。即可以检测出数据是否被篡改过。
  • 消息认证码:不仅能够保证完整性,而且能够提供认证机制。即不但能确认消息是否被篡改过,而且能够确认消息是否来自所期待的通信对象。
  • 数字签名:是一种能够保证完整性,提供认证,并防止否认的密码技术。
  • 伪随机生成器:是一种能够模拟生产随机数列的算法,承担着密钥生成的重要职责。如果生成随机数的算法不好,窃听者就能推测出密钥,从而带来通信机密性下降的风险。

1.3 密码与信息安全常识

  • 不要使用保密的密码算法
  • 使用低强度的密码比不进行任何加密更危险
  • 任何密码总有一天都会被破解
  • 密码只是信息安全的一部分

2. 经典密码

2.1 凯撒密码(Caesar cipher)

凯撒密码是通过将明文中所使用的字母表按照一定的字数「平移」来进行加密。例如要保密的信息为 yoshiko ,按照平移 3 格加密后的数据为 BRVKLNR

解密的过程只需要反向平移相应位数就可以解密了。

破解凯撒密码的方法是暴力破解(穷举搜索),把所有可能的密钥全部尝试一遍。

2.2 简单替换密码

简单替换密码是将明文中所使用的字母表替换为另一套字母表的密码。

解密的过程就是使用加密时所使用的替换表进行反向替换,所以发送者和接收者必须事先同时拥有该替换表,而这份替换表也就相当于简单替换密码的密钥。

破解简单替换密码很难通过暴力破解来破译,因为简单替换密码的密钥空间足够大,以 26 位字母为例,计算出来的密钥总数为 26 的阶乘,数据相当庞大,所以要采用频率分析的密码破译方法来破解简单替换密码。所谓了频率分析就是统计替换表中每个字母出现的频率,然后与英文中使用最高频的一些字母对应分析。

2.3 Enigma密码机

Enigma 是一种有键盘、齿轮、电池和灯泡所组成的机器,通过这台机器可以完成加密和解密两种操作。

3. 对称密码

对称密码又称共享密钥密码,用相同的密钥进行加密和解密。

3.1 一次性密码本

一次性密码本(One-time pad),又称维纳密码(Vernam cipher):将明文与一串随机的比特序列进行异或(XOR)运算,解密就是加密的反向运算,即用密文和密钥进行异或运算得到明文。

一次性密码本是无条件安全的,在理论上是无法破译的,因为就算我们用暴力方式侥幸得到了密钥,我们也无法确定异或出来的结果是否就是正确的明文。

一次性密码本之所以没有被使用是因为发送方必须给接收方发送密文和密钥,既然有一种方法可以将密钥安全的发送出去,那岂不是也可以用同样的方法来安全的发送明文?

3.2 DES

DES (Data Encryption Standard) 即数据加密标准,是 1977 年美国联邦信息处理标准中所采用的一种对称密码。一直以来被美国以及其他国家的政府和银行等广泛使用,但是随着计算机的进步,现在的DES已经能够被暴力破解,强度大不如前了,现在我们不应该再使用 DES 了

DES 是一种将 64 比特的明文加密成 64 比特的密文的对称密码算法,他的密钥长度是 56 比特(每隔 7 比特会设置一个用于错误检查的比特)。DES 以 64 比特的明文(比特序列)为一个单位进行加密,这个 64 比特的单位称为分组,DES 是分组密码的一种。DES 每次只能加密 64 比特的数据,如果要加密的明文比较长,就需要对 DES 加密进行迭代(反复),而迭代的具体方式称为模式(mode)。

DES 的基本结构是由 Horst Feistel 设计的,因此也成为 Feistel 网络、Feistel 结构或者 Feistel 密码。在Feistel 网络中,加密的各个步骤称为轮(round),整个加密过程就是进行若干次轮的循环。DES 是一种 16 轮循环的 Feistel 网络

Feistel 网络一轮的具体计算步骤:

  • 将输入的数据等分为左右两部分。
  • 将输入的右侧直接发送到输出的右侧。
  • 将输入的右侧发送到轮函数。
  • 轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列。
  • 将上一步得到的比特序列与左侧数据进行 XOR 运算,并将结果作为加密后的左侧。

这样一来「右侧」根本没有被加密,因此我们需要用不同的子密钥的一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。

Feistel 网络的性质:

  • Feistel 网络的论述可以任意增加。
  • 加密时无论使用任何函数作为轮函数都可以正确解密。
  • 加密和解密可以用完全相同的结构来实现。

综上所述,无论是任何轮数、任何轮函数,Feistel 网络都可以用相同的结构实现加密和解密,且加密的结果必定能够正确解密。

3.3 三重 DES

现在 DES 已经可以在现实的时间内被暴力破解,三重 DES(triple-DES)出于这个目的被开发出来的,但是处理速度不高,而且在安全性方面也逐渐显现出一些问题,也不推荐使用。

三重 DES 的加密机制如图:

明文经过三次 DES 处理才能变成最后的密文,由于 DES 密钥的长度实质上是 56 比特,因此三重 DES 的密钥长度就是 56*3=168 比特。

三重 DES 并不是进行三次加密,而是「加密—解密—加密」的过程,当三重 DES 中所有的密钥都是相同时,三重 DES 也就等同于普通的 DES 了。这是因为在前两步加密—解密之后,得到的就是最初的明文。因此,以前用 DES 加密的密文,就可以通过这种方式用三重 DES 来进行解密。也就是说,三重 DES 对 DES 具备向下兼容性

三重 DES 的解密过程和加密正好相反,是以密钥 3、密钥 2、密钥 1 的顺序执行解密—加密—解密的操作:

3.4 AES(Rijndael)

AES(Advanced Encryption Standard)是取代其前任标准(DES)而称为新标准的一种对称密码算法。在 2000 年从众多候选算法中选出了一种名为 Rijndael 的对称密码算法,并将其确定为 AES。Rijndael 是由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的分组密码算法。

Rijndael 和 AES 并不是一点区别都没有,Rijndael 的分组长度和密钥长度可以分别以 32 比特为单位在 128 比特到 256 比特的范围内进行选择。不过在 AES 的规格中,分组长度固定为 128 比特,密钥长度只有 128、192 和 256 比特三种。

Rijndael 并不像 DES 使用 Feistel 网络作为基本结构,而是使用了 SPN结构。和 DES 一样的是 Rijndael 算法也是由多个轮构成的,其中每一轮分为 SubBytes、ShiftRows、MixColumns 和 AddRoundKey 共 4 个步骤。

Rijndael 的输入分组为 128 比特,也就是 16 字节,一次进行四个步骤的操作:

  • SubBytes:逐个字节地对 16 字节的输入数据进行处理,通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  • ShiftRows:将以 4 字节为单位的行按照一定的规则向左平移,且每一行平移的字节数是不同的。
  • MixColumns:对一个 4 字节的值进行比特运算,将其变为另外一个 4 字节值。
  • AddRoundKey:将 MixColumns 的输出与轮密钥进行 XOR。

实际上,在 Rijndael 中需要重复进行 10-14 轮计算。

通过上面的结构我们可以发现输入的所有比特在议论中都会被加密。和每一轮都只加密一半输入的比特的 Feistel 网络相比,这种方式的优势在于加密所需要的轮数更少。此外,这种方式还有一个优势,即每轮步骤中可以分别以字节、行和列为单位进行并行计算。

下图为解密的过程,除了 AddRoundKey 是一样的,其余三个步骤都是逆运算。

3.5 该选择哪种对称密码

今后最好不要将 DES 用于新的较高的安全用途,因为随着计算机技术的进步,现在用暴力破解法已经能够在现实的时间内完成对 DES的 破译。但是,在某些情况下也需要保持与旧版本软件的兼容性,出于兼容性的因素三重 DES 在今后还会使用一段时间,但会逐步被 AES 所取代。今后大家应该使用的算法是 AES(Rijndael),因为它安全、快速,而且能够在各种平台上工作。

4. 分组密码的模式

前面介绍的 DES 和 AES 都属于分组密码,分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式

  • 分组密码的主要模式有:

  • ECB 模式:Electronic CodeBook mode(电子密码本模式)

  • CBC 模式:Cipher Block Chaining mode(密码分组链接模式)
  • CFB 模式:Cipher FeedBack mode(密码反馈模式)
  • OFB 模式:Output FeedBack mode(输出反馈模式)
  • CTR 模式:CounTeR mode(计数器模式)

4.1 分组密码与流密码

密码算法可以分为分组密码和流密码两种。

分组密码(block cipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的「一块」就称为分组(block)。此外,一个分组的比特数就称为分组长度(block length)。例如 DES 和 3DES 分组长度都是 64 比特,AES 的分组长度为 128 比特。

流密码(stream cipher)是对数据流进行连续处理的一类密码算法。流密码中一般以 1 比特、8 比特或 32 比特等为单位进行加密和解密。

分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态。前面提到的一次性密码本属于流密码,而 DES、3DES、AES(Rijndael)等大多数对称密码算法都属于分组密码。

4.2 明文分组与密文分组

明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。

密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。

4.3 ECB 模式

ECB 模式的全称是 Electronic CodeBook 模式。在 ECB 模式中,将明文分组加密之后的结果将直接成为密文分组。

使用 ECB 模式加密时,相同的分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的「明文分组-密文分组」的对应表,因此ECB模式也称为电子密码本模式

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

由于 ECB 模式中每个明文分组都各自独立地进行加密和解密,攻击者只需要改变密文分组的顺序,就能操控明文。由于密文分组的顺序被改变了,因此响应的明文分组的顺序也会被改变。也就是说,攻击者无需破译密码就能够操作明文

4.4 CBC 模式

CBC 模式的全称是 Cipher Block Chaining 模式(密文分组链接模式)。在 CBC 模式中,首先将明文分组与前一个密文分组进行 XOR 运算,然后再进行加密。

初始化向量 IV 为事先准备的一个长度为一个分组的比特序列,用来代替不存在的「前一个密文分组」。每次加密都会随机产生一个不同的比特序列来作为初始化向量。

对比 CBC 和ECB 模式发现,ECB 模式只进行了加密,而 CBC 模式则在加密之前进行了一次 XOR。因此,即便明文分组 1 和明文分组 2 的值相等,密文分组 1 和 2 也不一定相等,这样 CBC 模式就解决了 ECB 模式存在的缺陷了。

在 CBC 模式加密过程中,我们无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组 3 ,就至少需要凑齐明文分组 1、2、3 才行。

在 CBC 模式解密过程中,如果某一个密文分组因硬盘故障等原因损坏了,在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只会有 2 个分组收到数据损坏影响;如果是密文分组中有一些比特因通信错误导致没有收到某些比特等原因缺失,哪怕只是缺失 1 比特,导致了密文分组的长度发生变化,缺失比特的位置之后的密文分组也就全部无法解密了。

通过修改密文来操纵解密后的明文,攻击者可以对初始化向量中的任意比特进行反转,则明文分组中的相应比特也会反转;攻击者如果对密文分组进行同样的攻击就非常困难,如修改了密文分组 1 中的某个比特,则明文分组 2 相应比特会反转,而这 1 比特的变化会对解密后的明文分组 1 中的多个比特造成影响,也就是说,只让明文分组 1 中特定比特发生变化是很困难的。

4.5 CFB 模式

CFB 模式的全称是 Cipher FeedBack 模式(密文反馈模式)。在 CFB 模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的是返回输入端的意思。

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

CFB 模式与一次性密码本(流密码)非常相似,一次性密码本是通过将明文与随机比特序列进行 XOR 运算来生成密文,而 CFB 模式则通过将明文分组与密码算法的输出进行 XOR 运算来生成密文分组。在 CFB 模式中,密码算法的输出相当于一次性密码本中的随机比特序列。由于密码算法的输出是通过计算得到的,并不是真正的随机数,因此 CFB 模式并不具备理论上不可破译的性质。

在 CFB模式中,明文数据可以被逐比特加密,因此我们可以将 CFB 模式看作是一种使用分组密码来实现流密码的方式。

对 CFB 模式可以实施重放攻击

4.6 OFB 模式

OFB 模式的全称是 Output-Feedback 模式(输出反馈模式)。在 OFB 模式中,密码算法的输出会反馈到密码算法的输入中。

OFB 模式和 CFB 模式的区别仅仅在于密码算法的输入。CFB 模式中密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,相反地,在 OFB 模式中密码算法的输入则是密码算法的前一个输出,也就是将输出反馈到密码算法中。

由于 CFB 模式中要对密文分组进行反馈,因此必须从第一个明文分组开始按顺序进行加密,相反地,在 OFB 模式中,XOR 所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关,只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行 XOR 即可。生成密钥流的操作和进行 XOR 运算的操作是可以并行的,可以快速完成加密。

4.7 CTR 模式

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

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

CTR 模式和 OFB 模式一样,都属于流密码。加密和解密使用了完全相同的结构,因此在程序实现上比较容易。CTR 模式中可以任意顺序对分组进行加密和解密,因此在加密和解密时需要用到的「计数器」的值可以直接计算出来,这一性质是 OFB 模式所不具备的。能够以任意顺序处理分组,就意味着能够实现并行计算,在支持并行计算的系统中,CTR 模式的速度是非常快的。

4.8 该选者哪种模式