《图解密码技术 (密码)》第三章 ——对称密码 (共享密钥密码)


一、本章学习内容

 本章我们将学习 比特序列运算XOR 运算。这两种运算在计算机数据处理中经常出现,因此大家应该在本章中熟悉它们。
 然后,我们将介绍一种称为 一次性密码本 的密码系统。一次性密码本是一种 绝对无法被破译 的密码,这一点已经得到了证明。
 之后,我们将具体介绍几种对称密码算法,包括 DES、三重DES、AES、其他一些密码算法。最后,我们将谈一谈在众多对称密码算法中到底应该使用哪一种。


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

1、编码

 计算机的操作对象并不是文字,而是由 0 和 1 排列而成的 比特序列。无论是文字、图像、声音、视频还是程序,在计算机中都是用比特序列来表示的。
 执行加密操作的程序,就是将 表示明文的比特序列 转换为 表示密文的比特序列
 将现实世界中的东西映射为比特序列的操作称为 编码 (encoding)。比如 ASCII编码。

2、XOR (异或)

异或的规则如下图所示:
在这里插入图片描述
再说一下比特序列的异或,基本就是每一位进行 XOR 运算,且 不用进位在这里插入图片描述
异或运算是支持回退的,即 A 异或 B 之后得到 C,C 再异或 B 便可以得到 A。在这里插入图片描述
 假设有一个由很多点组成的图像,白色的点作为 0,黑色的点作为 1,那么一幅黑白的图便可以表示成一个 01比特序列。我们准备两幅图像,一幅画的是英文字母 D, 另一幅是用 0 和 1 交替排列形成的图像,称之为 蒙版,这两张图像用 XOR 合并之后的样子如 图3-1 所示。
 从图中可以看出,执行 一次蒙版操作 后,原来的图像 ***被隐藏 (掩盖) 了,而执行 两次蒙版操作 后,就又可以得到原来的图像了。

在这里插入图片描述
 如果所使用的蒙版是 完全随机 的比特序列,则使用 XOR 就可以将原来的图像掩盖起来。能够产生 不可预测的 比特序列,对于密码技术的贡献是巨大的。这种不可预测的比特序列就称为 随机数。关于随机数我们将在 第12章 详细探讨。


三、一次性密码本 (绝对不会被破译的密码本)

1、什么是一次性密码本

 只要通过 暴力破解法密钥空间 进行 遍历,无论什么密文总有一天也都能够被破译。然而,本节中将要介绍的 一次性密码本 (one-time pad) 却是一个例外。即便用 暴力破解法 遍历整个密钥空间,一次性密码本也绝对无法被破译。

2、一次性密码本的加密

一次性密码本 是一种非常简单的密码,其 密钥 是通过不断地抛硬币得到的 (每一位的 0 和 1 的概率是相同的),正面为 0,反面为 1。然后将 明文转化为二进制 (一般用 ASCII) 后,将 明文二进制序列密钥 进行 XOR 得到 密文

在这里插入图片描述
 这样产生的比特序列如果硬要显示在计算机上,那么显示结果看上去就像是乱码一样,因此密文通常不会被还原为字符,而是被作为二进制数据来处理。

3、—次性密码本的解密

 用 密文密钥 进行 XOR 运算,就可以得到 明文

在这里插入图片描述
然后计算机根据 ASCII 的规则,将 明文 翻译成字符,显示在计算机上,便得到 “midnight”。

4、—次性密码本是无法破译的

 这里说的无法破译,并不是指在现实的时间内难以破译,而是指 即便拥有一种运算能力无穷大的计算机,可以在一瞬间遍历任意大小的密钥空间,也依然无法破译,即 绝对无法被破译
 为什么说是 绝对无法被破译 的呢?首先,如果通过暴力破解,一定会有一天得到 “midnight” 的明文,这是毋庸置疑的,因为 密钥空间的大小是固定的。关键在于:即便我们能够解密出 midnight 这个字符串,我们也无法判断它 是否是正确的明文

 一次性密码本是由 维纳 (G.S.Vernam) 于1917年提出的,并获得了专利,因此又称为 维纳密码 (Vernam cipher) (该专利已过有效期)。一次性密码本无法破译这一特性是由 香农 (C.E.Shannon) 于1949年 通过数学方法加以证明的。一次性密码本是 无条件安全的 (unconditionally secure),在 理论上是无法破译的 (theoretically unbreakable)

5、一次性密码为什么没有被使用

 虽然上面一直在说一次性密码很好,但是现实中几乎没有人使用,因为它是非常不实用的,原因如下:

