DES加密算法分析

更新时间:2024-04-26 12:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

陕西理工学院毕业论文(设计)

DES加密算法分析

蔡鹏

(陕理工数学系信息与计算科学专业044班,陕西 汉中 723000)

指导教师:张凌霜

[摘 要] DES数据加密算法是使用最广的分组加密算法,它作为最著名的保密密钥或对称密钥加密算法,

在计算机密码学及计算机数据通信的发展过程中起了重要作用。本次学年论文是主要是学习介绍DES对称密钥数据加密算法,并用c++实现。DES算法具有较高的安全性,为我们进行一般的计算机数据传输活动提供了安全保障。

[关键词] 加密与解密,DES算法,S-盒

引言

密码学是伴随着战争发展起来的一门科学,其历史可以追溯到古代,并且还有过辉煌的经历。但成为一门学科则是近20年来受计算机科学蓬勃发展的刺激结果。今天在计算机被广泛应用的信息时代,信息本身就是时间,就是财富。如何保护信息的安全(即密码学的应用)已不再局限于军事、政治和外交,而是扩大到商务、金融和社会的各个领域。特别是在网络化的今天,大量敏感信息(如考试成绩、个人简历、体检结果、实验数据等)常常要通过互联网进行交换。(现代电子商务也是以互联网为基础的。)由于互联网的开放性,任何人都可以自由地接入互联网,使得有些不诚实者就有可能采用各种非法手段进行破坏。因此人们十分关心在网络上交换信息的安全性。普遍认为密码学方法是解决信息安全保护的一个最有效和可行的方法。有效是指密码能做到使信息不被非法窃取,不被篡改或破坏,可行是说它需要付出的代价是可以接受的。

密码是形成一门新的学科是在20世纪70年代。它的理论基础之一应该首推1949年Shannon的一篇文章“保密系统的通信理论”,该文章用信息论的观点对信息保密问题作了全面的阐述。这篇文章过了30年后才显示出它的价值。1976年,Diffie和Hellman发表了论文《密码学的新方向》,提出了公钥密码体制的新思想,这一思想引发了科技界对研究密码学的极大兴趣,大量密码学论文开始公开发表,改变了过去只是少数人关起门来研究密码学的状况。同时为了适应计算机通信和电子商务迅速发展的需要,密码学的研究领域逐渐从消息加密扩大到数字签名、消息认证、身份识别、

[1]

抗欺骗协议等新课题。

美国国家标准局(NBS)1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,并批准用于非机密单位及商业上的保密通信。于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。1977年1月,美国政府颁布:采用IBM公司1971年设计出的一个加密算法作为非机密数据的正式数据加密标准(DES : Data Encryption Standard)。DES广泛应用于商用数据加密,算法完全公开,这在密码学史上是一个创举[2]。

在密码学的发展过程中,DES算法起了非常重要的作用。本次学年论文介绍的就是分组加密技术中最典型的加密算法——DES算法。

1概述

1.1 加密与解密

加密技术是基于密码学原理来实现计算机、网络乃至一切信息系统安全的理论与技术基础。简

第1页共21页

陕西理工学院毕业论文(设计)

单的说,加密的基本意思是改变信息的排列形式,使得只有合法的接受才能读懂,任何他人即使截取了该加密信息也无法使用现有的手段来解读。解密是我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

1.2 单钥密码系统

密码学中有两种重要类型的密码系统,单钥(私钥)和双钥(公钥)密码系统。在单钥密码系统中,明文的加密和密文的解密是用同样的密钥。直到1976年Diffie、Hellman引入公钥(双钥)密码学之前,所有的密码都是单钥系统,因此单钥系统也称为传统密码系统。传统密码系统广泛地

[3]

用在今天的世界上,有两种单钥密码体制:流密码和分组密码。

流密码是利用密钥k产生一个密钥流z=z0z1…,并使用如下规则对明文串x=x0x1x2…加密: y=y0y1y2…=Ez0(x0)Ez1(x1)Ez2(x2)…。密钥流由密钥流发生器f产生: zi=f(k,σi),这里σi是加密器中的记忆元件(存储器)在时刻i的状态,f是由密钥k和σi产生的函数[3]。

