Applied Cryptography:chapter 12 数据加密标准(DES)——第一部分

12.1 背景

DES因为ANSI提出的DEA算法和ISO算法提出的DEA-1算法而出名。它抵挡了多年的密码分析师和可能存在的很强的敌人。

标准的发展

上世纪七十年代,民间密码学的研究非常的随意散漫,甚至被垄断在了军方。所以民间发表的密码学研究论文更是一篇都没有。但是密码学在军方的研究已经发展了很多很多年了(想想二战时期,电报,信息等传递,总归不会是大白话穿过去的吧?),但是运用到军方的通信设备,负责国家安危、打仗的军人,也是不懂密码学(就一些研究人员懂)。美国国家安全局(NSA)对密码学当然很了解,但是当时人们都不知道NSA这个机构,跟别谈密码学了。

几家小公司制作通信设备和密码设备发往海外国家。因为没有统一的标准,设备都是不一样的。买家,使用者都不知道这玩意儿到底安不安全(不懂啊),还没有独立的机构,可以评测设备的安全性。(要是当时有设备安全评测,估计成了暴发户了)。

到了1972年,美国美国国家标准局(NBS),现在是美国国家标准和技术协会。发布了一个提出要做一个计算机和数据信息的程序。他们想要开发的是一个单一的,标准密码算法。这个标准的算法,可以被测试和检测,不同的密码设备之间也可以相互交互,还要实现起来很便宜。

1973年,5月15日,NBS提出了标准加密算法的公共要求:
1)、算法必须提供高级别的安全
2)、算法必须详细,并且容易理解
3)、算法安全要由秘钥决定,安全也不能依靠由算法安全
4)、算法必须所有用户都能使用
5)、算法必须适用于不同的应用程序
6)、算法必须能够在电力设备上经济节约的实现
7)、算法必须足够使用
8)、算法必须能够被验证
9)、算法必须可出口的

NBS收到了IBM提交的算法,然后NBS寻求NSA的帮助,检验一下算法怎么样,符不符合条件。之后由NBS宣布IBM提供的算法通过,并且还给了一张免版税的许可证。

从这时候起,由于NSA对于该算法的发展具有隐藏却重要的作用,人们就抱怨起来,它居然把秘钥从128位降低到56位,这不是降低安全率吗?还有人怀疑该算法被NSA藏了“后门”,只有NSA可以随意进出的漏洞。

NBS在其后邀请了大量的专业人士,相关人士,进行评估,看看这个算法是否是人们认为的这个样子。无论结果怎么样,1976年,DES标准最终还是确定了下来。

采纳标准

1981年,美国国家标准协会批准DES作为私营部门标准,随后ANSI发布了DEA操作模式标准,它是一个类似于NBS发布的文档,也是网络加密标准。

DES设备的确认和认证

NIST对DES做校验。这种校验确保程序执行遵守制定的标准。直到1994年,NIST校验硬件和固体实现,标准禁止了软件实现。

1987年

DES方案每五年会被修订一次,1983年方案顺利被重新修订了一次,然后在1987年,NBS公开征求大家对于第二个五年的修订的意见。三个不同的选择以供考虑:另花五年重申标准,撤回标准,或者修改标准适应性。
NBS和NSA重新修订了标准。NSA宣布不会再认证这个标准了。因为它被攻破的可能性越来越高了。
NSA提出了CCEP,可以提供一系列的算法来代替DES,当然了,NSA什么尿性都能想到,这算法是不公开的。这方案最终并没有通过。
现如今公司越来越广泛的使用DES,同时也没有足够的其它选项以供选择。如果撤回这个DES标准,那么很多公司的数据就没有保护了。最终辩论以后,DES成了美国政府标准。NBS宣布DES不会再认证了。

1993

1992年,NBS,现在叫NIST,再一次向大众收集DES的想法。向公众就FIPS 46-1发表评论。这样就三个选择。
1、每五年就进行一次重申。美国国家标准与技术协会将会检测设备执行标准
2、放弃这种标准。
3、修订标准的适用性或者实施说明