5.1、密钥的配送

 最大的问题在于密钥的配送。
 接收者 Bob 收到了 Alice 发来的 密文D,Bob 要想进行解密,就必须使用和 Alice 进行加密时相同的密钥,因此 Alice 必须将密钥也发送给 Bob,且该密钥的长度和密文是相等的。
 但这样就产生了一个矛盾 —— 如果能够有一种方法将 密钥 安全地发送出去,那么岂不是也可以用同样的方法来安全地发送 明文 了吗?

5.2、密钥的保存

 在一次性密码本中,密钥的长度 必须和 明文的长度 相等,而且由于密钥保护着明文的机密性,因此必须妥善保存,不能被窃听者窃取。
 密文是不需要被保护的,但是 明文密钥 都是需要被保护的,且长度相同。也就是说,我们只是将 “保护明文” 这一命题替换成了 “保护和明文一样长的密钥” 而已,问题并没有得到实质性的解决。

5.3、密钥的重用

 此外,在一次性密码本中 绝对不能 重用过去用过的随机比特序列,一次性密码本中的 “一次性” 也正是由此而来。这是因为作为密钥的比特序列一旦泄露,过去所有的机密通信内容 将全部被解密,假设 窃听者Eve 保存了过去所有的通信内容。

5.4、密钥的同步

 一次性密码本中还会产生发送者与接收者之间 密钥同步 的问题。
 当明文很长时,一次性密码本的密钥也会跟着变长。如果明文是一个大小为 100MB 的文件,则密钥的大小也一定是100MB。
 而且在通信过程中,发送者和接收者的密钥的比特序列 不允许有任何错位,否则错位的比特后的所有信息都将无法解密。显然,如果密钥很大,传播起来也很麻烦

5.5、密钥的生成

 在一次性密码本中,需要生成大量的随机数。这里的随机数不能是 伪随机数,而必须是无重现性的 真正随机数
 也就是说,如果某个文件的 明文 大小有 1010b,那么就需要抛 1010 次硬币。这个代价是非常大的。
 例如,据说大国之间的热线就使用了一次性密码本,这种情况下估计会有专门的特工来承担配送密钥的任务,也就是说,特工需要将随机比特序列直接交到对方手中。

 虽然,一次性密码本的实用性非常低。但是一次性密码本的思路却孕育出了 流密码 (stream cipher)
 流密码使用的 不是真正的随机比特序列,而是 伪随机数生成器 产生的比特序列。流密码虽然不是无法破译的,但只要使用 高性能的伪随机数生成器,就能够构建出 强度较高的 密码系统
 关于 流密码 我们将在 第4章 详细探讨,关于 伪随机数生成器 我们将在 第12章 详细探讨。


四、DES

1、什么是 DES

 DES (Data Encryption Standard) 是1977年美国联邦信息处理标准 (FIPS) 中所采用的一种对称密码 (F1PS 46-3)。但是,由于 DES 的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们不应该再使用 DES 了。

2、密钥的结构

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

3、加密和解密

 DES 是以 64比特的明文 (比特序列) 为 一个单位 来进行加密的,这个 64比特的单位称为 分组。一般来说,以分组为单位进行处理的密码算法 称为 分组密码 (block cipher),DES 就是分组密码的一种。
 DES 每次只能加密 64比特 的数据,如果要加密的 明文比较长,就需要对 DES 加密进行 迭代 (反复),而 迭代的具体方式 就称为 模式 (mode)。关于模式我们会在 第4章 详细探讨。在这里插入图片描述

4、DES 的结构 (Feistel 网络)

 DES 的基本结构,也称为 Feistel网络、Feistel结构、Feistel密码。这一结构不仅被用于 DES,在其他很多密码算法中也有应用。
 在 Feistel网络 中,加密的各个步骤称为 轮 (round),整个加密过程就是进行若干次轮的循环。图3-3 展现的是 Feistel网络 中 一轮 的计算流程。
 DES 是一种 16轮循环 的 Feistel网络。在这里插入图片描述

4.1、加密的具体过程

 上面的两个方框表示一轮的 输入 (明文)。输入的数据被等分为 左右两半 分别进行处理。
 下面的两个方框表示本轮的 输出 (密文)。输出的左半部分写作 “加密后的左侧”,右半部
分写作 “右侧”。
 中间的 “子密钥” 指的是 本轮加密 所使用的密钥。在 Feistel网络 中,每一轮 都需要使用一个 不同的子密钥由于子密钥只在一轮中使用,它只是一个局部密钥,因此才称为 子密钥 (subkey)

