【密码学 —— 对称密码】

系列文章目录

第一章:古典密码
第二章:对称密码
第三章:非对称密码
第四章:混合密码
第五章:哈希函数
第六章:消息认证码
第七章:数字签名
第八章:数字证书
第九章:密钥
第十章:随机数
第十一章:SSL/TLS安全通信



一、从文字密码到比特序列密码

1.1 编码

现代的密码都是建立在计算机的基础之上的,这是因为现代的密码所处理的数据量非常大,而且密码算法也非常复杂,不借助计算机的力量就无法完成加密和解密的操作。

计算机的操作对象并不是文字,而是由 0 和 1 排列而成的比特序列。无论是文字、图像 、声音、视频还是程序,在计算机中都是用比特序列来表示的。执行加密操作的程序,就是将表示明文的比特序列转换为表示密文的比特序列。

将现实世界中的东西映射为比特序列的操作称为编码( encoding )。 例如 midnight ( 深夜 )
这个同, 我们可以对其中的每个字母逐一进行编码, 这种编码规则叫作 ASCII。

m → 01101101
i → 01101001
d → 01100100
n → 01101110
i → 01101001
g → 01100111
h → 01101000
t → 01110100

注意这里的 m → 01101101 这一转换并不是加密而是编码。尽管在人类看来 0 和 1 的序列跟密码没什么两样,但计算机却可以 “看懂” 这些比特序列,并很快地反应出其所对应的字符串是 midnight。

1.2 XOR

为了更好的理解比特序列运算的概念,我们来介绍一下XOR运算。XOR 的全称是 exclusive or,在中文里叫作异或,由于其可逆的特性,在密码学中被频繁使用。

1个比特的XOR
1个比特的 XOR 运算的规则如下,即相同为 0,不同为 1。符号 ⊕ 来表示 XOR。

0 ⊕ 0 = 0				(0 与 0 的 XOR 结果为 0)
0 ⊕ 1 = 1				(0 与 1 的 XOR 结果为 1)
1 ⊕ 0 = 0				(1 与 0 的 XOR 结果为 1)
1 ⊕ 1 = 0				(0 与 0 的 XOR 结果为 0)

比特序列的XOR
上面我们介绍了 1 个比特之间的 XOR 运算,而如果是长比特序列之间的 XOR 运算,则只要
对其中每个相对应的比特进行 XOR 运算就可以了。假设我们将 01001100 这个比特序列称为
A,将 10101010 这个比特序列称为 B,那么 A 与 B 的 XOR 运算就可以像T面这样逐一对各个
比特进行计算。
在这里插入图片描述
由于两个相同的数进行 XOR 运算的结果一定为 0,因此如果将 A ⊕ B 的结果再与 B 进行 XOR 运算,则结果会变回 A。也就是说,两个公式中的 B 会相互抵消。
在这里插入图片描述
可能大家已经发现了, 上面的计算和加密、 解密的步骤非常相似。

  • 将明文 A 用密钥 B 进行加密,得到密文 A ⊕ B
  • 将密文A ⊕ B 用密钥 B 进行解密,得到敏文 A

实际上,只要选择一个合适的 B,仅仅使用 XOR 就可以实现一个高强度的密码。

对同一个比特序列进行两次 XOR 之后就会回到最初的状态。我们不妨来看一幅由很多个点组成的图像。如果将白色的点作为 0, 黑色的点作为 1,那么一幅黑白图像就可以表示为 0 和1的比特序列。我们准备两幅图像,一幅画的是英文字母 D,另一幅是用 0 和 1 交替排列形成的图像(蒙版),这两张图像用 XOR 合并之后的样子如下图所示。从图中可以看出,执行一次蒙版操作后,原来的图像被隐藏(掩盖)了,而执行两次蒙版操作后,就又可以得到原来的图像了。
XOR 对图像的掩盖
如果所使用的蒙版是完全随机的比特序列,则使用 XOR 就可以将原来的图像掩盖起来。但如果蒙版中的比特序列的排列是可以被推测出来的,那么实质上图像就没有被真正掩盖。对于密码技术来说,”是否可以预测“是非常重要的一点。能够产生不可预测的比特序列,对于密码技术的贡献是巨大的。这种不可预测的比特序列就称为随机数。关于随机数我们将在第十章详细探讨。