这个公开招募在1992年十二月10结束。NIST的代理主任说:
去年,NIST也收集关于DES修订的评论。在看完这些评论,还有一些我获得的技术输入以后。我计划建议商务部长继续修订DES五年。我也计划建议部长顺便表明寻找新的替代标准。

总说要换了,DES标准要结束了,,但1998年又要继续这么说了。

DES的描述

DES是分组密码,它用一个64位块对数据进行加密。一个64位明文块从算法一头进去,64位密文块从另一边出来。DES就是一个对称加密算法:加密和解密的算法、密钥都是相同。

密钥的长度是56位。(密钥通常会扩展成64位数字)。密钥可以是任意56位数字和可以在任何时候被改变。

算法概述

DES操作的是64位明文块。在初始化排列以后,块就会被打裂成左、右两半(每个32位长)。然后就是16轮相同的操作,叫做函数f(数据和密钥混合起来)。在16轮操作以后,左右两边组合,最后一个排列结束了这个算法。

每一轮,密钥移位。并且从56位密钥中选择48位。数据左边一半通过扩展排列扩张成48位,和被移位且排序以后的密钥通过异或组合。这个操作的结果成了新的左半边。老的右一半成了新的右一半。这个操作重复16次,作为DES16轮循环。
在这里插入图片描述

初始化排列

在第一轮操作(上述的16轮操作)前,初始化排列就发生了;
DES第一轮排列方案
初始化排列其实就是IP置换,如下图所示:

1 2 3 4 5 6 7 8
1 58 50 42 34 26 18 10 2
2 60 52 44 36 28 20 12 4
3 62 54 46 38 30 22 14 6
4 64 56 48 40 32 24 16 8
5 57 49 41 33 25 17 9 1
6 59 51 43 35 27 19 11 3
7 61 53 45 37 29 21 13 5
8 63 55 47 39 31 23 15 7

(1,1)上的58,代表着现在表中第58位的数据要放到(1,1)上,这里就是55(7*8+2,也就是现在的(2,8)位置上的数值),需要放到新表中的1位置上。经过变换,新的数据表如下所示:

1 2 3 4 5 6 7 8
1 55 53 51 49 56 54 52 50
2 39 37 35 33 40 38 36 34
3 23 21 19 17 24 22 20 18
4 7 5 3 1 8 6 4 2
5 63 61 59 57 64 62 60 58
6 47 45 43 41 48 46 44 42
7 31 29 27 25 32 30 28 26
8 15 13 11 9 16 14 12 10

初始排列和相应的最终排列不影响DES的安全性。但是由于这个排列算法对于软件来说实施困难,所以许多在软件上实施的DES算法都抛弃了初始化和最终的排列。尽管这种算法并没有比DES更不安全,但是它已经不遵循DES标准,已经不可以叫做DES算法了。

密钥转换(子密钥生成算法)

首先,64位的密钥,每到8的倍数位置,就踢掉这一位(例如第8、16、24、32位可以被忽略掉)。这样一共就踢掉了8位,只剩下56位。踢掉的那八位可以被用作奇偶校验,确保密钥没有错误。现在剩下的56位密钥分成两组,左一祖28位,右一组28位。
然后每一组每一轮都整体循环移动一位或者两位,可以专门做个规定,画个表:

round 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
number 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1

这样就是,第一轮,将密钥向左循环移1位。第二轮,将密钥向左循环移动1位。

这样,按照上面这张表,就会生成16组不同的子密钥。

这样16组56位的子密钥生成以后,按照新给的一张置换表PC-2,进行选取,每组子密钥选出48位,作为新的密钥,最终进行使用。顺便一提,这种56到48的方式叫做压缩排列

举个例子:

一、选取密钥,随便设的
密钥K:0123456789ABCDEF(十进制)
转换成二进制:00000001 00100011 01000101 01100111 10001001 10101011 11001101 11101111