轮函数 的作用是根据 “右侧”子密钥 生成对 “左侧” 进行加密的比特序列,它是密码系统的核心。

 将 轮函数的输出“左侧” 进行 XOR运算,其结果就是 “加密后的左侧”。而输人的 “右侧” 则会直接成为输出的 “右侧”。

 但是,这样一来 “右侧” 根本就没有被加密,因此我们需要用 不同的子密钥 对一轮的处理 重复若干次,并在 每两轮处理之间左右侧对调
 图3-4 展现了一个 3轮 的 Feistel网络,3轮加密计算 需要进行 两次左右对调。对调只在两轮之间进行,最后一轮结束之后不需要对调。在这里插入图片描述

4.2、解密的具体过程

 对于 某一轮 来说,只要将 该轮的输出结果 用 相同的子密钥 再运算一次,便可以将该轮的输出恢复为输入,如 图3-5 所示。

在这里插入图片描述

 有 多个轮 的情况下也是一样的。也就是说,Feistel网络 的解密操作只要按照 相反的顺序 来使用子密钥就可以完成了,而 Feistel网络本身的结构,在加密和解密时都是完全相同的,如 图3-6 所示。

在这里插入图片描述

4.3、Feistel网络 的特性

  1. 轮数可以任意增加;
  2. 加密时无论使用任何函数作为轮函数都可以正确解密;
  3. 加密和解密可以用完全相同的结构来实现。

 正是由于 Feistel网络 具备如此方便的特性,它才能够被许多 分组密码算法 使用。在后面即将介绍的 AES 最终候选算法的 5个 算法之中,有 3个 算法:MARS、RC6、Twofish,都是使用了 Feistel网络。
 然而,AES 最终选择的 Rijndael算法 却没有使用 Feistel网络。Rijndael 所使用的结构称为 SPN结构,我们将在 3.8.2节 详细介绍。

5、差分分析与线性分析

差分分析 是一种 针对分组密码 的分析方法,这种方法由 Biham 和 Shamir 提出,其思路是 “改变一部分明文并分析密文如何随之改变”。理论上说,即便明文只改变一个比特,密文的比特排列也应该发生彻底的改变。于是通过 分析密文改变中所产生的偏差,可以获得 破译密码的线索

 此外,还有一种叫作 线性分析 的密码分析方法,这种方法由松井充提出,其思路是 “将明文和密文的一些对应比特进行 XOR 并计算其结果为零的概率”,如果 密文 具备足够的 随机性,则任选一些明文和密文的对应比特进行 XOR 结果为零的概率应该为 1 2 \frac{1}{2} 21。如果能够找到 大幅偏离 的部分,则可以借此获得一些与密钥有关的信息。
 使用线性分析法,对于 DES 只需要 247组 明文和密义就能够完成破解,相比需要尝试 256个 密钥的暴力破解来说,所需的计算量得到了大幅减少。

 差分分析和线性分析都有一个 前提,那就是 ==假设密码破译者可以选择任意明文并得到其加密的结果,这种攻击方式称为 选择明文攻击 (Chosen Plaintext Attack, CPA)
 以 AES 为代表的 现代分组密码算法,在设计上已经考虑了针对差分分析和线性分析的安全性。


五、三重 DES

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

1、什么是 三重DES

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

2、三重DES 的加密

加密机制如 图3-7 所示。

在这里插入图片描述
 明文经过 三次 DES处理才能变成最后的密文,由于 DES 密钥的长度实质上是 56比特,因此 三重DES 的 密钥长度 就是56x3=168 比特。
 从 图3-7 中我们可以发现,三重DES 并不是进行 三次 DES加密 (加密—加密—加密),而是 加密—解密—加密 的过程。在中间加一个解密操作 目的是为了让 三重DES 能够 兼容普通的 DES

  • 如果 密钥1=密钥2=密钥3,则其结果与 普通DES 是等价的;
  • 如果 密钥1=密钥3≠密钥2,则其称为 DES-EDE2,EDE 表示的是 加密 (Encryption) → \rightarrow 解密 (Decryption) → \rightarrow 加密 (Encryption) 这个流程;
  • 如果 密钥1≠密钥2≠密钥3,则其称为 DES-EDE3

3、三重DES 的解密

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

在这里插入图片描述

4、三重DES 的现状

 用的并不多。“目前暂时允许使用”。


六、AES

1、什么是 AES

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