二、DES

DES(Data Encryption Standard)是 1977 年美国联邦信息处理标准(FIPS) 中所采用的一种对称密码(FIPS 46-3)。DES —直以来被美国以及其他国家的政府和银行等广泛使用。

然而,随着计算机的进步,现在 DES 已经能够被暴力破解,强度大不如前了。20 世纪末,RSA 公司举办过破译 DES 密钥的比赛(DES Challenge),我们可以看一看 RSA 公司官方公布的比赛结果:1997 年的 DES Challenge I 中用了 96 天破译密钥,1998 年的 DES ChallengeII-1 中用了 41 天,1998 年的 DES Challenge II-2 中用了 56 小时,1999 年的 DES Challenge III 中只用了22 小时 15 分钟。

由于 DES 的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们不应该再使用 DES 了。

2.1 DES加密和解密

DES 是一种将 64 比特的明文加密成 64 比特的密文的对称密码算法 ,它的密钥长度是 56 比特。尽管从规格上来说,DES 的密钥长度是 64 比特,但由于每隔 7 比特会设置一个用于错误检查的比特,因此实质上其密钥长度是 56 比特。

DES 是以 64 比特的明文(比特序列)为一个单位来进行加密的,这个 64 比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码(block cipher),DES 就是分组密码的一种。

DES 每次只能加密 64 比特的数据,如果要加密的明文比较长,就需要对 DES 加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。

2.2 DES的结构(Feistel网络)

DES 的基本结构是由 Horst Feistel 设计的,因此也称为 Feistel 网络(Feistel network)、Feistel 结构(Feistel structure)或者 Feistel 密码(Feistel cipher)。 这一结构不仅被用于 DES,在其他很多密码算法中也有应用。

在 Feistel 网络中,加密的各个步骤称为轮(round),整个加密过程就是进行若干次轮的循环。下图展现的是 Feistel 网络中一轮的计算流程。DES 是一种 16 轮循环的 Feistel 网络。
在这里插入图片描述
轮函数的作用是根据 “右侧” 和子密钥生成对 “左侧” 进行加密的比特序列,它是密码系统的核心。 将轮函数的输出与 “左侧” 进行 XOR 运算,其结果就是 “加密后的左侧”。也就是说,我们用XOR 将轮函数的输出与 “左侧” 进行了合并。而输人的 “右侧” 则会直接成为输出的 “右侧”。

总结一下,一轮的具体计算步骤如下。

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

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

下图展现一个3轮的 Feistel 网络,3轮加密计算需要进行两次左右对调。对调只在两轮之间进行,最后一轮结束之后不需要对调。
在这里插入图片描述
如下图,Feistel 网络的解密操作只要按照相反的顺序来使用子密钥就可以完成了,而 Feistel 网络本身的结构,在加密和解密时都是完全相同的。
在这里插入图片描述
下面我们来总结一下Feistel 网络的性质。

最容易发现的一点就是,Feistel 网络的轮数可以任意增加。无论运行多少轮的加密计算,都不会发生无法解密的情况。

其次,我们还可以发现,加密时无论使用任何函数作为轮函数都可以正确解密。也就是说,即便用轮函数的输出结果无法逆向计算出输入的值(即该函数不存在反函数)也没有问题。轮函数可以无需考虑解密的问题, 可以被设计得任意复杂。

另外,加密和解密可以用完全相同的结构来实现,这也是 Feistel 网络的一个特点。在Feistel 网络的一轮中,右半部分实际上没有进行任何处理。这在加密算法中看起来是一种浪费,但却保证了可解密性,因为完全没有进行任何处理的右半部分,是解密过程中所必需的信息。由于加密和解密可以用完全相同的结构来实现,因此用于实现 DES 算法的硬件设备的设计也变得容易了。

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

三、三重DES