二、一共是64位,然后按照上面的IP置换表进行置换

新的密钥K二进制:11001100 00000000 11001110 11111111 11110000 10101010 11110000 10101010

三、将8的倍数位全剔除,留下剩下的56位(81624324048566456位密钥k:1100110 0000000 1100111 1111111 1111000 1010101 1111000 1010101

四、分成左右两部分L0和R0(每部分28位)
L0=1100110 0000000 1100111 1111111
R0=1111000 1010101 1111000 1010101

使用上面的循环移位表进行移位,如下所示
在这里插入图片描述

第一轮是向左循环移动一位(移动的当然是L0,R0,每次移动的数据都是上一轮的数据)

L0=1100110 0000000 1100111 1111111 R0=1111000 1010101 1111000 1010101
L1=1001100 0000001 1001111 1111111 R1=1110001 0101011 1110001 0101011
L2=0011000 0000011 0011111 1111111 R2=1100010 1010111 1100010 1010111
L3=1100000 0001100 1111111 1111100 R3=0001010 1011111 0001010 1011111(这里向左两位)
L4=0000000 0110011 1111111 1110011 R4=0101010 1111100 0101010 1111100
L5=0000001 1001111 1111111 1001100 R5=0101011 1110001 0101011 1110001 
L6=0000110 0111111 1111110 0110000 R6=0101111 1000101 0101111 1000101 
L7=0011001 1111111 1111001 1000000 R7=0111110 0010101 0111110 0010101 
L8=1100111 1111111 1100110 0000000 R8=1111000 1010101 1111000 1010101 
L9=1001111 1111111 1001100 0000001 R9=1110001 0101011 1110001 0101011(这里又向左一位)
L10=0111111 1111110 0110000 0000110 R10=1000101 0101111 1000101 0101111(这里继续向左两位)
L11=1111111 1111001 1000000 0011001 R11=0010101 0111110 0010101 0111110
L12=1111111 1100110 0000000 1100111 R12=1010101 1111000 1010101 1111000
L13=1111111 0011000 0000011 0011111 R13=1010111 1100010 1010111 1100010
L14=1111100 1100000 0001100 1111111 R14=1011111 0001010 1011111 0001010
L15=1110011 0000000 0110011 1111111 R15=1111100 0101010 1111100 0101010
L16=1001100 0000001 1001111 1111111 R16=1110001 0101011 1110001 0101011(向左一位)
(眼睛快瞎了,应该写个小程序直接能够自动循环移位的。。。)

我在网上找了一张PC-2,用于取48位密钥的

                              PC-2
 
                 14    17   11    24     1    5
                  3    28   15     6    21   10
                 23    19   12     4    26    8
                 16     7   27    20    13    2
                 41    52   31    37    47   55
                 30    40   51    45    33   48
                 44    49   39    56    34   53
                 46    42   50    36    29   32

照着这个表,我再把L0R0-L16R16再来一次,我肯定会瞎。。。。。。(不信自己手算算看。。。)

写了个程序,跟DES关系不是太紧密,我放到另一个帖子下
置换算法

使用上述的程序,得出如下的最终子秘钥

L0R0=000111011110110010101101011000110100100100111111
k1=L1R1=100111011010110110001100101101101100111101010010
k2=L2R2=110100110010110110001110110001110001100110011110
k3=L3R3=011110001010111010100101110001010001001111111101
k4=L4R4=110100011011110000101110010100111001101011101101
k5=L5R5=111000001010011011110110010100101001110110111101
k6=L6R6=111101001101111000100110000010110011110110111101
k7=L7R7=111000101011001101110010011010110111100110110001
k8=L8R8=101011001101011001110111011000110100100100111111
k9=L9R9=101011011101011101010010101101101100111101010010
k10=L10R10=011001100101001111111011100111011010011101010010
k11=L11R11=101111111101000101010001111111011110011001000000
k12=L12R12=000011110100101111011011011110001110011001001110
k13=L13R13=001111110111000110011101101111001111010010001110
k14=L14R14=000111110000110111001001101011000111011011100011
k15=L15R15=010110110110100010111101101111101110101001100011
k16=L16R16=100111011010110110001100101101101100111101010010
以上是左右两边组合而成的,48位的子秘钥,供DES算法16轮的使用
k1~k16

扩展排列

将64位数据同样的分成了两份,左右两半,每份都是32位,而我们将32位转成48位的操作,就叫扩展排列

扩展排列的目的
1、这可以让每一份的数据和48位的密钥进行异或运算
2、在替换操作过程中,这提供了一个可以被压缩的长结果。
3、上面的并不是最主要的原因,如果允许一位影响两次替换操作,那么输出位对于输入位的依赖性会扩展的更加快。这被称作雪崩效应。 而DES算法主要想要实现的就是,密文的每一位都尽可能的依赖明文和密钥的每一位。也就是密文是充分利用明文和密钥而得来的。

有时候,这个被称作E-box。每次输入4比特,第一个和第四个比特分别代表输出块的两个位,第三和第四代表输出块的一个位。
如下图所示,输出位置对应输入位置。4行12列,共48位
在这里插入图片描述
这里举个例子,输入块中的第三个,需要存到输出块中的第四个位置;输入块中的第21个比特,需要转到输出块中的第30、32个位置上去(一共有两个21)

说到底,就是将原本32位的块,按照这个E扩展表扩展成48位,上面的数字表示的是原来表中的数据位置,现在这个数字呆的位置,就是原块数据换到新块中的位置

s-盒替换

在压缩密钥和扩展块异或以后,48位的结果一到替换平台上去。这个代替用的是八个替换盒(S-盒)执行。每一个S-盒用6比特作为输入,4比特作为输出,一共八个不同的s-盒。
48位被分成6比特一组的子块。每一个不同的块在对应的S-盒上执行:第一块放到第一个S-盒,第二块放到第二个S-盒,以此类推。接下来给8个s-盒,如下所示:

S-box 1:
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13

S-box 2:
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,

S-box 3:
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,

S-box 4:
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,

S-box 5:
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,

S-box 6:
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,

S-box 7:
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,

S-box 8:
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11

S-盒是一个4行,16列的表。其中每个条目都是一个4位的数字。S-盒的6位输入其实就是说明在哪一行哪一列寻找输出。

S-盒中的输入比特串以一种非常特殊的方式确定实体。例如:6比特,分别为b1,b2,b3,b4,b5和b6,b1和b6组合起来,称为一个具有两位的数,代表着0-3(00,01,10,11),指S-盒中的行(总共4行)。中间的四位组合成一个4位的数字,代表0-15,指S-盒中的列(一共16列)。

接下来举个例子,假设给s-盒6输入的是110011,第一个和第六个组成了11,中间四个组成了1001,也就是3行9列(从零开始的,如果从一开始,就是4行10列),从s-盒6可以看出来,三行就列的数字是14。所以输入的110011,就被替换成1110(14的二进制)

软件实现这个非常的简单,即使是加上重排,也是非常的简单。

P盒排列

S-盒替换的32位输出根据P-box排列。这种排列将每个输入位映射到一个输出位置;没有比特被使用两次,或者被忽略。这种方式可以被称为直线排列或者就叫做排列。
p-box调换图_applied Cryptograpthy
这里举例子,就是原数据中21位的数据,放到新数据的位置4;原数据中4位的数据,放到新数据的位置31.

最终排列

最终排列是初始排列的倒数。注意,左半边和右半边在最后一轮DES之后没有交换;相反,连接的块R16L16被用作最终排列的输入。这里什么也没有发生;交换两半并在排列中移动会产生完全相同的结果。这样,该算法可以同时用于加密和解密。
最终排列

内容太多了,这章分成两节。下回继续分享。

猜你喜欢

转载自blog.csdn.net/wangzhiyu12/article/details/109748849