而分组密码就是将明文消息序列:

m1,m2,?,mk,?

划分为等长的消息组

(m1,m2,?m),(mn?1,mn?2,?,m2n),?

各组明文分别在密钥k=(k1,k2,?,kt)的控制下,按固定的算法Ek一组一组进行加密。加密后输出等长密文组

(y1,?,ym),(ym?1,?,y2m),?

分组密码的模型,如图1.1所示[3]。

图1.1 分组密码的模型

它与流密码的不同之处在于输出的每一位数字不只与相应时刻输入明文数字有关,而是与一组长为m的明文数组有关。它们的区别就在于有无记忆性(如图1.2)。流密码的滚动密钥z0=f(k,σ0)由函数f、密钥k和指定的初态σ0完全确定。此后,由于输入加密器的明文可能影响加密器中内部记忆元件的存储状态,因而σi(i>0)可能依赖于k,σ0,x0,x1,…,xi-1等参数。

图1.2流密码与分组密码的区别

分组密码的优点在于其容易实现同步,因为一个密文组的传输错误不会影响其他组,丢失一个明密文组不会对其后的组的解密正确性带来影响。

分组密码又分为三类:代替密码(Substitution)、移位密码(Transposition)和乘积密码。随着计算技术的发展,早期的代替和移位密码已无安全可言。一个增加密码强度的显然的方法是合并代替和移位密码,这样的密码称为乘积密码。如果密文是由明文运用轮函数多次而得,这样的乘积密

第2页共21页

陕西理工学院毕业论文(设计)

码又称为迭代分组密码。DES和今天的大多数分组密码都是迭代分组密码。

[4]

目前著名的对称分组密码系统算法有DES、IDEA、Blowfish、RC4、RC5、FEAL等。 1.3分组密码的总体结构

分组密码采用两种类型的总体结构:SP网络与Feistel网络,它们的主要区别在于:SP结构每轮改变整个数据分组,而Feistel密码每轮只改变输入分组的一半。AES和DES分别是这两种结构的代表。Feistel网络(又称Feistel结构)可把任何轮函数转化为一个置换,它是由Horst Feistel在设计Lucifer分组密码时发明的,并因DES的使用而流行,“加解密相似”是Feistel型密码的实现优点。SP网络(又称SP结构)是Feistel网络的一种推广,其结构清晰,S一般称为混淆层,主要起混淆作用,P一般称为扩散层,只要起扩散作用。SP网络可以更快速的扩散,不过SP网络的加解密通常不相似[4]。

1.4分组密码的安全性

安全性是分组密码最重要的设计原则,它要求即使攻击者知道分组密码的内部结构,仍不能破译该密码,这也意味着,不存在针对该密码的某种攻击方法,其工作量小于穷密钥搜索。但是随着密码分析技术的发展,使得对于具有更多轮的分组密码的破译成为可能。

[4]

2.DES算法简介

2.1简介

DES是Data Encryption Standard(数据加密标准)的缩写。它是由IBM公司在1971年设计出的

[5]

一个加密算法,美国国家标准局(NBS)于1977年公布把它作为非机要部门使用的数据加密标准。 DES自从公布以来,已成为金融界及其他各种行业最广泛应用的对称密钥密码系统。DES是分组密码的典型代表,也是第一个被公布出来的标准算法。原来规定DES算法的使用期为10年,可能是DES尚未受到严重威胁,更主要是新的数据加密标准研制工作尚未完成,或意见尚未统一,所以当时的美国政府宣布延长它的使用期。因而DES超期服役到2000年。近三十年来,尽管计算机硬件及破解密码技术的发展日新月异,若撇开DES的密钥太短,易于被使用穷举密钥搜寻法找到密钥的攻击法不谈,直到进入20世纪90年代以后,以色列的密码学家Shamir等人提出一种“差分分析法”,以后日本人也提出了类似的方法,这才称得上对它有了攻击的方法。严格地说Shamir的“差分分析法”也只是理论上的价值。至少到目前为止是这样,比如后来的“线形逼迫法”,它是一种已知明文攻击,需要243≈4.398×1012个明、密文对,在这样苛刻的要求下,还要付出很大的代价才能解出一个密钥。不管是差分攻击还是线性攻击法,对于DES的安全性也仅仅只做到了“质疑”的地步,并未从根本上破解DES。也就是说,若是能用类似Triple-DES或是DESX的方式加长密钥长度,仍不失为一个安全的密码系统[7,5]。