现在 DES 已经可以在现实的时间内被暴力破解,因此我们需要一种用来替代 DES 的分组密码,三重 DES 就是出于这个目的被开发出来的。

三重 DES (triple-DES) 是为了增加 DES 的强度,将 DES 重复 3 次所得到的一种密码算法,也称为 TDEA (Triple Date Encryption Algorithm),通常缩写为 3DES。

3.1 三重DES的加密

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

三重 DES 的加密如下图所示。三重 DES 并不是进行三次 DES 加密(加密—加密—加密),而是加密—解密—加密的过程。在加密算法中加人解密操作让人感觉很不可思议,实际上这个方法是 IBM 公司设计出来的,目的是为了让三重 DES 能够兼容普通的 DES。
在这里插入图片描述
当三重 DES 中所有的密钥都相同时,三重 DES 也就等同于普通的 DES 了。 这是因为在前
两步加密—解密之后, 得到的就是最初的明文。 因此,以前用 DES 加密的密文,就可以通过这
种方式用三重 DES 来进行解密。 也就是说, 三重 DES 对 DES 具备向下兼容性。
在这里插入图片描述
在 DES 的部分我们已经提到过,DES 的加密和解密过程只是改变了子密钥的顺序,而实际进行的处理是相同的。

如果所有密钥都使用相同的比特序列, 则其结果与普通的 DES 是等价的。

如果密钥 1 和密钥 3 使用相同的密钥,而密钥 2 使用不同的密钥(也就是只使用两个 DES 密钥),这种三重 DES 就称为 DES-EDE2。EDE 表示的是加密(Encryption)→ 解密(Decryption)→ 加密( Encryption )这个流程。

密钥 1 、密钥 2、密钥 3 全部使用不同的比特序列的三重 DES 称为 DES-EDE3。

3.2 三重DES的解密

三重 DES 的解密过程和加密正好相反,是以密钥 3、密钥 2、密钥 1 的顺序执行解密 → 加密 → 解密的操作。
在这里插入图片描述

3.3 三重DES的现状

尽管三重 DES 目前还被银行等机构使用, 但其处理速度不高, 除了特别重视向下兼容性的情况以外, 很少被用于新的用途。

在日本总务省和经济产业省 2013 年发布的《电子政府相关技术采购中参考的密码清单》中, “电子政府推荐使用的密码清单”一项中将 3-key Triple DES 作为 64 比特分组密码列了出来。但考虑到 NIST SP 800-67 的规定,以及其事实性标准的地位,又在脚注中给出了“目前暂且允许使用”的描述。

四、AES

AES (Advanced Encryption Standard)是取代其前任标准(DES) 而成为新标准的一种对称密码算法。全世界的企业和密码学家提交了多个对称密码算法作为 AES 的候选,最终在 2000 年从这些候选算法中选出了一种名为 Rijndael 的对称密码算法,并将其确定为了 AES。

3.1 AES的加密和解密

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

AES 的输入分组为 128 比特,也就是 16 字节。首先,需要逐个字节地对 16 字节的输入数据进行 SubBytes 处理。所谓 SubBytes,就是以每个字节的值(0 ~ 255 的任意值)为索引,从一张拥有 256 个值的替换表(S-BOX) 中查找出对应值的处理。也就是说,要将一个 1 字节的值替换成另一个 1 字节的值。这个步骤用语言来描述比较麻烦,大家可以将它想象成是第 2 章中介绍过的简单替换密码的 256 个字母的版本。下图所示为 4 x 4 = 16 字节的数据中通过 S-Box 替换 1 字节的情形 。
在这里插入图片描述
S-BOX:
在这里插入图片描述
SubBytes 之后需要进行 ShiftRows 处理。 这一步是将以 4 字节为单位的行(n>w)按照一定的规则向左平移,且每一行平移的字节数是不同的。如下图所示为 ShiftRows 中对其中一行进行处理的情形。
在这里插入图片描述
ShiftRows 之后需要进行 MixColumns 处理。这一步是对一个 4 字节的值进行比特运算,将其变为另外一个 4 字节值。下图所示为MixColumns 中对其中一列(column)进行处理的情形。
在这里插入图片描述
矩阵运算:
在这里插入图片描述

