当前位置:文档之家› DES加密算法设计(含程序)

DES加密算法设计(含程序)

DES加密算法设计(含程序)
DES加密算法设计(含程序)

DES加密算法分析

[摘要]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.2 单钥密码系统

密码学中有两种重要类型的密码系统,单钥(私钥)和双钥(公钥)密码系统。在单钥密码系统中,明文的加密和密文的解密是用同样的密钥。直到1976年Diffie、Hellman引入公钥(双钥)密码学之前,所有的密码都是单钥系统,因此单钥系统也称为传统密码系统。传统密码系统广泛地用在今天的世界上,有两种单钥密码体制:流密码和分组密码[3]。

流密码是利用密钥k产生一个密钥流z=z0z1…,并使用如下规则对明文串x=x0x1x2…加密:

y=y0y1y2…=E z0(x0)E z1(x1)E z2(x2)…。密钥流由密钥流发生器f产生:z i=f(k,σi),这里σi是加密器中的记忆元件(存储器)在时刻i的状态,f是由密钥k和σi产生的函数[3]。

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

m 1,m

2

,…,m

k

,…

划分为等长的消息组

(m

1,m

2

,…m),(m

1+

n

,m

2

+

n

,…,m

n2

),…

各组明文分别在密钥k=(k1,k2,…,k t)的控制下,按固定的算法E

k

一组一组进行加密。加密后输出等长密文组

(y

1,…,y

m

),(y

1+

m

,…,y

m

2

),…

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

图1.1 分组密码的模型

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

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

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

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

目前著名的对称分组密码系统算法有DES、IDEA、Blowfish、RC4、RC5、FEAL等[4]。

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分组密码的安全性

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

2.DES算法简介

2.1简介

DES是Data Encryption Standard(数据加密标准)的缩写。它是由IBM公司在1971年设计出的一个加密算法,美国国家标准局(NBS)于1977年公布把它作为非机要部门使用的数据加密标准[5]。

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 (64)

在后面的介绍中可以看到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置换

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-1并没有密码学意义,因为置换前后的一一对应关系是已知的。它们的作用在于打乱原来输入明文的ASCⅡ码字划分的关系,并将原来明文的第位m8,m16,m24,m32,m40,m48,m56,m64位(校验位)变成IP的输出的一个字节。

2.2.3 DES算法的迭代过程

图2.2 DES算法的迭代过程图

图中L i-1和R i-1分别是第i-1次迭代结果的左右两部分,各32比特。即L i=R i-1, R i=L i-1 f(R i-1,k i)。其中轮密钥K i为48比特,函数F(R,K)的计算过程如图1.5所示。轮输入的右半部分R为32比特,R 首先被扩展成48比特,扩展过程由表3定义,其中将R的16个比特各重复一次。扩展后的48比特再与子密钥K i异或,然后再通过一个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

28 29 30 31 32 1

k i是由64比特的初始密钥(亦称种子密钥)导出的第i轮子密钥,k i是48比特

DES算法的关键是f(R i-1,k i)的功能,其中的重点又在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= B 1B 2B 3B 4B 5B 6B 7B 8其中B j 作为第j 个S-盒的输入,其输出为C j ,C= C 1C 2C 3C 4C 5C 6C 7C 8就是代换S 的输出,所以代换S 是一个48位输入,32位输出的选择压缩运算,将结果C 再实行一个置换P (表4),即得F(R,K)。

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

S-盒如下表[7]:

表2.4 S-盒函数

S 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 1

5 12 9 7 3 10 5 0 15 12 8 2 4 9 1 7 5 11 3 14 10 0

6 13

S 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 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 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

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

S612 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

S813 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-盒的置换规则为:

取{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

2.2.4 子密钥的生成

初始密钥K(64bit)

. . .

图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位分为C 0,D 0两部分,各28比特,C 0,D 0如下:

C 0=k 57k 49……k 44k 36

D 0=k 63k 55……k 12k 4

然后分别进行一个循环左移函数LS 1,得到C 1,D 1,将C 1(28位),D 1(28位)连成56比特数据,再经过密钥置换PC-2(表2.7[7])做重排动作,从而便得到了密钥K 1(48位)。依次类推,便可得到K 2,K 3……K 16。

表2.7 密钥置换PC-2

PC-1

C 0(28bit )

D 0(28bit )

LS 1 LS 1

C 1

D 1

LS 2

LS 2

LS 16 LS 16

C 16

D 16

PC-2 PC-2 K 16

K 1

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

其中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

tmp[i]=in[table[i]-1];

memcpy(out,tmp,len);

}

