本文转载自:《现代密码学》课程笔记知乎专栏
仅作个人学习记录。
上一讲主要讲了复杂度理论的知识,总结如下:

图4-1 第三讲总结
这一讲正式进入现代密码学。先引入分组密码的概念,然后讲解数据加密标准(DES)。
一、分组密码概述
首先说明分组密码和流密码的概念和区别。
1.分组密码和流密码的概念与区别:
所谓流密码,就是把明文的所有字符作为一个整体,然后一位一位地对明文字符进行加密。先前讲的一些古典密码,如维吉尼亚密码和Vernam密码,都属于流密码。先前讲一次一密时有一个典型的式子:
至于分组密码,就是指先对明文进行分组,然后对分组后的明文一组一组地进行加密。分组加密后的密文分组长度与明文分组长度相等。它与流密码的区别是,分组密码一次用一个密钥
如下图所示:

图4-2 分组密码示意图
2.理想的分组密码:
(1)分组密码的可逆映射:
分组密码具有这样的特点:一个

图4-3 一个分组密码的可逆映射表
(2)分组密码变换的总数:
在长度为
而第一种明文(如00)也可以对应其他4种密文(如00,01,10,11),第二种明文(如01)可以对应剩下的3种密文,以此类推,因此,所有可能的映射表种数为
由此可以得出,一个长度为
(3)理想分组密码的密钥:
对于一个长度为

图4-4 长度为4的一种映射表
本质上,右边一列(111001001101……)就是密钥。因此,对于一个分组长度为
(4)理想分组密码遇到的困难和改进:
因为对于一个理想的分组密码,其密钥长度为
二、Feistel密码体制
1.分组密码的设计原则:
既然理想分组密码不太实用,那么我们可以从密码设计的本源进行探索,一个足够安全的密码系统具有什么特征?
香农引进了混淆和扩散两个概念。
(1)扩散:
所谓扩散,就是==使明文和密文之间的关系尽可能复杂==,使明文中原有的统计规律在密文中消失。即无法通过密文来获知有关明文的任何信息。可以通过让明文中的多个位对密文的一位造成影响,从而造成扩散(这也是命名为扩散的原因)。实际中,可以对明文进行置换,然后使用多个函数多次对其作用,就能产生这样的效果。(见下文的Feistel密码)
(2)混淆
混淆是指==使密文和密钥之间的关系尽可能复杂==,即无法通过密文来推断出密钥。
扩散和混淆简明扼要地抓住了现代分组密码设计的最核心的本质。
2.乘积密码体制:
所谓乘积密码体制,就是依次使用两个或者两个以上的密码,从而达到扩散和混淆的效果。这里Feistel建议多次使用古典密码中的两个重要方法:代替和置换。这种密码体制本质上密钥长度为
3.Feistel密码体制的描述:
一个Feistel密码体制包含16轮迭代和一次左右置换。如下图所示:

图4-5 Feistel密码体制示意图
(1)Feistel密码体制的加密过程:
在加密时,首先将明文分为左右等长的两部分,分别记为 $L{i-1}
注意:每一轮输入轮函数
(2)Feistel密码体制的解密过程:
解密过程与加密过程完全相同。
我们先来证明轮变换的可逆性:
对于一个轮变换:假设以 $L{\text{入}}
以上可以看出,等式1、等式2是正向变换,等式3和等式4是逆向变换。其变换过程是相同的,也是等价的,这也说明每次轮变换(迭代)都是可逆的。注意:这里并没有要求轮函数
由于在加密变换的16轮变换结束之后,左右两部分进行了一次置换,即解密过程的输入是最后一轮迭代的结果再左右交换。因此对每一轮解密变换都有 $LDi=RE{16-i}
在执行16轮迭代之后,由于解密输出的左右两部分还与加密过程的输入相反,因此还需执行一次左右置换,从而得到明文。
三、数据加密标准(DES)
DES(Data Encryption Standard)是1977年美国国家标准局颁布的信息处理标准,多年来,DES是主流的对称加密算法。但现在DES已经不太安全了。DES主要采用了Feistel加密体制,是一种分组密码加密体制。
DES有两个输入,分别是分组长度为64位的明文,和长度为56位的密钥(实际为64位,剩下的8位可以作为奇偶校验码或随意设置)。
其加密过程如下,首先对64位明文进行初始置换,然后进行16轮的轮迭代(与Feistel密码体制完全相同),最后再进行一次逆初始置换,得到密文。每轮的密钥由一个专门的算法产生。

图4-6 DES加密过程
1.初始置换和逆初始置换:
初始置换(Initial Permutation,

图4-7 初始置换表

图4-8 逆初始置换
2.轮变换(轮迭代)的细节过程:
明文经过初始置换后,就进入了16轮轮迭代的过程。每轮迭代如图4-9左侧所示。(右侧为轮密钥产生方法)。
与前面所讲的Feistel密码体制一样,经过初始置换的64位明文,被分成了左右32位:

其中

图4-9 轮迭代的详细过程
其中轮函数包含这么几个过程:进入轮函数中的32位的

图4-10 拓展置换(E)表
其后,被扩展出的48位与密钥
之后,这48位将进入一个代替函数,产生出32位的输出。
这个代替函数由8个S盒组成。首先将48位的输入分成8部分,每部分6位,分别把分出的8个部分输入到8个S盒中。在每个S盒中,这6位输入的第1位和第6位组成的2位二进制数用来选择S盒的某一行,中间4位组成的二进制数用来选择S盒的某一列。行列确定后,会选出S盒中的一个十进制数字,然后把这个十进制数转换为4位二进制数,作为这个S盒输出的结果。这样,每个S盒都可以把6位输入转换为4位二进制输出。8个S盒同时作用,就完成了48位到32位的转换。
8个S盒如下图所示:

图4-11 8个S盒
举个例子:对于S1盒,如果输入001001,则代表01行,0100列,化为十进制可知,表示的数为第1行,第4列(行、列都从零开始数)的数字14,表示为二进制为1110。于是我们把001001转换为了1110。
经过S盒后,我们获得了32位的输出。最后还需让这32位经过一个置换

图4-12 置换(P)
经过整个轮函数后,我们最终得到了32位的输出。整个轮函数总结如下:

图4-12 轮函数F
之后,轮函数的32位输出还要与左侧的输入
3.密钥产生算法:
DES的密钥实际有64位,在输入密钥后,对其1-64位按顺序编号,按照下表所示按顺序放置:

图4-13 输入密钥放置
放置后,去掉每行的第8位,形成一个56位的密钥(前文提到的56位)。然后让这56位密钥在置换选择1(

图4-14 置换选择1(PC-1)
置换后,将获得的56位分成各为28位的两部分

图4-15 左移位数的确定
然后将移位后获得的2个28位合二为一,对这56位进行置换选择2(

图4-16 置换选择2(PC-2)
这就是整个DES算法以及密钥产生的全过程。
DES解密与加密方式完全相同(因为是Feistel密码体制,符合可逆性),只是每轮密钥要倒序使用。