最后,需要将 MixColumns 的输出与轮密钥进行 XOR,即进行 AddRoundKey 处理。下图所示为 AddRoundlCey 中对其中 1 个字节进行处理的情形。到这里,AES 的一轮就结束了。实际上,在 AES 中需要重复进行 10 ~ 14 轮计算。
在这里插入图片描述
通过上面的结构我们可以发现输人的所有比特在一轮中都会被加密。和每一轮都只加密一半输入的比特的 Feistel 网络相比,这种方式的优势在于加密所需要的轮数更少。此外,这种方式还有一个优势,即 SubBytes、 ShiftRows 和 MixColumns 可以分别以字节、行和列为单位进行并行计算。

在 AES 的加密过程中,每一轮所进行的处理为:
SubBytes → ShiftRows → MixColumns → AddRoundKey

而在解密时,则是按照相反的顺序来进行的,即:
AddRoundKey → InvMixColumns → InvShiftRows → InvSubBytes

其中,AddRoundKey 是与轮密钥进行 XOR 运算,因此这一步在加密和解密时是完全相同的,剩下的步骤中名字前面都带有 Inv,这表示与原始步骤相对应的逆运算。 下图所示为解密处理的情形。
在这里插入图片描述

五、分组密码的模式

5.1 分组密码与流密码

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

分组密码( block cipher )是每次只能处理特定长度的一块数据的一类密码算法, 这里的"—块” 就称为分组( block )。 此外, 一个分组的比特数就称为分组长度( block length )„

例如:
DES 和三重 DES 的分组长度都是 64 比特。 这些密码算法一次只能加密 64 比特的明文, 并生成 64 比特的密文。
AES 的分组长度为 128 比特,因此 AES —次可加密 128 比特的明文,并生成 128 比特的密文。

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

分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态。

DES、三重 DES、AES(Rijndael)等大多数对称密码算法都属于分组密码。一次性密码本属于流密码。

5.2 什么是模式

分组密码算法只能加密间定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)。

模式有很多种类,分组密码的主要模式有以下 5 种。

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

5.3 ECB模式

ECB 模式的全称是 Electronic CodeBook 模式。在 ECB 模式中,将明文分组加密之后的结果将直接成为密文分组。
在这里插入图片描述
使用 ECB 模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的 “明文分组 → 密文分组” 的对应表,因此 ECB 模式也称为电子密码本模式
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充(padding)。

5.3.1 ECB模式的特点

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

5.3.2 对ECB模式的攻击

ECB 模式中,每个明文分组都各自独立地进行加密和解密,但这其实是一个很大的弱点。

假如存在主动攻击者,他能够改变密文分组的顺序。当接收者对密文进行解密时,由于密文分组的顺序被改变了,因此相应的明文分组的顺序也会被改变。也就是说,攻击者无需破译密码就能够操纵明文。 在这个场景中,攻击者不需要破译密码,也不需要知道分组密码算法,他只要知道哪个分组记录了什么样的数据(即电文的格式)就可以了。

我们来看一个简单的例子。假设分组长度为 128 比特(16 字节),某银行的转账请求数据由以下 3 个分组构成。

分组 1 = 付款人的银行账号
分组 2 = 收款人的银行账号
分组 3 = 转账金额

银行在收到转账请求数据后,就会将数据中指定的金额从付款人的账户转移到收款人的账户中。具体来说,我们可以实际制作一个“从 A-5374 账户向 B-6671 账户转账 1 亿元”的转账请求数据, 用 16 进制数据表示如下。

明文分组 1 = 41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20(付款人:A-5374)
明文分组 2 = 42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20(收款人:B-6671)
明文分组 3 = 31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20(转账金额: 100000000)

下面我们将上述数据用 ECB 模式进行加密,从加密后的数据是看不出明文分组的内容的。

密文分组 1 = 59 7D DE CC EF EC BA 9B BF 83 99 CF 60 D2 59 B9(付款人:????)
密文分组 2 = DF 49 2A 1C 14 8E 18 B6 53 IF 38 BD 5A A9 D7 D7(收款人:????)
密文分组 3 = CD AF D5 9E 39 FE FD 6D 64 8B CC CB 52 56 8D 79(转账金额:????)