早在DES提出不久,就有人提出造一专用的装置来对付DES,其基本思想无非是借用硬件设备来实现对所有的密钥进行遍历搜索。由于电子技术的突飞猛进,专门设备的造价大大降低,速度有质的飞跃,对DES形成了实际的威胁。DES确实辉煌过,它的弱点在于专家们一开始就指出的,即密钥太短。美国政府已经征集评估和判定出了新的数据加密标准AES以取代DES对现代分组密码理论的发展和应用起了奠基性的作用,它的基本理论和设计思想仍有重要参考价值[6,7]。

2.2 DES加密标准

现如今,依靠Internet的分布式计算能力,用穷举密钥搜索攻击方法破译已成为可能。数据加密标准DES已经达到它的信任终点。但是作为一种Feistel加密算法的例子仍然有讨论的价值。

DES是对二元数字分组加密的分组密码算法,分组长度为64比特。每64位明文加密成64位密文,没有数据压缩和扩展,密钥长度为56比特,若输入64比特,则第8,16,24,32,40,48,56,64为奇偶校验位,所以,实际密钥只有56位。DES算法完全公开,其保密性完全依赖密钥。

它的缺点就在于密钥太短。

设明文串m=m1m2?m64;密钥串k=k1k2?k64。

第3页共21页

陕西理工学院毕业论文(设计)

在后面的介绍中可以看到k8,k16,k24,k32,k40,k48,k56,k64实际上是不起作用的。

DES的加密过程可表示为:

DES(m)= IP-1T16·T15?T2·T1·IP(m). 下面是完全16轮DES算法框图:

图2.1 完全16轮DES算法

2.2.1 初始置换IP

初始置换是将输入的64位明文分为8个数组,每一组包括8位,按1至64编号。 IP的置换规则如下表[7]:

表2.1 IP置换规则 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 即将输入的第58位换到第1位,第50位换到第2位??,依次类推,最后一位是原来的第7位。

2.2.2 IP-1是IP的逆置换

由于第1位经过初始置换后,已处于第40位。逆置换就是再将第40位换回到第1位。

[7]

逆置换规则如下表所示:

表2.2 IP-1置换

第4页共21页

陕西理工学院毕业论文(设计)

40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25 初始置换IP及其逆置换IP并没有密码学意义,因为置换前后的一一对应关系是已知的。它们的作用在于打乱原来输入明文的ASCⅡ码字划分的关系,并将原来明文的第位m8,m16,m24,m32,m40,m48,m56,m64位(校验位)变成IP的输出的一个字节。

2.2.3 DES算法的迭代过程

-1

图2.2 DES算法的迭代过程图

图中Li-1和Ri-1分别是第i-1次迭代结果的左右两部分,各32比特。即Li=Ri-1, Ri=Li-1 f(Ri-1,ki)。其中轮密钥Ki为48比特,函数F(R,K)的计算过程如图1.5所示。轮输入的右半部分R为32比特,R首先被扩展成48比特,扩展过程由表3定义,其中将R的16个比特各重复一次。扩展后的48比特再与子密钥Ki异或,然后再通过一个S盒,产生32比特的输出。该输出再经过一个由表4定义的置换,产生的结果即为函数F(R,K)的输出。

表2.3 扩展E 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 第5页共21页

陕西理工学院毕业论文(设计)

28 29 30 31 32 1 ki是由64比特的初始密钥(亦称种子密钥)导出的第i轮子密钥,ki是48比特

DES算法的关键是f(Ri-1,ki)的功能,其中的重点又在S-盒(Substitution Boxes)上。F函数的输出是32比特。

图2.3 F函数计算过程图