2、AES 的选拔过程

 AES 是公开选拔的,参加 AES 竞选有一个条件就是:被选为 AES 的密码算法必须无条件地免费供全世界使用。此外,参加者还必须提交密码算法的详细规格书、以 ANSI C 和 Java 编写的实现代码以及抗密码破译强度的评估等材料。
 因此,参加者所提交的密码算法,必须在详细设计和程序代码完全公开的情况下,依然保证较高的强度,这就彻底杜绝了 隐蔽式安全性 (security by obscurity)
 AES 的选拔过程是对全世界公开的。实际上,对密码算法的评审不是由 NIST 来完成的,而是由全世界的企业和密码学家共同完成的,这其中也包括 AES 竞选的参加者。

 像这样 通过竞争来实现标准化 (standardization by competition) 的方式,正是密码算法选拔的正确方式。由世界最高水平的密码学家共同尝试破译,依然未能找到弱点,只有这样的事实才能证明一种密码算法的隐秘性。

3、AES 最终候选算法的确定与 AES 的最终确定

 AES 的选拔并不仅仅考虑一种算法 是否存在弱点算法的速度、实现的容易性 等也都在考虑范围内。不仅 加密本身的速度要快密钥准备的速度 也很重要。此外,这种算法还必须能够 在各种平台上有效工作
 1999 年,在募集到的 15个 算法中,有 5个 算法人围了AES ***最终候选算法名单 (AES finalist)。AES 最终候选算法名单 如 表3-1 所示。在这里插入图片描述
 2000年10月2日,Rijndael 力压群雄,被 NIST 选定为 AES 标准。


七、Rijndal

1、什么是 Rijndal

 Rijndael 是由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的 分组密码算法,于2000年被选为新一代的标准密码算法 —— AES。
 Rijndael 的 分组长度密钥长度 可以分别 以32比特为单位128比特~256比特 的范围内进行选择。
 不过在 AES 的规格中,分组长度 固定为 128比特密钥长度 只有 128、192、256比特 三种。
 和 DES —样,Rijndael 算法也是由多个 构成的,其中 每一轮分为 SubBytes、ShiftRows、MixColumns、AddRoundKey 共4个步骤
 DES 使用 Feistel网络 作为其基本结构,而 Rijndael 使用了 SPN结构

2、Rijndael 的加密和解密

 Rijndael 的输入分组为 128比特 (16字节)。

  • SubBytes 处理:首先,需要逐个字节地对 16 字节的输入数据进行 SubBytes处理。所谓 SubBytes,就是以 每个字节的值 (0 ~ 255) 为索引,从一张拥有 256个值 的 替换表 (S-BOX) 中查找出对应值的处理。

  • ShiftRows 处理:然后进行 ShiftRows处理,这一步是将以 4字节为单位的行 (n>w) 按照一定的规则 向左平移,且 每一行平移的字节数是 不同的。图3-12 所示为 ShiftRows 中对其中一行进行处理的情形。

在这里插入图片描述

  • MixColumns 处理:之后需要进行 MixColumns处理。这一步是对一个 4字节的值 进行 比特运算,将其变为另外一个 4字节值。图3-13 所示为 MixColumns中对其中一列 (column) 进行处理的情形。在这里插入图片描述
  • AddRoundKey 处理:将 MixColumns 的输出轮密钥 进行 XOR。图3-14 所示为 AddRoundlCey 中对其中 1个字节 进行处理的情形。在这里插入图片描述

 到这里,Rijndael 的一轮就结束了。实际上,在 Rijndael 中需要重复进行 10~14 轮计算。

从上面可以发现 Rijndael 相比 Feistel 的优势:

  • 输人的所有比特在一轮中都会被加密,
  • SubBytes、ShiftRows 和MixColumns 可以分别以字节、行和列为单位进行并行计算。

 在解密的时候,则是按照相反的顺序来进行的,即:
A d d R o u n d K e y → I n v M i x C o l u m n s → I n v S h i f t R o w s → I n v S u b B y t e s AddRoundKey \rightarrow InvMixColumns \rightarrow InvShiftRows \rightarrow InvSubBytes AddRoundKeyInvMixColumnsInvShiftRowsInvSubBytes其中,AddRoundKey 是与 轮密钥 进行 XOR运算,这一步是与加密一样的,而其他的步骤都是带有 Inv 的,这表示与原始步骤相对应的 逆运算

3、Rijndael 的破译

 由于 Rijndael 算法的背后有着严谨的数学结构,也就是从明文到密文的计算过程可以全部用公式来表达,这是以前任何密码算法都不具备的性质。这就表示理论上来说能够通过 数学公式 来进行破译。
 不过,这也只是一种假设而已,实际上到现在为止还没有出现针对 Rijndael 的有效攻击。

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值