接下来,攻击者将密文分组 1 和 2 的内容进行对调。
只是对调了密文分组 1 和 2 的顺序,并没有试图破译密码。而银行对上述信息解密后,就会变成下面这样。

明文分组 1 = 42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20(付款人:B-6671)
明文分组 2 = 41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20(收款人:A-5374)
明文分组 3 = 31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 (转账金额:100000000)

原本请求的内容是从 A-5374 账户向 B-6671 账户转账 1 亿元,现在却变成了从 B-6671 账户向 A-5374 账户转账 1 亿元,完全相反!通过这个例子我们可以看出,ECB 模式的一大弱点,就是可以在不破译密文的情况下操纵明文。

刚才我们看了一个将 3 个分组中的 2 个进行对调的例子,而无论有多少个分组,这样的手法都是可以通用的。 在 ECB 模式中,只要对任意密文分组进行替换,相应的明文分组也会被替换。此外,攻击者所能做的还不仅限于替换,例如,如果将密文分组删除,则相应的明文分组也会被删除,如果对密文分组进行复制,则相应的明文分组也会被复制。

攻击者对密文所进行的篡改,可以通过第六章介绍的消息认证码检测出来。不过,如果使用除 ECB 之外的其他模式,那么上述攻击从一开始就是不可能实现的。

5.4 CBC模式

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

5.4.1 CBC模式的加解密

在 CBC 模式中,首先将明文分组与前一个密文分组进行 XOR 运算,然后再进行加密。
在这里插入图片描述

5.4.2 初始化向量

当加密第一个明文分组时,由于不存在 “前一个密文分组”,因此需要事先准备一个长度为—个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为 IV。一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

5.4.3 CBC模式的特点

明文分组在加密之前一定会与”前一个密文分组“进行 XOR 运算,因此即便明文分组 1 和 2 的值是相等的,密文分组 1 和 2 的值也不一定是相等的。这样一来,ECB 模式的缺陷在 CBC 模式中就不存在了。

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

在 CBC 模式的解密过程中。假设 CBC 模式加密的密文分组中有一个分组损坏了(例如由于硬盘故障导致密文分组的值发生了改变等)。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只会有 2 个分组受到数据损坏的影响。
在这里插入图片描述
假设 CBC 模式的密文分组中有一些比特缺失了(例如由于通信错误导致没有收到某些比特等),那么此时即便只缺失了 1 比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密了。
在这里插入图片描述

5.4.4 对 CBC 模式的攻击

假设主动攻击者的目的是通过修改密文来操纵解密后的明文。如果主动攻击者能够对初始化向量中的任意比特进行反转(即将 1 变为 0,将 0 变为 1),则明文分组(解密后得到的明文分组)中相应的比特也会被反转。这是因为在 CBC 模式的解密过程中,第一个明文分组会和初始化向量进行 XOR 运算。
在这里插入图片描述
这样,主动攻击者就可以对初始化向量进行攻击,但是想要对密文分组也进行同样的攻击就非常困难了。例如,如果主动攻击者将密文分组 1 中的某个比特进行了反转,则明文分组 2 中相应的比特也会被反转,然而这 1 比特的变化却会对解密后的明文分组 1 中的多个比特造成影响。也就是说,只让明文分组 1 中 Mallory 所期望的特定比特发生变化是很闲难的。

另外,通过使用第六章中介绍的消息认证码,还能够判断出数据有没有被篡改。

初始化向量(IV))必须使用不可预测的随机数。然而在 SSL/TLS 的 TLS 1.0 版本协议中,IV 并没有使用不可预测的随机数,而是使用了上一次 CBC 模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TLS 1.1 以上的版本中改为了必须显式地传送 IV (RFC5246 6.2.3.2)。关于随机数的相关内容,我们将在第十章中进行讲解。

5.5 CFB模式

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

5.5.3 CFB 模式的加解密

