DES,Data Encryption Standard,数据加密标准。

DES属于分组密码,明文分组长度为64位,密钥长度亦为64位,形成的密文分组仍然为64位。

[分组密码:将明文划分为相同长度的段落,对每个段落分别进行加密的一种密码机制]

[序列密码:对明文字符进行逐位加密的一种密码机制,也称流密码]

[密钥长度:有些文章会直说DES密钥长度为56位,关于这点我们下面再详述]

 

DES加密算法框架图如下所示[这里仅考虑某一个分组的加密过程]

我用底色来进行了大致的类型区分,分别为:

青底粉框的置换运算、绿底的轮结构、深灰底的左循环移位、浅灰底的左右交换

由于轮结构中会牵涉到左循环移位和左右交换,下面我们将分别讲解置换运算和轮结构。

 

--置换运算--

置换,通俗来说就是交换位置。

[对一个密码体制,考察其任一密钥控制下的加密变换:若任意密文c=c1c2cn的各信息元素{ci}均是相应明文m1m2mn的各信息元素{mi}的某种排列,则称该种密码为置换密码;否则,即存在密文c=c1c2cn的各信息元素{ci}不是相应明文m1m2mn的各信息元素{mi}的某种排列,则称该种密码为代换密码。]

DES算法中共有四种置换,通过上面的算法框架图可以看出分别是初始置换、逆初始置换、置换选择1、置换选择2。初始置换和逆初始置换分别是对明文和中间文(过程中产生的非明文和密文的所有文)进行置换运算,置换选择1和置换选择2则是对密钥进行运算,因此将他们分开讲解。

|||初始置换和逆初始置换如下图所示:

有数字恐惧症的人请淡定,图中的数字指的是位置而不是数值。【有数学恐惧症的人会来看这个?】

原始状态指未操作前的位置的定义。我们看到它一共是64个位置,与分组长度相同。

初始置换(IP)进行后,分组中的64个位置上的字符开始互换位置,回想一下中学时老师给同学们重新排座位,就是这样。这位置怎么排看上图即可一一对照,我标注了位置1(原始状态表,第1行第1列)和其初始置换后的位置(初始置换表,第5行第8列),其他同理。

逆初始置换(IP^-1)是对已进行初始置换[以及其他操作]后的数据再次置换。

曾经我看到初始置换和逆初始置换这两个名字,就觉得他们俩之间…有问题。以原始状态的位置1为例简单分析了下,进行初始置换后,它处于位置40(第5行第8列),进行逆初始置换后,处于位置40的字符重新回到了位置1[从上图中可看到三个有青色底纹的位置变化]。好神奇。转了一圈回到了自己最初呆的位置。所以不负他们各自的名字啊。

|||置换选择1和置换选择2如下图所示:

置换选择1和置换选择2所做的操作与初始置换和逆初始置换原理相同。

这里不同的地方在于,置换选择1表是7×8一共56位,置换选择表2是6×8一共48位。在置换过程中,某些位被丢弃了。丢弃的原因或者作用我们在讲解轮结构的时候会详细讲解。

一个很重要的概念是:所有置换操作都是线性的,都是一对一的关系。

 

--轮结构--

轮结构细节图如下图所示:

图中左半部分是对明文的操作,右半部分是对密钥的操作。

先来看明文部分。

在轮结构的开始,一个64位的明文分组被分成了两个部分,L(Left)和R(Right)。抽出右半部分R,首先进行一个扩展置换,这一步将32位分组变成了48位扩展置换的规则如下图所示:

这一步其实只是将某些位进行了二次重用。尽管如此,扩展置换仍然属于一种线性运算。[其实我也不知道为什么,有谁可以进行解答?]

扩展置换之后,明文分组与经过处理的密钥进行了异或[⊕]运算。于是我们先中断一下明文处理这边,先来看看密钥这边。

在本文的第二行就讲到,密钥是64位,但轮结构图中标明的密钥位数是56位,差异性在于:64位是指密钥的总位数,56位是指密钥的有效位。原因在于,密钥的每第8位为奇偶校验位。

密钥的处理流程:置换选择1→左循环移位→压缩置换[也就是前文所说的置换选择2]

左循环移位如下图所示:

在进行左循环移位之前,56位密钥首先拆分成两部分,分别进行移位。循环移位的概念相信大家都清楚,这里不多讲。

左循环移位属于轮结构的一部分,轮结构共进行16次,在每一轮中进行的左循环移位也并非完全相同,如上图所示,在第1、2、9、16轮中,移位位数为1位,其他轮中移位位数为2位。

左循环移位操作完成后,之前分开的左右两半部分重新拼合起来进行一次压缩置换,也就是前文讲到的置换选择2。这里还要注意的是,拼合后的结果将作为下一次轮结构的密钥。

压缩置换后的结果,与明文右半部分经过扩展置换后的结果,进行异或运算。参与运算的两者皆为48位,异或后所得结果显然也是48位。

再将所得的48位结果进行一次S盒代替。

S盒代替如下图所示:

S盒将48位输出等分成8个部分,分别经由8个S盒进行操作。对于每个S盒来说,输入6位,输出4位。

S盒1-8如下图所示:

每一个S盒是一个4×16的矩阵,我们分别称其为[行:第0行、第1行、第2行、第3行,列:第0列、第1列、第2列、第3列、……、第15列]

下面我们来说一下S盒运算的规则:

假设进行S盒1的操作,输入6位为[1 1 1 0 1 0],我们最高位和最低位形成行、中间四位形成列,于是行为[1 0]等于2,列为[1 1 0 1]等于13,则查S盒1第2行第13列得到结果10,转换为四位二进制数为[1 0 1 0],这就是输出结果。

八个S盒的输出结果级联后还需经过一次P盒置换

P盒置换如下图所示:

又见置换!哇哈哈这回终于安心地不解释了。

接下来将P盒置换后所得的结果与明文分组的左半部分进行异或,所得结果作为轮结果的右半部分。而轮结果的左半部分,直接由明文分组的右半部分担任。

这个时候大家可以回头再看看轮结构简图了。

十六轮操作完成之后,再进行一次左右交换和一次逆初始置换[此时看加密算法框架图],OK,大功告成了!

 

长嘘一口气……终于讲完了……

 

还要总结一下吗?来来来,死憋一口气,继续讲:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有一段明文需要进行DES加密,首先进行分组,每组64位,对每一分组分别进行加密。
准备一个64位的密钥。注意每第8位属于奇偶校验位。因此有效密钥为56位。
密钥先进行一次置换,再分成两半进行左循环移位,接着合起来进行一次压缩置换。
明文首先进行一次置换,然后分成两半,右半边进行一次扩展置换,与压缩置换后的密钥进行异或。
然后S盒,然后P盒,然后与明文的左半部分进行异或,得到的结果作为右半部分。
原明文的右半部分作为左半部分,与上面得到的进行级联,然后进行下一轮。
轮结构共进行16次。
接着进行一次左右交换,再进行一次置换。OVER。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

就是这样。欢迎大家前来交流。鞠躬~


其他说明:

文中图片均为本人用PS制作,但内容大部分属于《应用密码学:协议、算法与C源程序》一书中所述。学生党可随意搬走使用,或联系我去掉图片水印,其他人员请保留水印,谢谢~