(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

ina[i]^=inb[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( )

这个函数整个算法运行程序的最主要部分。这个函数用于加密还是解密取决于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("*****************DES***********************");

printf("\n");

printf("\n");

puts("please input your words");

gets(str);

printf("\n");

puts("****************************************");

des_setkey(key);

des_run(str,str,encrypt);

puts("after encrypting:");

puts(str);

printf("\n");

puts("****************************************");

puts("after decrypting:");

des_run(str,str,decrypt);

puts(str);

printf("\n");

puts("****************************************");

printf("\n");

}

此函数贯穿整个函数。首先是初设密钥,然后调用密钥设置函数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 (16)

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

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 101101 00

程序解密过程(略)

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才得以保证的。因此,在实际应用中,我们应避开使用第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加密算法已经过时,但它的基本理论和设计思想仍有重要参考价值。

参考文献

[1]Richard Spillman著,叶阮健,曹英,张长富译.经典密码学与现代密码学.北京:清华大学出版社,2005,124-133.

[2]Oded Goldreich.Foundations of Cryptography V olume Ⅱ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.

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

用C++实现的源代码

#include "memory.h"

#include "stdio.h"

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,

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

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

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

tmp[i]=in[table[i]-1];

memcpy(out,tmp,len);

}

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

{

for(int i=0;i

ina[i]^=inb[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("*****************DES***********************");

printf("\n");

printf("\n");

puts("please input your words");

gets(str);

printf("\n");

puts("****************************************");

des_setkey(key);

des_run(str,str,encrypt);

puts("after encrypting:");

puts(str);

printf("\n");

puts("****************************************");

puts("after decrypting:");

des_run(str,str,decrypt);

puts(str);

printf("\n");

puts("****************************************");

printf("\n");

}

密码学基础课程设计指导书

《现代密码学基础》课程设计指导书 杨柳编 湖南科技大学计算机科学与工程学院 2014年12月

一、概述 本课程在简要复习数学基础知识之后,探讨了密码学研究的基本问题:通过不安全的通信媒介如何进行安全通信。也可以理解为关心任何希望限制不诚实者达到目的的问题,把度量和评价一个密码体制(协议)的安全性作为一个重点。就目前来说,密码学的研究领域已从消息加密扩大到了数字签名、消息认证、身份识别、抗欺骗协议等。无疑,在整个教学过程中非常重视密码学的基础,当然包括数学基础。并针对实际的密码体制(协议)强调设计与分析(攻击),对现代密码学的主要研究问题都进行了介绍。 对于密码学这样的课程,同学们一定要从理论、技术、应用三个方面进行学习与思考。密码体制(协议)无疑是我们的学习重点,密码体制(协议)也可以单纯地理解为计算机算法,从而有设计、分析、证明、实现的问题。实现密码体制(协议)就是我们经常讲的八个字:模型、算法、程序、测试。 二、课程设计步骤 课程设计步骤要求如下: 1.模型 从数学的角度看,解决任何问题都要建立一个数学模型,对于密码学来说更是如此。我们还可以认为,数据结构中的存储结构也是模型。于是这一部分的任务就是建立起问题的逻辑结构和存储结构,为算法设计和编码实现打下基础。 2.算法 这一部分对同学们的要求是能看懂书上的常用算法,并对其中的参数可以进行调整和设置,能实现和应用它们。 3.程序 编码实现得到程序。 4. 测试 5. 提交课程设计报告

三、课程设计报告编写要求 课程设计报告开头标明课程设计题目、设计者的班级、姓名、学号和完成日期,内容包括:模型、算法、程序、测试四个部分。 四、设计要求 可以只做第7题,不做第7题的要做第1题-第6题。 五、课程设计题目 大整数运算包的设计与实现 1.问题描述 大整数运算是现代密码学算法实现的基础,重要性不言而喻。大整数我们指的是二进制位512、1024和2048的数,一般的语言不支持。 2.基本要求 以类库头文件的形式实现。 3.实现提示 在选择了大整数的存储结构之后,主要实现以下运算: ①模加; ②模减; ③模乘; ④模整除; ⑤模取余。这五种运算模拟手算实现。 ⑥幂模:利用“平方-乘法”算法实现。 ⑦GCD:利用欧几里得算法实现。 ⑧乘法逆: 利用扩展的欧几里得算法实现。 ⑨素数判定与生成:概率性素数产生方法产生的数仅仅是伪素数,其缺点在于,

文件加密与解密—Java课程设计报告

JAVA课程设计题目:文件的加密与解密 姓名: 学号: 班级: 日期:

目录 一、设计思路 (3) 二、具体实现 (3) 三、运行调试与分析讨论 (8) 四、设计体会与小结 (11) 五、参考文献 (12) 六、附录 (12)

一、设计思路 自从Java技术出现以业,有关Java平台的安全性用由Java技术发展所引发的安全性问题,引起了越来越多的关注。目前,Java已经大量应用于各个领域,研究Java的安全性对于更好地利用Java具有深远的意义。使用Java的安全机制设计和实现安全系统更具有重要的应用价值。 本课程设计,主要实践Java安全中的JCE模块,包括密钥生成,Cipher对象初始化、加密模式、填充模式、底层算法参数传递,也涉及文件读写与对象输入输出流。 二、具体实现 本系统通过用户界面接收三个参数:明文文件、密文文件、口令。采用DES加密算法,密码分组链(Cipher Block Chaining,CBC)加密模式,PKCS#5-Padding的分组填充算法。因为CBC涉及到底层算法参数的解密密钥的传递,所以将明文文件中的字节块以密封对象(Sealed Object)的方式加密后,用对象流输出到密文文件,这样就将密文、算法参数、解密密钥三都密封到一个对象中了。口令的hash值作为产生密钥的参数。设计流程图如下所示: 文件加密与解密设计流程图

本系统中,包含Default,Shares,SecretKey,EncAndDec四个包共6个类组成。定义的几个参数:MAX_BUF_SIZE为每次从文件中读取的字节数,也是内存缓冲区的大小;加密算法为DES;加密模式是密码分组链(CBC)模式;分组填充方式是PKCS#5Padding。包和类结构图如下所示: 本课程设计,包和类结构图: 以下为包中的类的方法实现说明 Package Shares类结构图

简化DES加密算法

数据加密标准DES(Data Encryption Standard)算法是由美国IBM公司研制的一种分组密码算法,一种迭代分组密码。 DES是一种使用最为广泛的加密算法,虽然DES出现后又产生了许多常规加密算法,但DES仍是此类算法中最重要的一种。 在正式讨论DES算法之前,为了更好的理解算法的实际工作过程,我们先来看一个简化的DES算法,以此加深对DES算法的理解。 一、简化的DES加密算法 简化的DES加密算法是以8bit的明文分组和10bit密钥作为输入,产生8bit 密文分组作为输出。 1、加密流程 简化的DES算法基本加密流程如图6.9所示 图6.9 简化的DES的加密过程

2、加密算法构成: 函数、SW置换函简单DES的加密算法包括4个基本函数:初始置换函数IP、f k 数、逆置换函数IP-1。 (1)初始置换函数IP 初始置换IP是将明文中数据的排列顺序按一定的规则重新排列,而生成新的数据序列的过程。如图6.10所示: 8bit原数据位置 1 2 3 4 5 6 7 8 【IP置换】 经IP置换后的数据位置 2 6 3 1 4 8 5 7 图6.10 简单DES的初始置换 例:设8bit数据为11110011 ,则初始置换后的结果为: 函数f k函数是多个置换函数和替代函数的组合函数。f k函数首先将输(2) f k 入它的8bit数据进行分组,分成左4位和右4位,然后对右组的4位数据进行E/P扩展置换运算,接着将扩展置换所得的8bit数据与子密钥进行异或运算,再将异或运算所得结果通过S盒输出,再将通过S盒输出的数据进行P4置换,最后将经过P4置换后的数据与输入f 函数经分组的左4位数据进行异或运算。 k F(R,SK)函数是f k函数的核心函数,其中SK是子密钥。F(R,SK)函数的运算方法如下:f k(L,R)=(L⊕F(R,SK),R)L:输入的左边4位分组 R:输入的右边4位分组⊕:逐位异或 ①扩展/置换是将4bit输入数据经过置换和扩展而产生8bit数据的算法。 如图6.11所示: E/P扩展置换前 1 2 3 4 E/P扩展置换 E/P扩展置换后 4 1 2 3 2 3 4 1

DES算法实验报告

DES算法实验报告 姓名:学号:班级: 一、实验环境 1.硬件配置:处理器(英特尔Pentium双核E5400 @ 2.70GHZ 内存:2G) 2.使用软件: ⑴操作系统:Windows XP 专业版32位SP3(DirectX 9.0C) ⑵软件工具:Microsoft Visual C++ 6.0 二、实验涉及的相关概念或基本原理 1、加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。 三、实验内容 1、关键代码 ⑴子密钥产生

⑵F函数以及加密16轮迭代 2、DES加密算法的描述及流程图 ⑴子密钥产生 在DES算法中,每一轮迭代都要使用一个子密钥,子密钥是从用户输入的初始密钥产生的。K是长度为64位的比特串,其中56位是密钥,8位是奇偶校验位,分布在8,16,24,32,40,48,56,64比特位上,可在8位中检查单个错误。在密钥编排计算中只用56位,不包括这8位。子密钥生成大致分为:置换选择1(PC-1)、循环左移、置换选择2(PC-2)等变换,分别产生16个子密钥。 DES解密算法与加密算法是相同的,只是子密钥的使用次序相反。 ⑵DES加密算法 DES密码算法采用Feistel密码的S-P网络结构,其特点是:加密和解密使用同一算法、

AES密码学课程设计(C语言实现)

成都信息工程学院课程设计报告 AES加密解密软件的实现 课程名称:应用密码算法程序设计 学生姓名:樊培 学生学号:2010121058 专业班级:信息对抗技术101 任课教师:陈俊 2012 年6月7日

课程设计成绩评价表

目录 1、选题背景 (4) 2、设计的目标 (4) 2.1基本目标: (4) 2.2较高目标: (5) 3、功能需求分析 (5) 4、模块划分 (6) 4.1、密钥调度 (6) 4.2、加密 (8) 4.2.1、字节代替(SubBytes) (8) 4.2.2、行移位(ShiftRows) (10) 4.2.3、列混合(MixColumn) (11) 4.2.4、轮密钥加(AddRoundKey) (13) 4.2.5、加密主函数 (14) 4.3、解密 (16) 4.3.1、逆字节替代(InvSubBytes) (16) 4.3.2、逆行移位(InvShiftRows) (17) 4.3.3、逆列混合(InvMixCloumns) (17) 4.3.4、轮密钥加(AddRoundKey) (18) 4.3.5、解密主函数 (18) 5.测试报告 (20) 5.1主界面 (20) 5.2测试键盘输入明文和密钥加密 (20) 5.3测试键盘输入密文和密钥加密 (21) 5.3测试文件输入明文和密钥加密 (22) 5.4测试文件输入密文和密钥加密 (22) 5.5软件说明 (23) 6.课程设计报告总结 (23) 7.参考文献 (24)

1、选题背景 高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael 之命名之,投稿高级加密标准的甄选流程。(Rijndael的发音近于 "Rhine doll") 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支援更大范围的区块和密钥长度:AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;而Rijndael使用的密钥和区块长度可以是32位元的整数倍,以128位元为下限,256位元为上限。加密过程中使用的密钥是由Rijndael 密钥生成方案产生。大多数AES计算是在一个特别的有限域完成的。 截至2006年,针对AES唯一的成功攻击是旁道攻击 旁道攻击不攻击密码本身,而是攻击那些实作于不安全系统(会在不经意间泄漏资讯)上的加密系统。2005年4月,D.J. Bernstein公布了一种缓存时序攻击法,他以此破解了一个装载OpenSSL AES加密系统的客户服务器[6]。为了设计使该服务器公布所有的时序资讯,攻击算法使用了2亿多条筛选过的明码。有人认为[谁?],对于需要多个跳跃的国际互联网而言,这样的攻击方法并不实用[7]。 Bruce Schneier称此攻击为“好的时序攻击法”[8]。2005年10月,Eran Tromer和另外两个研究员发表了一篇论文,展示了数种针对AES的缓存时序攻击法。其中一种攻击法只需要800个写入动作,费时65毫秒,就能得到一把完整的AES密钥。但攻击者必须在执行加密的系统上拥有执行程式的权限,方能以此法破解该密码系统。 虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。 2、设计的目标 2.1基本目标: (1)在深入理解AES加密/解密算法理论的基础上,能够设计一个AES加密/解密软件系统,采用控制台模式,使用VS2010进行开发,所用语言为C语言进行编程,实现加密解密; (2)能够完成只有一个明文分组的加解密,明文和密钥是ASCII码,长度都为16个字符(也就是固定明文和密钥为128比特),输入明文和密钥,输出密文,进行加密后,能够进

RSA加密解密的设计与实现

RSA加密解密的设计与实现

上海电力学院 《应用密码学》课程设计 题目: RSA加密解密的设计与实现 院系:计算机科学与技术学院 专业年级:级 学生姓名:李正熹学号: 3273 指导教师:田秀霞 1月 8日 目录

目录 1.设计要求 2.开发环境与工具 3.设计原理(算法工作原理) 4.系统功能描述与软件模块划分 5.设计核心代码 6.参考文献 7. 设计结果及验证 8. 软件使用说明 9. 设计体会 附录 1.设计要求

1 随机搜索大素数,随机生成公钥和私钥 2 用公钥对任意长度的明文加密 3 用私钥对密文解密 4 界面简洁、交互操作性强 2.开发环境与工具 Windows XP操作系统 Microsoft Visual C++ 6.0 1.创立rsa工程

2.在rsa工程中创立 3273 李正熹cpp文件 3.设计原理 RSA算法简介 公开密码算法与其它密码学完全不同,它是基于数学函数而不是基于替换或置换。与使用一个密钥的对称算法不同,公开密钥算法是非对称的,而且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。公开密钥算法有RSA、Elgamal等。 RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在1978年提出来的,并以她们的名字的有字母命名的。RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是当前应用广泛的公钥密码体制。

RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。而且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。 4.系统功能描述与软件模块划分 功能:

1密码学-DES实验报告

南京信息工程大学实验(实习)报告实验(实习)名称对称密码实验(实习)日期得分指导教师 系计软院专业网络工程年2011 班次 1 姓名学号20111346026 一.实验目的 1.理解对称加密算法的原理和特点 2.理解DES算法的加密原理 二.实验内容 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16) 三.流程图&原理图

流程图

DES原理图

微机原理课程设计加密解密算法

加密解密程序设计 1设计算法概述 本设计主要采用对密码符号的ASCII码进行变换和反变换来实现加密和解密。将ASCII码从33到126(除控制字符外)的字符分成2部分:ASCII码从33到63的字符为第一部分,ASCII码在64到128之间的字符为第二部分。每个字符加密后均变为2个字符。 第一部分通过查表法加密和解密,先建立62字节的密码表。加密时,因为一个字符加密后变为两个字符,所以ASCII码从33到63的31个字符密码对应62个字符,即62个字节的数据,计算待加密字符ASCII码对33的偏移量,在密码表中,以这个偏移量乘以2为偏移量的字节数据和下一字节数据就是对应密码;解密时,在表中找到相同字型数据时,计算它对表首的偏移,再加33,就是解密后的字符的ASCII码。 第二部分通过判断字符ASCII码的特性来加密和解密。先判断输入字符的ASCII码是否为3的倍数,若是则对应密码的高位字节为35 ('#'),低位字节为本身ASCII码减一;再判断输入字符的ASCII码是否为5的倍数,若是则对应密码的高位字节为37(‘%’),低位字节为本身ASCII码减3;最后判断输入字符的ASCII码是偶数还是寄数,偶数的密码高字节为38(‘&’),低字节为本身ASCII码加1,奇数的密码高字节为39(‘'’),低字节为本身ASCII码加3 。解密的时候先判断高字节数据,若高字节数据位35、37、38、39则舍去高位字节,低位字节分别进行相应的解密,就得到原码。 2主程序设计 2.1主程序的功能 主程序主要是人机交互部分,提示输入信息和功能选择。程序开始,提示用

户选择相应的功能:按E、e调用加密子程序,进入加密状态,按R、r调用解密子程序,进入解密状态,按Esc退出程序,若输入错误则再次提示输入功能选择。 2.2主程序流程图 主程序流程图如图1所示。 图1 主程序流程图

DES加密算法实验报告

苏州科技学院 实验报告 学生姓名:杨刘涛学号:1220126117 指导教师:陶滔 刘学书1220126114 实验地点:计算机学院大楼东309 实验时间:2015-04-20 一、实验室名称:软件实验室 二、实验项目名称:DES加解密算法实现 三、实验学时:4学时 四、实验原理: DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串 f1,f1与L0做不进位的二进制加法运算。运算规则为: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。 R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 经过置换IP-1后生成的比特串就是密文e。 变换f(Ri-1,Ki): 它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:

DES算法Java实现源代码

package des; /** * 加密过程: * 1.初始置换IP:将明文顺序打乱重新排列,置换输出为64位。 * 2.将置换输出的64位明文分成左右凉拌,左一半为L0,右一半称为R0,各32位。 * 3。计算函数的16轮迭代。 * a)第一轮加密迭代:左半边输入L0,右半边输入R0:由轮函数f实现子密钥K1对R0的加密, * 结果为32位数据组f(R0,K1), * b)第二轮加密迭代:左半边输入L1=R0,右半边输入R1=L0⊕f(R0,K1),由轮函数f实现子密钥 * K2对R1的加密,结果为32位数据组f(R1,K2),f(R1,K2)与L1模2相加,得到一个32为数据组L1⊕f(R1,K2). * c)第3到16轮迭代分别用密钥K3,K4……K16进行。4.再经过逆初始置换IP-1,将数据打乱重排,生成64位密文。 * * 子密钥生成过程: * 1.将64位的密钥经过PC-1置换生成56位密钥。 * 2.将56位的密钥分成左右两部分,分别进行移位操作(一共进行16轮),产生16个56位长度的子密钥。 * 3.将16个56位的子密钥分别进行PC-2置换生成16个48位的子密钥。 * * 轮函数f的工作过程: * 1.在第i次加密迭代过程中,扩展置换E对32位的Ri-1的各位通过置换表置换为48位的输出。 * 2.将该48位的输出与子密钥Ki进行异或操作,运算结果经过S盒代换运算,得到一个32位比特的输出。 * 3。该32位比特输出再经过P置换表进行P运算,将其各位打乱重排,生成32位的输出。 * * author Ouyang * */ public class Des { int[] byteKey; public Des(int[] byteKey) { this.byteKey = byteKey; } private static final int[] 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,

华科大密码学课程设计实验报告

密码学课程设计实验报告 专业:信息安全 班级:0903 姓名:付晓帆 学号:U200915328

一、 DES 的编程实现 1.实验目的 通过实际编程掌握DES 的加、脱密及密钥生成过程,加深对DES 算法的认识。 2.实验原理 a.加密过程 DES 是一个分组密码,使用长度为56比特的密钥加密长度为64比特的明文,获得长度为64比特的密文,其加密过程: (1) 给定一个明文X ,通过一个固定的初始置换IP 置换X 的比特,获得X0,X0=IP(X)=L0R0,L0R0分别是X0的前32比特和后32比特。 (2) 然后进行16轮完全相同的运算,有如下规则,其中0

加密解密课程设计

兰州商学院陇桥学院工学系课程设计报告 课程名称: Java 设计题目:加密与解密 系别:工学系 专业 (方向):信息管理与信息系统 年级、班:2012级(2)班 学生姓名:费亚芬 学生学号: 208

指导教师:张鑫 2014年7 月 1日 目录 一、系统开发的背景................................. 错误!未定义书签。 二、系统分析与设计................................. 错误!未定义书签。(一)............................................. 系统功能要求错误!未定义书签。(二)......................................... 系统模块结构设计错误!未定义书签。 三、系统的设计与实现............................... 错误!未定义书签。(一)图形用户界面模块 ........................... 错误!未定义书签。(二)加密操作模块 ............................... 错误!未定义书签。 (三)解密操作模块................................ 错误!未定义书签。(四)文件保存模块 ............................... 错误!未定义书签。

(五)文件选择模块 ............................... 错误!未定义书签。 四、系统测试....................................... 错误!未定义书签。(一)测试加密..................................... 错误!未定义书签。(二)测试选择加密文件............................. 错误!未定义书签。(三)测试生成加密文件............................. 错误!未定义书签。(四)测试浏览加密文件............................. 错误!未定义书签。(五)测试解密文件................................. 错误!未定义书签。 五、总结........................................... 错误!未定义书签。 六、附件(代码、部分图表) ......................... 错误!未定义书签。

des课程设计

DES加解密算法的实现 一、DES算法的概述 DES(Data Encryption Standard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES 加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC 校验等,均用到DES算法。 DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16 轮的替换和移位后,输出完全不同的64比特密文数据。由于DES 算法仅使用最大为64比特的标准算法和逻辑运算,运算速度快,密

钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。 二、DES算法描述 DES算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为64比特的块。图2-1是DES加密算法的加密流程。图2-2是密钥扩展处理过程。

密码学课程设计

一、设计题目 随机数产生器应用系统 二、课题要求 系统功能要求: 1)模拟线性移位寄存器、线性同余发生器等产生伪随机数,并比较算法性能以及伪随机数的随机性; 2)利用该模拟随机数,应用到口令认证系统中,完成口令的生产、口令的加密保护、登陆验证等功能; 3)利用该模拟随机数,应用到密钥生成系统中,可以利用该密钥完成对称密钥的加密和解密功能。 三、系统设计和模块设计 1.总体设计思路 利用线性同余发生器(LCG)和线性反馈移位寄存器(LFSR)生成伪随机数M序列,并通过口令认证系统完成口令生成加密工作,同时完成对随机数的加密和解密功能。 2.模块设计思路 2.1原理 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,

其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。 2.2线性同余算法生成随机数 到目前为止,使用最为广泛的随机数产生技术是由Lehmer首先提出的称为线性同余算法,即使用下面的线性递推关系产生一个伪随机数列x1,x2,x3,… 这个算法有四个参数,分别是: a 乘数 0 ≤ a < m c 增量 0 ≤ c< m m 模数 m > 0 ≤ x0 < m x0 初始种子(秘密) 0 伪随机数序列{ xn}通过下列迭代方程得到: xn+1=(axn+c)modm 如果m、a、c和x0都是整数,那么通过这个迭代方程将产生一系列的整数,其中每个数都在0 ≤ xn < m的范围内。数值m、a和c的选择对于建立一个好的伪随机数产生器十分关键。为了形成一个很长的伪随机数序列,需要将m设置为一个很大的数。一个常用准则是将m选为几乎等于一个给定计算机所能表示的最大非负整数。因而,在一个32位计算机上,通常选择的m值是一个接近或等于231的整数。此外,为了使得随机数列不易被重现,可以使用当前时间的毫秒数作为初始种子的位置。 2.2 线性反馈移位寄存器生成随机数 LFSR是指给定前一状态的输出,将该输出的线性函数再用作输入的线性寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定性的,所以,由寄存器所生成的数据流完全决定于寄存器当时或者之前的状态。而且,由于寄存器的状态是有

java文件加密解密课程设计

软件学院 课程设计报告书 课程名称面向对象程序设计 设计题目文本文档的加密与解密 专业班级财升本12-1班 学号 1220970120 姓名王微微 指导教师徐娇月 2013年 1 月

1 设计时间 2013年1月14日-2013年1月18日 2 设计目的 面向对象程序设计是一门实践性很强的计算机专业基础课程。通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力,提高学生的应用能力。 3 设计任务 对文件进行加密解密 4 设计内容 4.1 需求分析 (1)给定任意一个文本文件,进行加密,生成另一个文件。 (2)对加密后的文件还原。 4.2 总体设计 4.2.1 包的描述 导入了java.awt; java.awt.event; java.io; javax.swing等包。 4.2.2 类的描述 Myframe类;E1类。其中Myframe类继承Frame类;可以扩展Frame的功能并且可以实例化的多种功能,这个类也实现了ActionListener这个接口,它是Java中关于事件处理的一个接口,ActionListener用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的addActionListener 方法向该组件注册。在发生操作事件时,调用该对象的actionPerformed 方法。 4.3 页面设计

图4.3-1 显示页面 代码实现: addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

des加密算法的实现及应用

DES加密算法的实现及应用 学生姓名:梁帅指导老师:熊兵 摘要随着信息与通信技术的迅猛发展和广泛应用,人们通过互联网进行信息交流,难免涉及到密码保护问题,这就需要使用DES加密技术来对数据进行加密保护。本课程设计介绍了DES加密的基本原理以及简单的实现方法。本课程设计基于C语言,采用DES算法技术,设计了DES加密程序,实现了DES加密解密功能。经测试,程序能正常运行,实现了设计目标。 关键词DES加密,C语言,信息交流

1 引言 1.1本文主要内容 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性 DES的加密过程: 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行

DES加密解密课程设计报告

D E S加密解密课程设计报 告 Prepared on 22 November 2020

成都信息工程学院课程设计报告 DES算法加密与解密的设计与实现课程名称:密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: XX年 XX 月 XX 日

目录

1背景 DES算法概述 DES(Data Encryption Standard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN 码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16轮的替换和移位后,输出完全不同的64比特密文数据。由于DES算法仅使用最大为64比特的标准算法和逻辑运算,运算速

杭电密码学DES密码实验报告

课程实验报告 课程密码学实验 学院通信工程学院 专业信息安全 班级14083611 学号14084125 学生姓名刘博 实验名称DES密码实验 授课教师胡丽琴

DES密码实验 一、实验要求: 1、了解分组密码的起源与涵义。 2、掌握DES密码的加解密原理。 3、用Visual C++实现DES密码程序并输出结果。 二、实验内容: 1、1949年,Shannon发表了《保密系统的通信理论》,奠定了现代密码学的基础。他还指出混淆和扩散是设计密码体制的两种基本方法。扩散指的是让明文中的每一位影响密文中的许多位,混淆指的是将密文与密钥之间的统计关系变得尽可能复杂。而分组密码的设计基础正是扩散和混淆。在分组密码中,明文序列被分成长度为n的元组,每组分别在密钥的控制下经过一系列复杂的变换,生成长度也是n的密文元组,再通过一定的方式连接成密文序列。 2、DES是美国联邦信息处理标准(FIPS)于1977年公开的分组密码算法,它的设计基于Feistel对称网络以及精心设计的S盒,在提出前已经进行了大量的密码分析,足以保证在当时计算条件下的安全性。不过,随着计算能力的飞速发展,现如今DES已经能用密钥穷举方式破解。虽然现在主流的分组密码是AES,但DES的设计原理仍有重要参考价值。在本实验中,为简便起见,就限定DES 密码的明文、密文、密钥均为64bit,具体描述如下: 明文m是64bit序列。 初始密钥K是64 bit序列(含8个奇偶校验bit)。 子密钥K1, K2…K16均是48 bit序列。 轮变换函数f(A,J):输入A(32 bit序列), J(48 bit序列),输出32 bit序列。 密文c是64 bit序列。 1)子密钥生成: 输入初始密钥,生成16轮子密钥K1, K2 (16) 初始密钥(64bit)经过置换PC-1,去掉了8个奇偶校验位,留下56 bit,接着分成两个28 bit的分组C0与D0,再分别经过一个循环左移函数LS1,得到C1与D1,连成56 bit数据,然后经过置换PC-2,输出子密钥K1,以此类推产生K2至K16。

DES算法及其程序实现

DES算法及其程序实现 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: 二.D ES算法的编程实现 #include #include using namespace std;

const static char ip[] = { //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 }; const static char fp[] = { //最终置换 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 }; const static char sbox[8][64] = { //s_box /* 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,

相关主题
文本预览
相关文档 最新文档