在 ECB 模式和 CBC 模式中,明文分组都是通过密码算法进行加密的,然而,在 CFB 模式中,明文分组并没有通过密码算法来直接进行加密。从下图可以看出,明文分组和密文分组之间并没有经过“加密”这一步骤。在 CFB 模式中,明文分组和密文分组之间只有一个 XOR。
在这里插入图片描述
CFB 模式中由密码算法所生成的比特序列称为密钥流(key stream)。在 CFB 模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于伪随机数生成器的“种子”。关于伪随机数生成器和种子,我们将在第十章详细探讨。

CFB 模式解密时,需要注意的是分组密码算法依然执行加密操作,因为密钥流是通过加密操作来生成的,而 XOR 是可以进行逆运算的特性。

5.5.3 对CFB 模式的攻击

对 CFB 模式可以实施重放攻击(replay attack)。

假设有一天,有一天,Alice 向 Bob 发送了一条消息,这条消息由 4 个密文分组组成。主动攻击者Mallory 将该消息中的后 3 个密文分组保存了下来。转天,Alice 又向 Bob 发送了内容不同的 4 个密文分组(我们假设 Alice 使用了相同的密钥)。Mallory 用昨天保存下来的 3 个密文分组将今天发送的后 3 个密文分组进行了替换。

于是,当 Bob 解密时,4 个分组中就只有第 1 个可以解密成正确的明文分组,第 2 个会出错,而第 3 个和第 4 个则变成了被 Mallory 替换的内容(也就是昨天发送的明文内容)。Mallory 没有破解密码,就成功地将以前的电文混人了新电文中。而第 2 个分组出错到底是通信错误呢,还是被人攻击所造成的呢?Bob 是无法做出判断的。要做出这样的判断,需要使用第六章将要介绍的消息认证码。
在这里插入图片描述

5.6 OFB模式

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

5.6.1 OFB模式的加解密

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

5.6.2 CFB模式与OFB模式的对比

OFB 模式和 CFB 模式的区别仅仅在于密码算法的输入。

CFB 模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此就有了“密文反馈模式”这个名字。相对地,OFB 模式中,密码算法的输人则是密码算法的前一个输出,也就是将输出反馈给密码算法,因此就有了“输出反馈模式”这个名字。

5.7 CTR 模式

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

5.7.1 CTR 模式的加解密

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

5.7.2 计数器的生成方法

每次加密时都会生成一个不同的值(nonce)来作为计数器的初始值。当分组长度为 128 比特(16 字节)时,计数器的初始值可能是像下面这样的形式。
在这里插入图片描述
其中前 8 个字节为 nonce,这个值在每次加密时必须都是不同的。后 8 个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化。
在这里插入图片描述
按照上述生成方法,可以保证计数器的值每次都不同。由于计数器的值每次都不同,因此每个分组中将计数器进行加密所得到的密钥流也是不同的。也就是说,这种方法就是用分组密码来模拟生成随机的比特序列。

5.7.3 OFB 模式与 CTR 模式的对比

CTR 模式和 OFB 模式一样,都属于流密码。如果我们将单个分组的加密过程拿出来,那么 OFB 模式和 CTR 模式之间的差异还是很容易理解的。OFB 模式是将加密的输出反馈到输人,而 CTR 模式则是将计数器的值用作输人。
在这里插入图片描述

5.7.4 CTR 模式的特点

CTR 模式的加密和解密使用了完全相同的结构,因此在程序实现上比较容易。 这一特点和同为流密码的 OFB 模式是一样的。

此外,CTR 模式中可以以任意顺序对分组进行加密和解密,因此在加密和解密时需要用到的“计数器”的值可以由 nonce 和分组序号直接计算出来。这一性质是 OFB 模式所不具备的。能够以任意顺序处理分组,就意味着能够实现并行计算。在支持并行计算的系统中,CTR 模式的速度是非常快的。

5.8 模式对比

在这里插入图片描述


小结

本章中我们介绍了对称密码: DES 、三重 DES、AES。也介绍了分组密码的模式,可以根据实际情况的需要和各模式的特点,选择适合的密码和算法。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值