将R经过一个扩展运算E变为48位,记为E(R)。计算E(R)?K=B,对B施行代换S,此代换由8个代换盒组成,即S-盒。每个S-盒有6个输入,4个输出,将B依次分为8组,每组6位,记B= B1B2B3B4B5B6B7B8其中Bj作为第j个S-盒的输入,其输出为Cj,C= C1C2C3C4C5C6C7C8就是代换S的输出,所以代换S是一个48位输入,32位输出的选择压缩运算,将结果C再实行一个置换P(表4),即得F(R,K)。

其中,扩展运算E与置换P主要作用是增加算法的扩散效果。S-盒是DES算法中唯一的非线性部件,当然也就是整个算法的安全性所在。它的设计原则与过程一直因为种种不为人知的因素所限,而未被公布出来。

S-盒如下表[7]:

表2.4 S-盒函数 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 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

10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8 S3 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

第6页共21页

15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10 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 S2 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5 S1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8 陕西理工学院毕业论文(设计)

7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15 S4 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 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9 4 5 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 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11 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 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1 S7 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 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7 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 S8 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2 S6 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8 S5 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6 S-盒的置换规则为:

取{0,1,?,15}上的4个置换,即它的4个排列排成4行,得一4*16矩阵。若给定该S盒的6个输入为b0 b1 b2 b3 b4 b5,在Si表中找出b0 b5行,b1b2 b3b4列的元素,以4位二进制表示该元素,此为S-盒Si的输出[7]。

例2.1 S2的输入为101011,

b1 =1,b6=1,b1 b6=(11)2=3 (b2 b3 b4 b5)2=(0101)2=5

查S2表可知第3行第5列的输出是15,15的二进制表示为1111。 则S2的输出为1111。8个S-盒的代换方式都是一样的。

S盒输出的32比特经P置换,P置换的功能是将32位的输入,按以下顺序置换,然后输入仍为32比特。P置换的顺序如表2.5[7]:

表2.5 置换P 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 13 30 6 22 11 4 25 第7页共21页

陕西理工学院毕业论文(设计)

2.2.4 子密钥的生成

初始密钥K(64bit) PC-1 C0(28bit) D0(28bit) LS1 LS1

C1 D1 PC-2 K1 LS2 LS2 . . .

LS16 LS16 C16 D16 PC-2 K16 图2.4 DES子密钥生成流程图

图2.4给出了子密钥产生的流程图。首先对初始密钥经过置换PC-1(表2.6[7]),将初始密钥的8个奇偶校验位剔除掉,而留下真正的56比特初始密钥。

表2.6 密钥置换PC-1 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 然后将此56位分为C0,D0两部分,各28比特,C0,D0如下:

C0=k57k49??k44k36 D0=k63k55??k12k4

然后分别进行一个循环左移函数LS1,得到C1,D1,将C1(28位),D1(28位)连成56比特数

第8页共21页

陕西理工学院毕业论文(设计)

据,再经过密钥置换PC-2(表2.7)做重排动作,从而便得到了密钥K1(48位)。依次类推,便可得到K2,K3??K16。

表2.7 密钥置换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 [7]

其中LS1(1≤i≤16)表示一个或两个位置的循环左移,当i=1,2,9,16时,移一个位置,当i=3,4,5,6,7,8,10,11,12,13,14,15时,移两个位置。

2.3 DES算法的解密过程

DES算法的解密过程跟加密过程是一样的,区别仅仅在于第一次迭代时用密钥k16,第二次k15、??,最后一次用k1,算法本身没有任何变化。

3.DES算法用C++语言实现

3.1设置密钥函数des_setkey()

此函数的功能是由64比特的密钥产生16个子密钥ki。首先将密钥字节组key[8]转换为64比特的位组,然后进行密钥变换PC-1(祥见PC-1置换表),置换后得到56比特的密钥,把变换后的密钥等分成两部分,前28位记为C0, 后28位记为D0。将C0,D0进行LS1运算,LS1是循环左移运算。得到C1 ,D1,最后将其进行PC-2置换(见PC-2置换表),得到子密钥k1.然后依次按循环左移LSi(I=2~16,循环次数见循环左移规则), PC-2置换得到k2~ k16。 void des_setkey(const char key[8]);

static void f_func(bool in[32],const bool ki[48]);//f函数 static void s_func(bool out[32],const bool in[48]);//s盒代替 //变换

static void transform(bool *out, bool *in, const char *table, int len); static void xor(bool *ina, const bool *inb, int len);//异或 static void rotatel(bool *in, int len, int loop);//循环左移

3.2 f函数和S函数f_func()和s_func()

此函数的功能是DES算法的关键,f是将32比特的输入转化为32比特的输出。 这个两个函数中主要用到以下函数: (1) transform()

此函数是通用置换函数,根据具体情况确定要执行哪种置换。在f函数中,先用于E置换,然后进行P置换。

void transform(bool *out,bool *in,const char *table,int len) {

static bool tmp[256]; for(int i=0;i

第9页共21页

陕西理工学院毕业论文(设计)

}

(2)e_table()

E置换表,作用是将32比特的输入扩展为48比特。

E输出的48比特的数据跟生成的子密钥进行异或运算,然后把得到的48比特的数据按顺序分成8组,每组6比特,分别通过S1, S2 ,??,S8盒后又缩为32比特,即每盒输入为6比特,输出为4比特。将输出的32比特的数据经P置换,最后得到32比特的数据。static const char e_table[48]={ 32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9,10,11,12,11,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1}。

(3)s_box S盒。

void s_func(bool out[32],const bool in[48]) {

for(char i=0,j,k;i<8;i++,in+=6,out+=4) {

j=(in[0]<<1)+in[5];

k=(in[1]<<3)+(in[2]<<2)+(in[3]<<1)+in[4]; bytetobit(out,&s_box[i][j][k],4); } }

(4)p_table()

P置换表。const static char

p_table[32]={16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25}。

(5)xor()

此函数的功能是进行异或运算,异或运算是按位作不进位加法运算。 void xor(bool *ina,const bool *inb,int len) {

for(int i=0;i

(6) bytetobit()

此函数的功能是将输入的字节组转换为位组。 void bytetobit(bool *out,const char *in,int bits) {

for(int i=0;i

out[i]=(in[i/8]>>(i%8)) &1; }

与此相关的还有函数ttobyte()

此函数的功能是将位组转换字节组。 void bittobyte(char *out,const bool *in,int bits) {

memset(out,0,(bits+7)/8); for(int i=0;i

out[i/8]|=in[i]<<(i%8); }

3.3 DES算法的运行函数des_run( )

第10页共21页

陕西理工学院毕业论文(设计)

这个函数整个算法运行程序的最主要部分。这个函数用于加密还是解密取决于type的类型,如果type为encrypt,则进行加密;如果type的类型为decrypt,则进行解密。 void des_run(char out[8],char in[8], bool type) {

static bool m[64],tmp[32],*li=&m[0], *ri=&m[32]; bytetobit(m,in,64);

transform(m,m,ip_table,64); if(type==encrypt){

for(int i=0;i<16;i++){ memcpy(tmp,ri,32); f_func(ri,subkey[i]); xor(ri,li,32);

memcpy(li,tmp,32); }

}else{

for(int i=15;i>=0;i--){ memcpy(tmp,li,32); f_func(li,subkey[i]); xor(li,ri,32);

memcpy(ri,tmp,32); }

}

transform(m,m,ipr_table,64); bittobyte(out,m,64); }

这个函数用到以下函数: (1) bytetobit()

此函数的功能是将输入的字节组转换为位组。 (2) transform()

此函数是通用置换函数,根据具体情况确定要执行哪种置换。 (3) memcpy()

此函数是库函数,主要作用是进行内存单元的复制。 (4) f_func()

此函数是des_run()函数运行的关键,是将32比特的输入转化为32比特的输出 (5)xor()

此函数的功能是进行异或运算,异或运算是按位作不进位加法运算。 (6)bittobyte()

此函数的功能是将位组转换字节组。

3.4 DES算法的主函数void main()

主函数的流程: void main() {

char key[8]={'p','r','o','g','r','a','m'},str[8];

puts(\ printf(\

第11页共21页

陕西理工学院毕业论文(设计)

printf(\

puts(\ gets(str); printf(\

puts(\ des_setkey(key);

des_run(str,str,encrypt); puts(\ puts(str); printf(\

puts(\ puts(\ des_run(str,str,decrypt); puts(str); printf(\

puts(\ printf(\

}

此函数贯穿整个函数。首先是初设密钥,然后调用密钥设置函数des_setkey()和DES算法的运行函数des_run(),最后得出密文以及解密后的文字。

3.5 DES的加密过程和举例

设明文m=computer,密钥k为program,它们用ASCII码表示为: m= 01100011 01101111 01101101 01110000 01110101 01110100 01100101 01110010 k= 01110000 01110010 01101111 01100111 01110010 01101101 01101101

这里的k只有56位,由于第8,16,24,32,40,48,58,64位不起作用,所以没有赋值。也就是其中的k8 k16 k24 k32 k40 k48 k56 k64不起作用。其中的密钥为64比特如下:

k=0111000*0011100*1001101*1110110* 0111011*1001001*1000010*1101101*

在这里密钥K是在主函数中已设定,所以在程序运行时只输入明文就可以了。 密钥k经过PC-1置换后,分成两组C0,D0。可得 C0=11101100 10011001 00011011 1011 D0=10110100 01011000 10001110 0111

C0,D0 分别进行循环左移运算,得到C1,D1。 C1=11011001 00110010 00110111 0111 D1=01101000 10110001 00011100 1111

依次类推,C1,D1继续进行循环左移,最后得到C2,D2进行循环左移,得到C3,D3??C16,D16。

C1,D1进行PC-2置换,得到密钥k1,可得:

K1=00111101 10001111 11001101 00110111 00111111 01001000

依次类推,C2,D2进行PC-2置换,得到密钥k2, C3,D3进行PC-2置换得到k3,??C16,D16进行PC-2置换得到k16。

明文M进行IP置换后,分成两组:L0,R0,可得: L0=11111111 10111000 01110110 01010111

第12页共21页

陕西理工学院毕业论文(设计)

R0=00000000 11111111 00000110 10000011

R0进行E膨胀后,与密钥k1进行异或运算,得到48比特的数据 S=10111101 10011000 00110011 10110111 11101011 01001110 将这些数据分别装入S盒:

(1) 101111进入S1,从S1的第3行第7列的元素7,可知其输出为0111 (2) 011001进入S2,从S2的第1行第12列的元6,可知其输出为0110 (3) 100000进入S3,从S3的第2行第0列的元素13,可知其输出为1101 (4) 110011进入S4,从S4的第3行第9列的元素4,可知其输出为0100 (5) 101101进入S5,从S5的第3行第6列的元素2,可知其输出为0010 (6) 111110进入S6,从S6的第2行第15列的元素6,可知其输出为0100 (7) 101101进入S7,从S7的第3行第6列的元素10,可知其输出为1010 (8) 001110进入S8,从S8的第0行第7列的元素1,可知其输出为0001 故8个S盒的输出为:

01110110 11010100 00100110 10100001 最后通过P得f(R0,k1)为:

01110110 11010100 00100110 10100001 L0 f(R0,k1)得到R1:

R1=10111011 10011001 11101001 11001100

L1= R0=00000000 11111111 00000110 10000011 经过16轮的迭代最后得到:

L16= R15=01010010 10011000 11000001 01011010 R16=11101000 10000011 01111000 01001100 最后经过IP逆置换后得到密文如下:

00100100 01100001 00000010 10011011 01011001 10001000 11001111 10110100

程序解密过程(略) 3.6 DES算法的分析

DES算法具有极高安全性,最初,除了用穷举搜索法对DES算法进行攻击外,并没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度[4]。

在DES算法作为一个标准时,曾出现过许多的批评,其中之一就是针对S盒的。DES里的所有计算,除去S盒全是线性的,也就是说,计算两个输出的异或与先将两个对应输入异或再计算其输出是相同的。作为非线性部件,S盒针对密码体制的安全性至关重要。在算法提出时,就有人怀疑S盒隐藏了“陷门”。而美国国家安全局能够轻易的解密消息,同时还能宣称DES算法是“安全”的。当然无法否认这一猜测,然而到目前为止,并没有任何证据证明DES里的确存在陷门[1]。

事实上,后来表明DES里的S盒是被设计成能够防止某些类型的攻击的。在20世纪90年代初,Biham与Shamir发现差分分析时,美国国家安全局就已承认某些未公布的S盒设计原则正是为了使得差分密码分析变得不可行。事实上,差分密码分析在DES最初被研发时就已成为IBM的研究者所知,但这种方法却被保留了将近20年,直到Biham与Shamir又独立地发现了这种攻击[7]。

对DES算法最中肯的批评是,密钥太短。DES算法中只用到64位密钥中的其中56位,第8、16、24、......64位8个位并未参与DES运算,而是用作奇偶校验。在所有的密钥空间中有极少量的弱密钥,如全0和全F的密钥等,在选择时应尽量避免。这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因

第13页共21页

陕西理工学院毕业论文(设计)

此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,..... .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。总之,DES密钥太短,超期服役的时间也太长。新的攻击手段不断出现,DES以面临实实在在的威胁。直接的威胁还是在于专用设备,由于芯片的速度越来越快,造价越来越便宜,导致专用设备的造价也大大的降低。

DES算法除了差分密码分析另外两种最重要的密码攻击是穷尽密钥搜索和线性密码分析。对DES算法而言,线性攻击更有效。在1994年,一个实际的线性密码分析由其发明者Matsui提出。这是一个使用243对明文-密文,又用了40天来找到密钥。这个密码分析并未对DES的安全性产生实际影响,由于这个攻击需要数目极大的明-密文对,在现实世界中一个敌手很难积攒下用同一密钥加密的如此众多的明-密文对[5]。

虽然DES加密算法已经过时,但它的基本理论和设计思想仍有重要参考价值。

第14页共21页

陕西理工学院毕业论文(设计)

参考文献

[1]Richard Spillman著,叶阮健,曹英,张长富译.经典密码学与现代密码学.北京:清华大学出版社,2005,124-133. [2]Oded Goldreich.Foundations of Cryptography Volume Ⅱ Basic Applications[M],BEIJING:Publishing House of Electronics Industry,2005年, 375-379.

[3]赖溪松,韩亮,张真诚著.计算机密码学及其应用[M].北京:国防工业出版社,2007, 43-49.

[4]D.Coppersmith, The Data Encryption Standard (DES) and its strength against attacks[J].IBM Journal of Research and Development, 38(3),.243-250.

[5]孙淑玲编著,应用密码学.北京:清华大学出版社,2004年, 11-19.

[6]K.Campbell and M.Wiener, DES is not a group,Advances in Cryptology-CRYPTO ’92,Lecture Notes in Computer Science 740,Springer-Verlag,1993, 512-520.

[7]卢开橙编著.计算机密码学—计算机网络中的数据保密与安全[M].北京:清华大学出版社,2003年,.38-48.

DES encryption algorithm analysis

Cai Peng

(Grade04,Class4,Major information and computer science,Department of Mathematics,

Shaanxi University of Technology,Hanzhong 723000,Shaanxi)

Tutor: Zhang Lingshuang

Abstract:DES data encryption algorithm is the most widely used packet encryption algorithm, the most famous as

the secret key or symmetric key encryption algorithms, the computer cryptography and computer data communications in the course of development played a major role. In this paper, mainly the study of data on DES symmetric key encryption algorithms, and using c + +. DES algorithm has higher security, for our general computer data transmission activities provide a security guarantee.

Key word: encryption and decipher; des algorithm; S-Boxes.

第15页共21页

陕西理工学院毕业论文(设计)

附录:DES算法用C++实现的源代码

用C++实现的源代码

#include \#include \

enum {encrypt,decrypt};//ENCRYPT:加密,DECRYPT:解密 void des_run(char out[8],char in[8],bool type=encrypt); //设置密钥

void des_setkey(const char key[8]);

static void f_func(bool in[32],const bool ki[48]);//f函数 static void s_func(bool out[32],const bool in[48]);//s盒代替 //变换

static void transform(bool *out, bool *in, const char *table, int len); static void xor(bool *ina, const bool *inb, int len);//异或 static void rotatel(bool *in, int len, int loop);//循环左移 //字节组转换成位组

static void bytetobit(bool *out,const char *in, int bits); //位组转换成字节组

static void bittobyte(char *out, const bool *in, int bits); //置换IP表 conststatic char

ip_table[64]={58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7}; //逆置换IP-1表 const static char

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

static const char e_table[48]={32,1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9,

10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1}; //P换位表

const static char

p_table[32]={16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25}; //pc1选位表

const static char pc1_table[56]={

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

//pc2选位表

const static char pc2_table[48]={

14,17,11,24,1,5,3,28,

第16页共21页

陕西理工学院毕业论文(设计)

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 };

//左移位数表

const static char loop_table[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //S盒

const static char s_box[8][4][16]={ //s1

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, //s2

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, //s3

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, //s4

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, //s5

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, //s6

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, //s7

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, //s8

第17页共21页

陕西理工学院毕业论文(设计)

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 };

static bool subkey[16][48];//16圈子密钥

void des_run(char out[8],char in[8], bool type) {

static bool m[64],tmp[32],*li=&m[0], *ri=&m[32]; bytetobit(m,in,64);

transform(m,m,ip_table,64); if(type==encrypt){

for(int i=0;i<16;i++){ memcpy(tmp,ri,32); f_func(ri,subkey[i]); xor(ri,li,32);

memcpy(li,tmp,32); } }else{

for(int i=15;i>=0;i--){ memcpy(tmp,li,32); f_func(li,subkey[i]); xor(li,ri,32);

memcpy(ri,tmp,32); } }

transform(m,m,ipr_table,64); bittobyte(out,m,64); }

void des_setkey(const char key[8]) {

static bool k[64], *kl=&k[0], *kr=&k[28]; bytetobit(k,key,64);

transform(k,k,pc1_table,56); for(int i=0;i<16;i++) {

rotatel(kl,28,loop_table[i]); rotatel(kr,28,loop_table[i]);

transform(subkey[i],k,pc2_table,48); } }

void f_func(bool in[32],const bool ki[48]) {

static bool mr[48];

transform(mr,in,e_table,48); xor(mr,ki,48);

第18页共21页

陕西理工学院毕业论文(设计)

s_func(in,mr);

transform(in,in,p_table,32); }

void s_func(bool out[32],const bool in[48]) {

for(char i=0,j,k;i<8;i++,in+=6,out+=4) {

j=(in[0]<<1)+in[5];

k=(in[1]<<3)+(in[2]<<2)+(in[3]<<1)+in[4]; bytetobit(out,&s_box[i][j][k],4); } }

void transform(bool *out,bool *in,const char *table,int len) {

static bool tmp[256]; for(int i=0;i

void xor(bool *ina,const bool *inb,int len) {

for(int i=0;i

void rotatel(bool *in,int len,int loop) {

static bool tmp[256]; memcpy(tmp,in,loop);

memcpy(in,in+loop,len-loop); memcpy(in+len-loop,tmp,loop); }

void bytetobit(bool *out,const char *in,int bits) {

for(int i=0;i

out[i]=(in[i/8]>>(i%8)) &1; }

void bittobyte(char *out,const bool *in,int bits) {

memset(out,0,(bits+7)/8); for(int i=0;i

out[i/8]|=in[i]<<(i%8); }

void main() {

char key[8]={'p','r','o','g','r','a','m'},str[8];

puts(\

第19页共21页

陕西理工学院毕业论文(设计)

printf(\ printf(\

puts(\ gets(str); printf(\

puts(\ des_setkey(key);

des_run(str,str,encrypt); puts(\ puts(str); printf(\

puts(\ puts(\ des_run(str,str,decrypt); puts(str); printf(\

puts(\ printf(\

}

第20页共21页

本文来源:https://www.bwwdw.com/article/lw3p.html

Top