实验对称密码算法DES
- 格式:doc
- 大小:162.50 KB
- 文档页数:18
DES加密算法实验原理DES(Data Encryption Standard)是一种对称加密算法,它的原理是通过将明文划分为64位的数据块,并对每个数据块进行一系列的置换和替换操作,最后输出密文。
DES算法的实验原理可以分为以下几个步骤:1. 初始置换(IP):初始置换是将明文按照固定的顺序进行置换,目的是打乱明文的次序,增加加密的难度。
初始置换表(IP Table)定义了置换的顺序和位置。
2. 生成子密钥:DES算法使用了16个48位的子密钥。
这些子密钥是通过一个称为密钥调度算法(Key Schedule)的过程生成的。
密钥调度算法将输入的64位密钥进行置换和压缩,生成48位的子密钥。
3. 轮函数(Feistel Function):DES算法使用了16轮的轮函数加密过程。
每轮的输入由上一轮的输出和相应的轮子密钥产生。
轮函数包括以下几个步骤:a. 将32位的输入数据进行扩展置换(Expansion Permutation),得到48位的输出。
b.将扩展置换的输出与轮子密钥进行异或运算。
c.将异或结果分为8个6位的块,通过8个S盒进行替换操作。
每个S盒都是一个4x16的置换表,根据输入的6位数据得到4位的输出。
d. 将替换操作后的结果进行置换置换(Permutation),得到32位的输出。
4. 最终置换(IP-1):最终置换是对最后一轮轮函数的输出进行逆操作,得到最终的密文。
最终置换使用的是与初始置换相反的置换表(IP-1 Table)。
DES算法最终输出的密文是通过16轮轮函数的加密过程得到的。
每一轮轮函数的输入是上一轮轮函数的输出和相应的轮子密钥的异或结果。
每次轮函数的加密过程都会增加密文的复杂度,提高加密算法的安全性。
DES算法的安全性主要依赖于密钥的保密性和密钥长度。
由于DES算法使用的是56位的密钥,随着计算机计算能力的提高,DES算法的安全性逐渐变得不足。
因此,现在更常用的加密算法是AES(Advanced Encryption Standard),它使用128位、192位或256位的密钥,具有更高的加密强度。
DES加密算法的简单实现实验报告一、实验目的本实验的主要目的是对DES加密算法进行简单的实现,并通过实际运行案例来验证算法的正确性和可靠性。
通过该实验可以让学生进一步了解DES算法的工作原理和加密过程,并培养学生对算法实现和数据处理的能力。
二、实验原理DES(Data Encryption Standard,数据加密标准)是一种对称密钥加密算法,它是美国联邦政府采用的一种加密标准。
DES算法使用了一个共享的对称密钥(也称为密钥),用于加密和解密数据。
它采用了分组密码的方式,在进行加密和解密操作时,需要将数据分成固定长度的数据块,并使用密钥对数据进行加密和解密。
DES算法主要由四个步骤组成:初始置换(Initial Permutation),轮函数(Round Function),轮置换(Round Permutation)和最终置换(Final Permutation)。
其中初始置换和最终置换是固定的置换过程,用于改变数据的顺序和排列方式。
轮函数是DES算法的核心部分,它使用了密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
通过多轮的迭代运算,DES算法可以通过一个给定的密钥对数据进行高强度的加密和解密操作。
三、实验步骤2.初始置换:将输入数据按照一定的规则重新排列,生成一个新的数据块。
初始置换的规则通过查表的方式给出,我们可以根据规则生成初始置换的代码。
3.轮函数:轮函数是DES算法的核心部分,它使用轮密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
在实际的算法设计和实现中,可以使用混合逻辑电路等方式来实现轮函数。
4.轮置换:轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
轮置换的规则也可以通过查表的方式给出。
5.最终置换:最终置换与初始置换类似,将最后一轮的结果重新排列,生成最终的加密结果。
des算法实验报告DES算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司于1975年研发并被美国国家标准局(NBS)采纳为联邦信息处理标准(FIPS)。
二、算法原理DES算法采用了分组密码的方式,将明文数据划分为固定长度的数据块(64位),并通过密钥进行加密和解密操作。
其核心是Feistel结构,每轮加密操作包括置换和替代两个步骤。
1. 置换步骤DES算法的初始置换(IP)和逆初始置换(IP-1)通过一系列的位重排操作,将输入的64位明文数据打乱,以增加加密的强度。
2. 替代步骤DES算法中使用了8个S盒(Substitution Box),每个S盒接受6位输入,并输出4位结果。
S盒的作用是将输入的6位数据映射为4位输出,通过这种非线性的映射关系,增加了算法的安全性。
3. 轮函数DES算法的加密过程包含16轮迭代,每轮迭代中都会对数据进行一系列的位重排和替代操作。
其中,轮函数是DES算法的核心部分,它通过使用子密钥对数据进行异或操作,并通过S盒替代和P盒置换操作,产生新的数据块。
三、实验步骤为了更好地理解DES算法的加密过程,我们进行了以下实验步骤:1. 输入明文和密钥我们选择了一个64位的明文数据块和一个56位的密钥作为输入。
明文数据块经过初始置换(IP)后,得到L0和R0两个32位的数据块。
2. 生成子密钥通过对密钥进行置换和循环左移操作,生成16个48位的子密钥。
3. 迭代加密对明文数据块进行16轮的迭代加密,每轮加密包括以下步骤:a. 将R(i-1)作为输入,经过扩展置换(E-box),得到48位的扩展数据。
b. 将扩展数据和子密钥Ki进行异或操作,得到48位的异或结果。
c. 将异或结果分为8个6位的数据块,分别经过8个S盒替代操作,得到32位的S盒替代结果。
d. 将S盒替代结果经过P盒置换,得到32位的轮函数输出。
实验1-2 对称密码算法DES一.实验原理信息加密根据采用的密钥类型可以划分为对称密码算法和非对称密码算法。
对称密码算法是指加密系统的加密密钥和解密密钥相同,或者虽然不同,但是可以从其中任意一个推导出另一个,更形象的说就是用同一把钥匙开锁和解锁。
在对称密码算法的发展历史中曾出现过多种优秀的算法,包括DES、3DES、AES等。
下面我们以DES算法为例介绍对称密码算法的实现机制。
DES算法是有美国IBM公司在20世纪70年代提出,并被美国政府、美国国家标准局和美国国家标准协会采纳和承认的一种标准加密算法。
它属于分组加密算法,即明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。
混淆和扩散是它采用的两个最重要的安全特性,混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。
扩散是指明文和密钥中每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码安全。
DES将明文分成64比特位大小的众多数据块,即分组长度为64位。
同时用56位密钥对64位明文信息加密,最终形成64位的密文。
如果明文长度不足64位,则将其扩展为64位(例如补零等方法)。
具体加密过程首先是将输入的数据进行初始换位(IP),即将明文M 中数据的排列顺序按一定的规则重新排列,生成新的数据序列,以打乱原来的次序。
然后将变换后的数据平分成左右两部分,左边记为L0,右边记为R0,然后对R0施行在子密钥(由加密密钥产生)控制下的变换f,结果记为f(R0 ,K1),再与L0做逐位异或运算,其结果记为R1,R0则作为下一轮的L1。
如此循环16轮,最后得到L16、R16,再对L16、R16施行逆初始置换IP-1,即可得到加密数据。
解密过程与此类似,不同之处仅在于子密钥的使用顺序正好相反。
DES全部16轮的加密过程如图1-1所示。
DES的加密算法包括3个基本函数:1.初始换位(IP)它的作用是把输入的64位数据块的排列顺序打乱,每位数据按照下面换位规则重新组合。
DES加密算法实验报告1. 引言DES(Data Encryption Standard)是一种对称密码算法,于1977年被美国联邦信息处理标准(FIPS)确定为联邦标准。
DES加密算法采用分组密码的思想,将明文按照64位分为一组,经过一系列的置换、替代和迭代操作,最终输出加密后的密文。
本实验旨在通过对DES加密算法的实际操作,深入理解DES的工作原理和加密过程。
2. 实验步骤2.1. 密钥生成DES加密算法的核心在于密钥的生成。
密钥生成过程如下:1.将64位的初始密钥根据置换表进行置换,生成56位密钥。
2.将56位密钥分为两个28位的子密钥。
3.对两个子密钥进行循环左移操作,得到循环左移后的子密钥。
4.将两个循环左移后的子密钥合并,并根据压缩置换表生成48位的轮密钥。
2.2. 加密过程加密过程如下:1.将64位的明文按照初始置换表进行置换,得到置换后的明文。
2.将置换后的明文分为左右两部分L0和R0,每部分32位。
3.进行16轮迭代操作,每轮操作包括以下步骤:–将R(i-1)作为输入,经过扩展置换表扩展为48位。
–将扩展后的48位数据与轮密钥Ki进行异或操作。
–将异或结果按照S盒进行替代操作,得到替代后的32位数据。
–对替代后的32位数据进行置换,得到置换后的32位数据。
–将置换后的32位数据与L(i-1)进行异或操作,得到Ri。
–将R(i-1)赋值给L(i)。
4.将最后一轮迭代后得到的数据合并为64位数据。
5.对合并后的64位数据进行逆置换,得到加密后的64位密文。
3. 实验结果对于给定的明文和密钥,进行DES加密实验,得到加密后的密文如下:明文:0x0123456789ABCDEF 密钥:0x133457799BBCDFF1密文:0x85E813540F0AB4054. 结论本实验通过对DES加密算法的实际操作,深入理解了DES加密算法的工作原理和加密过程。
DES加密算法通过对明文的置换、替代和迭代操作,混淆了明文的结构,使得密文的产生与密钥相关。
【精品】DES算法实验报告一、理论部分DES算法是一种对称加密算法,也是目前广泛应用的加密算法之一。
DES算法使用的是分组加密的思想,将明文数据分成一定长度的数据块,按照一定的算法进行加密,得到密文数据。
DES算法中的关键是密钥,只有持有正确密钥的人才能解密。
DES算法的密钥长度为64位,但由于存在弱密钥的问题,使用时需要特别注意。
DES算法的加密过程包括以下几个步骤:1、密钥的生成和处理:DES算法的密钥长度为64位,但由于存在弱密钥的问题,使用时需要使用程序进行特殊处理,以确保生成的密钥不为弱密钥。
2、初始置换(IP):将明文数据按照一定的规则进行置换,得到置换后的数据。
3、分组:将置换后的明文数据分成左半部分和右半部分。
4、轮函数(f函数):将右半部分进行扩展置换、异或运算、S盒代替、置换等操作,得到一个新的右半部分。
5、轮秘钥生成:生成本轮加密所需要的秘钥。
6、异或运算:将左半部分和右半部分进行异或运算,得到一个新的左半部分。
7、左右交换:将左右部分进行交换。
以上步骤循环执行16次,直到得到最终的密文数据。
二、实验部分本次实验使用C语言实现了DES算法的加密和解密过程。
具体实现过程包括以下几个部分:1、密钥的生成:使用DES算法生成64位密钥,其中包括了对弱密钥的处理。
2、置换:使用DES算法中的IP置换和IP逆置换进行数据置换。
3、轮函数:使用DES算法中的f函数进行一轮加密操作。
5、加密:循环执行16轮加密操作,得到密文数据。
以上实现过程全部基于DES算法的规范。
三、结果分析1、速度慢:由于DES算法采用的是分组加密的思想,需要执行多次操作才能得到最终结果。
因此本次实验的加密和解密速度相对较慢。
2、代码简单:本次实验的代码相对简单,只需要用到一些基本数据结构和算法即可实现DES算法的加密和解密过程。
但需要注意的是,由于DES算法本身的复杂性,代码实现中需要注意细节和边界问题。
四、总结本次实验使用C语言实现了DES算法的加密和解密过程,通过实验得到了一些结果。
实验项目与实验报告( 2 )学科:信息与网络安全 学号: 姓名: 时间: 月 日实验名称:DES算法的原理与实现实验目的:1.熟悉DES算法的实现程序和具体应用,加深对DES算法的了解。
实验内容:(写出实验内容要点或相关理论准备、实验估计)一、DES算法的简介DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国BM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位代替或交换的方法形成密文组的加密方法。
1、基本原理其入口参数有三个:key、data、mode。
Key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。
当模式为加密模式时,明文按照64为进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。
实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
2、DES特点DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。
而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。
然而,这并不等于说DES是不可破解的。
而实际上,随着硬件技术和Intemet的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。
为了克服DES密钥空间小的缺陷,人们又提出了三重DES的变形方式。
3、主要流程DES算法把64为的明文输入块变为64位的密文输入块,它所使用的密钥也是64位,整个算法的主要流程图如下:(1)置换规则表其功能是把输入的数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表: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位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。
des 加密算法实验报告DES加密算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称加密算法,由IBM公司于1975年研发并被美国联邦政府采用为标准加密算法。
DES算法具有高效、可靠、安全等特点,被广泛应用于信息安全领域。
本实验旨在通过对DES算法的实验研究,深入了解其原理、性能和应用。
二、DES算法原理DES算法采用对称密钥加密,即加密和解密使用相同的密钥。
其核心是Feistel结构,将明文分成左右两部分,经过16轮迭代加密后得到密文。
每一轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和密钥进行变换。
DES算法中使用了置换、代换和异或等运算,以保证加密的安全性。
三、DES算法实验过程1. 密钥生成在DES算法中,密钥长度为64位,但实际上只有56位用于加密,8位用于奇偶校验。
实验中,我们随机生成一个64位的二进制密钥,并通过奇偶校验生成最终的56位密钥。
2. 初始置换明文经过初始置换IP,将明文的每一位按照特定规则重新排列,得到初始置换后的明文。
3. 迭代加密经过初始置换后的明文分为左右两部分,每轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和子密钥进行变换。
函数f包括扩展置换、S盒代换、P盒置换和异或运算等步骤,最后与右半部分进行异或运算得到新的右半部分。
4. 逆初始置换经过16轮迭代加密后,得到的密文再经过逆初始置换,将密文的每一位按照特定规则重新排列,得到最终的加密结果。
四、DES算法性能评估1. 安全性DES算法的密钥长度较短,易受到暴力破解等攻击手段的威胁。
为了提高安全性,可以采用Triple-DES等加强版算法。
2. 效率DES算法的加密速度较快,适用于对大量数据进行加密。
但随着计算机计算能力的提高,DES算法的加密强度逐渐降低,需要采用更加安全的加密算法。
3. 应用领域DES算法在金融、电子商务、网络通信等领域得到广泛应用。
des算法实验报告DES算法实验报告引言:数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司在20世纪70年代初开发。
DES算法通过将明文分块加密,使用相同的密钥进行加密和解密操作,以保护数据的机密性和完整性。
本实验旨在深入了解DES算法的原理和应用,并通过实验验证其加密和解密的过程。
一、DES算法原理DES算法采用分组密码的方式,将明文分为64位的数据块,并使用56位的密钥进行加密。
其加密过程主要包括初始置换、16轮迭代和逆初始置换三个步骤。
1. 初始置换(Initial Permutation,IP):初始置换通过将明文按照特定的置换表进行重排,得到一个新的数据块。
这一步骤主要是为了增加密文的随机性和混淆性。
2. 16轮迭代(16 Rounds):DES算法通过16轮迭代的运算,对数据块进行加密操作。
每一轮迭代都包括四个步骤:扩展置换(Expansion Permutation,EP)、密钥混合(Key Mixing)、S盒替换(Substitution Boxes,S-Boxes)和P盒置换(Permutation,P)。
其中,S盒替换是DES算法的核心步骤,通过将输入的6位数据映射为4位输出,增加了加密的复杂性。
3. 逆初始置换(Inverse Initial Permutation,IP-1):逆初始置换是初始置换的逆运算,将经过16轮迭代加密的数据块按照逆置换表进行重排,得到最终的密文。
二、实验步骤本实验使用Python编程语言实现了DES算法的加密和解密过程,并通过实验验证了算法的正确性。
1. 密钥生成:首先,根据用户输入的密钥,通过置换表将64位密钥压缩为56位,并生成16个子密钥。
每个子密钥都是48位的,用于16轮迭代中的密钥混合操作。
2. 加密过程:用户输入明文数据块,将明文按照初始置换表进行重排,得到初始数据块。
DES加密解密实验报告实验报告题目:DES加密解密实验一、实验目的1.了解DES加密算法的工作原理。
2. 学习使用Python编程语言实现DES加密算法。
3.掌握DES加密算法的应用方法。
二、实验原理DES(Data Encryption Standard)是一种用于加密的对称密钥算法,其密钥长度为64位,分为加密过程和解密过程。
1.加密过程(1)初始置换IP:将64位明文分成左右两部分,分别为L0和R0,进行初始置换IP操作。
(2)子密钥生成:按照规则生成16个子密钥,每个子密钥长度为48位。
(3)迭代加密:通过16轮迭代加密运算,得到最终的密文。
每轮迭代加密包括扩展置换、异或运算、S盒替代、P置换和交换操作。
(4)逆初始置换:将最终的密文分成左右两部分,进行逆初始置换操作,得到最终加密结果。
2.解密过程解密过程与加密过程类似,但是子密钥的使用顺序与加密过程相反。
三、实验材料与方法材料:电脑、Python编程环境、DES加密解密算法代码。
方法:1. 在Python编程环境中导入DES加密解密算法库。
2.输入明文和密钥。
3.调用DES加密函数,得到密文。
4.调用DES解密函数,得到解密结果。
5.输出密文和解密结果。
四、实验步骤1.导入DES加密解密算法库:```pythonfrom Crypto.Cipher import DES```2.输入明文和密钥:```pythonplaintext = "Hello World"key = "ThisIsKey"```3.创建DES加密对象:```pythoncipher = DES.new(key.encode(, DES.MODE_ECB) ```。
DES实验报告范文实验目的:了解DES算法的基本原理和加密过程;掌握DES算法的加密过程;了解DES算法的弱点并掌握略解决方法。
实验原理:DES(Data Encryption Standard)即数据加密标准,是一种对称加密算法。
它的基本原理是,通过将明文分组(64位)进行多次迭代,每次都经过相同的置换和替代操作,最终得到密文。
加密和解密都使用相同的过程和密钥。
实验步骤:1.密钥生成首先,用户需要选择一个64位的密钥,但该密钥只有56位是有效的,剩余8位用作奇偶校验位。
用户可以任意选择一个64位的二进制串,然后将满足奇偶校验的8位奇偶位加到末尾。
2.初始置换将64位的明文分成两个32位的部分,左边为L0,右边为R0。
进行一个固定的初始置换,将L0右边的32位和R0左边的32位合并,得到一个64位的二进制串。
3.子密钥生成通过对初始密钥进行置换等操作,生成16个子密钥(每个48位)。
每个子密钥与初始密钥无关。
4.迭代加密(16轮)迭代加密过程中,每次都涉及到对L和R的操作。
具体步骤如下:-对R进行扩展置换,扩展为48位,并将扩展后的结果与子密钥进行异或;-将异或结果分成8个6位的块,每个块对应一个S盒;-将S盒输出的结果经过置换P后与L异或,得到新的R;-将新的R赋值给R(R=R');-将旧的R赋值给L(L=R');-重复以上操作16轮。
5.逆初始置换将L16和R16按照逆初始置换的方式进行合并,得到一个64位的二进制串,即密文。
实验结果分析:经过实验,我们成功完成了DES算法的加密过程,并获得了加密后的密文。
通过解密过程,可以将密文重新转换为原始的明文。
实验总结:DES算法是一种较为经典的对称加密算法,由于其密钥长度较短,容易受到暴力破解的攻击。
为了提升安全性,可以对DES算法进行改进,如使用更长的密钥长度、增加迭代次数等。
此外,还可以使用其他更加先进的加密算法来替代DES算法,如AES算法等。
DES算法实验报告DES (Data Encryption Standard)算法是一种对称密钥加密算法,由IBM于1970s年代开发。
它是加密领域的经典算法之一,被广泛应用于安全通信和数据保护领域。
本实验报告将介绍DES算法的原理、实现和安全性分析。
一、DES算法原理1.初始置换(IP置换):将输入的64位明文进行初始置换,得到一个新的64位数据块。
2.加密轮函数:DES算法共有16轮加密,每轮加密包括3个步骤:扩展置换、密钥混合、S盒置换。
扩展置换:将32位数据扩展为48位,并与轮密钥进行异或运算。
密钥混合:将异或运算结果分为8组,每组6位,并根据S盒表进行置换。
S盒置换:将6位数据分为两部分,分别代表行和列,通过查表得到一个4位结果,并合并为32位数据。
3. Feistel网络:DES算法采用了Feistel网络结构,将32位数据块分为左右两部分,并对右半部分进行加密处理。
4.置换:将加密后的左右两部分置换位置。
5.逆初始置换:将置换后的数据进行逆初始置换,得到加密后的64位密文。
二、DES算法实现本实验使用Python编程语言实现了DES算法的加密和解密功能。
以下是加密和解密的具体实现过程:加密过程:1.初始化密钥:使用一个64位的密钥,通过PC-1表进行置换,生成56位的初始密钥。
2.生成子密钥:根据初始密钥,通过16次的循环左移和PC-2表进行置换,生成16个48位的子密钥。
3.初始置换:对输入的明文进行初始置换,生成64位的数据块。
4.加密轮函数:对初始置换的数据块进行16轮的加密操作,包括扩展置换、密钥混合和S盒置换。
5.逆初始置换:对加密后的数据块进行逆初始置换,生成加密后的64位密文。
解密过程:1.初始化密钥:使用相同的密钥,通过PC-1表进行置换,生成56位的初始密钥。
2.生成子密钥:根据初始密钥,通过16次的循环左移和PC-2表进行置换,生成16个48位的子密钥。
3.初始置换:对输入的密文进行初始置换,生成64位的数据块。
DES算法代码及实验报告DES算法(Data Encryption Standard,数据加密标准)是一种对称密钥加密算法,是密码学中最为经典的算法之一、DES算法的核心是Feistel结构,通过将明文分成多个块,然后对每个块进行一系列的置换和替换操作,最后得到密文。
本文将给出DES算法的代码实现,并进行实验报告。
一、DES算法的代码实现:以下是使用Python语言实现的DES算法代码:```pythondef str_to_bitlist(text):bits = []for char in text:binval = binvalue(char, 8)bits.extend([int(x) for x in list(binval)])return bitsdef bitlist_to_str(bits):chars = []for b in range(len(bits) // 8):byte = bits[b * 8:(b + 1) * 8]chars.append(chr(int(''.join([str(bit) for bit in byte]), 2)))return ''.join(chars)def binvalue(val, bitsize):binary = bin(val)[2:] if isinstance(val, int) elsebin(ord(val))[2:]if len(binary) > bitsize:raise Exception("Binary value larger than the expected size.")while len(binary) < bitsize:binary = "0" + binaryreturn binarydef permute(sbox, text):return [text[pos - 1] for pos in sbox]def generate_round_keys(key):key = str_to_bitlist(key)key = permute(self.permuted_choice_1, key)left, right = key[:28], key[28:]round_keys = []for i in range(16):left, right = shift(left, self.shift_table[i]), shift(right, self.shift_table[i])round_key = left + rightround_key = permute(self.permuted_choice_2, round_key)round_keys.append(round_key)return round_keysdef shift(bits, shift_val):return bits[shift_val:] + bits[:shift_val]def xor(bits1, bits2):return [int(bit1) ^ int(bit2) for bit1, bit2 in zip(bits1, bits2)]def encrypt(text, key):text_bits = str_to_bitlist(text)round_keys = generate_round_keys(key)text_bits = permute(self.initial_permutation, text_bits)left, right = text_bits[:32], text_bits[32:]for i in range(16):expansion = permute(self.expansion_table, right)xor_val = xor(round_keys[i], expansion)substitution = substitute(xor_val)permut = permute(self.permutation_table, substitution)temp = rightright = xor(left, permut)left = tempreturn bitlist_to_str(permute(self.final_permutation, right + left))```二、DES算法的实验报告:1.实验目的通过实现DES算法,加深对DES算法原理的理解,验证算法的正确性和加密效果。
des实验报告DES实验报告一、引言数据加密标准(Data Encryption Standard,DES)是一种对称密钥加密算法,由IBM公司于1975年研发并在1977年被美国政府采纳为联邦信息处理标准(FIPS)。
DES以其高度的安全性和可靠性成为当时最广泛使用的加密算法之一。
本实验旨在通过实际操作DES算法,深入了解其工作原理和加密过程。
二、实验目的1. 了解DES算法的基本原理和加密过程;2. 掌握使用Python编程语言实现DES算法的方法;3. 分析DES算法的优缺点及应用场景。
三、实验步骤1. 密钥生成在DES算法中,密钥长度为64位,但实际上只有56位用于加密,其余8位用于奇偶校验。
首先,我们需要生成一个有效的密钥。
通过随机数生成器生成一个64位的二进制串,然后去除奇偶校验位,得到56位的密钥。
2. 初始置换将明文分为左右两部分,每部分各32位。
然后,对每部分进行初始置换。
初始置换表IP将明文的每个比特位按照特定规则重新排列,得到一个新的64位二进制串。
3. 轮函数DES算法中的主要操作是轮函数,该函数包括扩展置换、密钥加密、S盒替换和P盒置换等步骤。
- 扩展置换:将32位的输入扩展为48位,扩展置换表E将输入的每个比特位按照特定规则重新排列。
- 密钥加密:使用子密钥对扩展置换的结果进行异或运算。
- S盒替换:将48位输入分为8个6位的块,经过8个不同的S盒进行替换,得到32位输出。
- P盒置换:对S盒替换的结果进行P盒置换,即将32位的输入按照特定规则重新排列。
4. 轮数迭代DES算法共有16轮迭代,每轮迭代包括轮函数和交换左右两部分的操作。
迭代过程中使用不同的子密钥对轮函数的输入进行加密。
5. 逆初始置换最后一轮迭代结束后,将左右两部分进行交换,并进行逆初始置换。
逆初始置换表IP-1将交换后的结果按照特定规则重新排列,得到最终的密文。
四、实验结果我们使用Python编程语言实现了DES算法,并对一组明文进行加密。
des算法的实验报告DES算法实验报告DES(Data Encryption Standard)算法是一种对称密钥加密算法,广泛应用于信息安全领域。
本实验旨在通过实验DES算法的加密和解密过程,以及密钥长度对加密效果的影响,来深入了解DES算法的原理和应用。
实验一:加密和解密过程首先,我们使用一个明文进行加密实验。
选择一个64位的明文作为输入,同时使用一个64位的密钥进行加密。
经过DES算法加密后,得到的密文长度也为64位。
然后,我们使用相同的密钥对密文进行解密,得到原始的明文。
实验结果表明,DES算法能够对明文进行有效的加密,并且使用相同的密钥能够对密文进行解密,得到原始的明文。
这说明DES算法是一种可靠的加密算法,能够保护数据的安全性。
实验二:密钥长度对加密效果的影响在第二个实验中,我们对不同长度的密钥进行加密实验,观察加密效果的变化。
我们分别使用56位、64位和128位的密钥进行加密,然后比较不同长度密钥的加密效果。
实验结果显示,密钥长度对加密效果有显著影响。
使用128位的密钥进行加密,能够得到更加安全的密文,而使用56位的密钥进行加密,则容易受到攻击。
这表明密钥长度是影响DES算法加密效果的重要因素。
结论通过本实验,我们深入了解了DES算法的加密和解密过程,以及密钥长度对加密效果的影响。
DES算法是一种可靠的加密算法,能够有效保护数据的安全性。
同时,密钥长度对加密效果有显著影响,因此在实际应用中需要选择足够长度的密钥来保障数据的安全。
总之,DES算法在信息安全领域有着重要的应用价值,通过本实验的学习,我们对DES算法有了更深入的了解,为进一步研究和应用提供了重要的参考。
信息安全实验报告报告1 对称密码算法DES王雨骄08211688实验报告1 对称密码算法DES一、实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。
二、实验原理DES属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。
混淆和扩散是它采用的两个最重要的安全特性。
混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者同级。
扩散室值明文和密钥中每一位信息的变动会影响到糯米问中血多为信息的变动,从而隐藏统计上的特性,增加密码的安全。
DES算法将明文分成64为大小的众多数据块,及分组长度为64位。
用56为密钥对明文加密,形成64为密文。
加密过程为限将输入的数据进行初始换为(IP),将按置换表变换的数据评分为左右两部分。
左边为L0,右边为R0,对R0进行由密钥生成的第一轮子密钥控制下的变换f,记为f(R0,K1),再与L0逐位异或,结果记为R1,R0作为下一轮的L1。
如此循环16轮,最后得到L16,R16,并进行逆初始变换(IP-1),可得到加密数据。
解密过程与此类似,但子密钥的使用顺序与加密相反。
、DES的三个基本函数为:初始置换、f函数、逆初始置换函数。
初始置换和逆初始置换按照IP表及IP-1进行,所用是将输入的64为数据打乱顺序和恢复顺序。
F函数:f函数是多个置换函数和替代函数的组合函数,它将32位比特的输入变换为32位的输出。
R i经过扩展运算E变换为扩展为48的E(R i),与K i+1进行欲火运算后输出的结果分成8组,每组6比特的并联B,B=B1B2B3B4B5B6B7B8,在经过8个S盒的选择压缩运算转换为4为,8个4位合并为32位后在经过P变换输出为32位f(R i,K i+1)。
DES的另一个重要的功能模块是子密钥的生成。
输入的初始密钥值为64位,但DES算法规定,其中第8、16、……、64位是奇偶校验位,不参与DES运算。
DES加密算法实验报告DES( Data Encryption Standard)算法是一种对称加密算法,是现代密码学的基础。
DES算法将64位明文数据分为两个32位的部分,将两部分通过一系列复杂的运算和替换操作,最终输出64位的密文。
DES算法的加密过程主要包括初始置换、16轮Feistel网络、逆初始置换等步骤。
首先是初始置换,将明文数据进行位重排列,使得加密的效果更加均匀。
然后是16轮Feistel网络的操作,每一轮都包括密钥的生成和密钥的运算。
密钥的生成过程是将64位的密钥进行重排列和选择运算,生成每一轮所需要的子密钥。
密钥的运算过程是将子密钥与32位明文数据进行异或操作,然后再通过一系列的替换和置换运算,得到新的32位数据。
最后是逆初始置换,将加密后的数据进行反向重排列,得到最终的64位密文数据。
实验中,对于给定的明文和密钥,我们首先需要将明文和密钥转换成二进制形式。
然后根据初始置换表和选择运算表,将明文和密钥进行重排列。
接下来进入16轮Feistel网络的循环中,每一轮都按照密钥的生成和运算过程进行操作。
最后通过逆初始置换表,将加密后的数据进行反向重排列,得到最终的密文。
DES算法的优点是运算速度较快,加密强度较高,安全可靠,广泛应用于网络通信和数据保密领域。
但DES算法也存在一些缺点,主要是密钥长度较短,为56位,容易受到暴力破解攻击;DES算法的设计和实现已经有一定历史了,现在已经有更安全和更高效的算法可供选择。
在实验中,我使用Python语言编写了DES算法的加密程序,在给定的明文和密钥下进行了测试。
实验结果表明,DES算法可以成功加密数据,并且在解密过程中能够准确还原原始数据。
总结来说,DES加密算法是一种经典的对称加密算法,通过初始置换、Feistel网络和逆初始置换等步骤,可以将明文数据加密成密文数据。
DES算法在保证加密强度和运算速度的同时,也有一些缺点需要注意。
因此,在实际应用中需要根据具体的需求和安全要求选择合适的加密算法。
实验一对称密码算法DES一、实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。
二、实验环境运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。
三、实验报告要求(1)使用附录提供的程序对一个文件进行加密和解密,提交程序代码和执行结果。
(2)使用附录提供的程序对输入的十六进制数加密(把输入的字符转化成整数。
例如,输入两个字符1F,转化成二进制数000lllll),比较输入和输出。
当把输入的数改变一个位时(如把1F 变为1E),比较输出的变化,并说明原因。
四、实验内容和步骤(1)使用附录提供的程序对一个文件进行加密和解密,程序代码和执行结果如下所示。
程序代码:int main(int argc, char *argv[]){//定义一个文件输入流类对象infileifstream infile("Arthas.txt",ios::in);if(infile == 0){cout<<"出错啦!!"<<endl;exit(1);}//定义一个文件输出流类对象outfileofstream outfile("encreption.txt",ios::out);if(outfile == 0){cout<<"错啦!"<<endl;exit(1);}//定义一些变量int i = 0;unsigned char plain[9]="12345678",encreption[9]="12345678", key[8]= { 'a','b','c','d','a','b','c','d' };symmetric_key skey;des_setup(key,8,0,&skey);// des_ecb_encrypt(pt,ct,&skey);while(infile.eof() != 1){infile>>plain[i];i++;if(i == 8){plain[9] = '\0';des_ecb_encrypt(plain,encreption,&skey);for (int j = 0;j<8;j++)outfile<<encreption[j];//outfile<<'\0';i=0;}}for(;i<9;i++)plain[i] = ' ';plain[9]='\0';des_ecb_encrypt(plain,encreption,&skey);for (int j = 0;j<8;j++)outfile<<encreption[j];//outfile<<'\0';infile.close();outfile.close();//解密ifstream infile1("encreption.txt",ios::in);if(infile1 == 0){cout<<"出错啦!!"<<endl;exit(1);}ofstream outfile1("encreption1.txt",ios::out);if(outfile1 == 0){cout<<"错啦!"<<endl;exit(1);}while(infile1.eof() != 1){infile1>>plain[i];i++;if(i == 8){plain[9] = '\0';des_ecb_encrypt(plain,encreption,&skey);for (int j = 0;j<8;j++)outfile1<<encreption[j];//outfile1<<'\0';i=0;}}for(;i<9;i++)plain[i] = ' ';plain[9]='\0';des_ecb_encrypt(plain,encreption,&skey);for (j = 0;j<8;j++)outfile1<<encreption[j];//outfile1<<'\0';infile1.close();outfile1.close();//cout<<"ASDF";system("PAUSE");return 0;}程序执行结果:例如plaintext.txt存放的明文为:加密后的密文为:解密后的明文为:(2)使用附录提供的程序对输入的十六进制数加密(把输入的字符转化成整数。
DES算法实验原理DES(Data Encryption Standard)算法是一种对称密钥加密算法,由IBM公司于1977年提出,并于1983年被国际标准化组织(ISO)标准化。
DES算法采用了分组密码的方式,将明文分成固定长度的数据块,并通过一系列的加密运算将明文转换为密文。
DES算法的实验原理可以分为以下几个方面进行介绍。
一、数据分组DES算法将明文按照64位进行分组处理。
如果明文长度不是64位的倍数,需要进行数据填充。
通常可以采用PKCS填充方式,即将需要填充的字节数作为填充的值。
填充后的数据按照64位进行分组,每组64位数据称为一个数据块。
二、初始置换(IP)对每个数据块,DES算法首先进行初始置换(Initial Permutation)。
初始置换过程通过一个置换函数将64位数据块重新排列。
该置换过程通过交换数据块中的位实现,并且每个位的位置是固定的。
初始置换可以打乱数据块的位顺序,增加了加密算法的复杂度。
三、密钥生成DES算法使用56位的密钥进行加密操作,密钥是DES算法的核心。
密钥生成过程是DES算法的一个重要环节。
首先从输入密钥中删除每个第8位,然后使用6个奇偶校验位,将密钥分为8个子密钥。
然后根据每个子密钥对应的循环左移位数,将每个子密钥的56位左移,得到子密钥的48位,供后续加密运算使用。
四、轮函数1.将输入数据分为左、右两部分;2.右部分进行扩展置换,将32位数据扩展到48位;3.将扩展后的数据与轮函数的子密钥进行异或运算;4.将异或结果进行S盒替代运算,将48位数据变为32位;5.将S盒运算结果通过P置换,得到32位数据;6.将左部分与P置换结果进行异或运算,得到新的左部分;7.交换左、右两部分,作为下一轮迭代的输入。
五、逆初始置换(IP-1)经过16轮迭代加密后,得到的密文数据需要进行最后的逆初始置换(Inverse Initial Permutation)。
逆初始置换与初始置换相反,根据逆初始置换函数将64位数据块重新排列,得到最终的密文数据。
实验3 对称密码算法DES(验证型)一、实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。
二、实验原理DES算法属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。
混淆和扩散是它采用的两个最重要的安全特性。
混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。
扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。
DES算法将明文分成64位大小的众多数据块,即分组长度为64位。
同时用56位密钥对64位明文信息加密,最终形成64位的密文。
需要注意的地方是掌握DES算法的16轮加、解密流程以及子密钥的产生流程。
三、实验环境运行Windows或者Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。
四、实验内容1、算法分析(1)写出DES算法的16轮加、解密流程;(2)写出子密钥的产生流程;2、下载DES算法的实现程序,并调用其程序对一个文件进行加密和解密,提交程序代码和执行结果。
3、调用下载的DES算法的实现程序对输入的十六进制数加密,比较输入和输出,当改变一个位时比较输出的变化,并说明原因。
五、实验步骤1、(1)、(2)、2、打开VC++,编写程序如下:#include "stdio.h"#include "memory.h" //#include "time.h"#include "stdlib.h"#define PLAIN_FILE_OPEN_ERROR -1 #define KEY_FILE_OPEN_ERROR -2#define CIPHER_FILE_OPEN_ERROR -3 #define OK 1typedef char ElemType;//初始置换表IPint IP_Table[64] = { 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,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6}; //逆初始置换表IP^-1int IP_1_Table[64] = {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,32,0,40,8,48,16,56,24};//扩充置换表E 32--->48int E_Table[48] = {31, 0, 1, 2, 3, 4,3, 4, 5, 6, 7, 8,7, 8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31, 0};//置换函数Pint P_Table[32] = {15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24};//S盒int S[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}}}; //置换选择1int PC_1[56] = {56,48,40,32,24,16,8,0,57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,60,52,44,36,28,20,12,4,27,19,11,3};//置换选择2int PC_2[48] = {13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,46,43,48,38,55,33,52,45,41,49,35,28,31};//对左移次数的规定int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};int ByteToBit(ElemType ch,ElemType bit[8]);int BitToByte(ElemType bit[8],ElemType *ch);int Char8ToBit64(ElemType ch[8],ElemType bit[64]);int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);int DES_ROL(ElemType data[56], int time);int DES_IP_Transform(ElemType data[64]);int DES_IP_1_Transform(ElemType data[64]);int DES_E_Transform(ElemType data[48]);int DES_P_Transform(ElemType data[32]);int DES_SBOX(ElemType data[48]);int DES_XOR(ElemType R[48], ElemType L[48],int count); //异或操作int DES_Swap(ElemType left[32],ElemType right[32]); //交换L分组与R分组交换.int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);//字节转换成二进制int ByteToBit(ElemType ch, ElemType bit[8]){int cnt;for(cnt = 0;cnt < 8; cnt++){*(bit+cnt) = (ch>>cnt)&1; //右移cnt位,与1相与.将字节装入8位二进制数组中.倒序装入} //7=00000111,bit={11100000}//printf("%s",bit);return 0;}//二进制转换成字节int BitToByte(ElemType bit[8],ElemType *ch){int cnt;for(cnt = 0;cnt < 8; cnt++){*ch |= *(bit + cnt)<<cnt; // 为*(1)+*(10)+*(100)+0000+00000+0000000...=7 }return 0;}//将长度为8的字符串转为二进制位串int Char8ToBit64(ElemType ch[8],ElemType bit[64]){int cnt;for(cnt = 0; cnt < 8; cnt++){ByteToBit(*(ch+cnt),bit+(cnt<<3)); //cnt<<3即为cnt*8}return 0;}//将二进制位串转为长度为8的字符串int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){int cnt;memset(ch,0,8); //以ch为起点的8位空间数组置0.for(cnt = 0; cnt < 8; cnt++){BitToByte(bit+(cnt<<3),ch+cnt);}return 0;}//IP置换int DES_IP_Transform(ElemType data[64]){ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_Table[cnt]];}memcpy(data,temp,64); //由temp所指内存区域复制64个字节到data所指内存区域,与strcpy 同.return 0;}//IP逆置换int DES_IP_1_Transform(ElemType data[64]){int cnt;ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_1_Table[cnt]];}memcpy(data,temp,64); //由temp所指内存区域复制64个字节到data所指内存区域,与strcpy同return 0;}//密钥置换1 pc-1int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){int cnt;for(cnt = 0; cnt < 56; cnt++){tempbts[cnt] = key[PC_1[cnt]];}return 0;}//密钥置换2 pc-2int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){for(cnt = 0; cnt < 48; cnt++){tempbts[cnt] = key[PC_2[cnt]];}return 0;}//E扩展置换int DES_E_Transform(ElemType data[48]){ //这里data两种用处,故为48位极人臣int cnt;ElemType temp[48];for(cnt = 0; cnt < 48; cnt++){temp[cnt] = data[E_Table[cnt]]; //这里data下标最高为32.}memcpy(data,temp,48);return 0;}//P置换int DES_P_Transform(ElemType data[32]){int cnt;ElemType temp[32];for(cnt = 0; cnt < 32; cnt++){temp[cnt] = data[P_Table[cnt]];}memcpy(data,temp,32);return 0;}//循环左移//左右两边同时循环左移相同的位数.//10010循环左移1位为00101,左移2位为01010int DES_ROL(ElemType data[56], int times){ElemType temp[56]; //temp只保存将要循环到右边的位.//保存将要循环移动到右边的位memcpy(temp,data,times); //保存前28位的移位memcpy(temp+times,data+28,times); //保存后28位的移位极人臣//前28位移动memcpy(data,data+times,28-times); //一般移位memcpy(data+28-times,temp,times); //循环位移动//后28位移动memcpy(data+28,data+28+times,28-times);memcpy(data+56-times,temp+times,times);return 0;}//生成子密钥int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56];int cnt;DES_PC1_Transform(key,temp);//PC1置换for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥DES_ROL(temp,MOVE_TIMES[cnt]);//Ci Di 左右两边,循环左移DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥}return 0;}//异或int DES_XOR(ElemType R[48], ElemType L[48] ,int count){int cnt;for(cnt = 0; cnt < count; cnt++){R[cnt] ^= L[cnt]; //异或即为模2加法}return 0;}//S盒置换48=8*6 32=8*4int DES_SBOX(ElemType data[48]){int cnt;int line,row,output;int cur1,cur2;for(cnt = 0; cnt < 8; cnt++){cur1 = cnt*6;cur2 = cnt<<2;//计算在S盒中的行与列b1b2b3b4b5b6 b1b2 //b3b4b5b6line = (data[cur1]<<1) + data[cur1+5];row = (data[cur1+1]<<3) + (data[cur1+2]<<2)+ (data[cur1+3]<<1) + data[cur1+4];output = S[cnt][line][row];//化为2进制data[cur2] = (output&0X08)>>3; //取得output二进制倒数第4位为0还是1data[cur2+1] = (output&0X04)>>2; //output=7=0111 oxo4=0100data[cur2+2] = (output&0X02)>>1; //相&得到0100 右移2位得到1data[cur2+3] = output&0x01;}return 0;}//交换L分组与R分组交换.int DES_Swap(ElemType left[32], ElemType right[32]){ElemType temp[32];memcpy(temp,left,32);memcpy(left,right,32);memcpy(right,temp,32);return 0;}//加密单个分组int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){ElemType plainBits[64]; //明文比特ElemType copyRight[48]; //int cnt;Char8ToBit64(plainBlock,plainBits);//初始置换(IP置换)DES_IP_Transform(plainBits);//16轮迭代for(cnt = 0; cnt < 16; cnt++){//将右半部分拷贝到数组中.memcpy(copyRight,plainBits+32,32);//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(plainBits,copyRight,32);if(cnt != 15){//最终完成左右部的交换DES_Swap(plainBits,plainBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(plainBits);Bit64ToChar8(plainBits,cipherBlock);return 0;}//解密单个分组int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){ElemType cipherBits[64];ElemType copyRight[48];int cnt;Char8ToBit64(cipherBlock,cipherBits);//初始置换(IP置换)DES_IP_Transform(cipherBits);//16轮迭代for(cnt = 15; cnt >= 0; cnt--){memcpy(copyRight,cipherBits+32,32); //这里为什么还是右半部分?//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(cipherBits,copyRight,32);if(cnt != 0){//最终完成左右部的交换DES_Swap(cipherBits,cipherBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(cipherBits);Bit64ToChar8(cipherBits,plainBlock);return 0;}//加密文件int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){ FILE *plain,*cipher;int count;ElemType plainBlock[8],cipherBlock[8],keyBlock[8];ElemType bKey[64];ElemType subKeys[16][48];if((plain = fopen(plainFile,"rb")) == NULL){return PLAIN_FILE_OPEN_ERROR;}if((cipher = fopen(cipherFile,"wb")) == NULL){return CIPHER_FILE_OPEN_ERROR;}//设置密钥memcpy(keyBlock,keyStr,8);//将密钥转换为二进制流//printf("%s\n",keyBlock);//int i;//for(i=0;i<8;i++){// printf(" %s \n",keyBlock[i]);//}Char8ToBit64(keyBlock,bKey);//生成子密钥DES_MakeSubKeys(bKey,subKeys);while(!feof(plain)){//每次读8个字节,即一个分组读八次.并返回成功读取的字节数if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){DES_EncryptBlock(plainBlock,subKeys,cipherBlock);fwrite(cipherBlock,sizeof(char),8,cipher);}}if(count){memset(plainBlock + count,'\0',7 - count);plainBlock[7] = 8 - count;DES_EncryptBlock(plainBlock,subKeys,cipherBlock);fwrite(cipherBlock,sizeof(char),8,cipher);}fclose(plain);fclose(cipher);return OK;}//解密文件int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){ FILE *plain, *cipher;int count,times = 0;long fileLen;ElemType plainBlock[8],cipherBlock[8],keyBlock[8];ElemType bKey[64];ElemType subKeys[16][48];if((cipher = fopen(cipherFile,"rb")) == NULL){return CIPHER_FILE_OPEN_ERROR;}if((plain = fopen(plainFile,"wb")) == NULL){return PLAIN_FILE_OPEN_ERROR;}//设置密钥memcpy(keyBlock,keyStr,8);//将密钥转换为二进制流Char8ToBit64(keyBlock,bKey);//生成子密钥DES_MakeSubKeys(bKey,subKeys);//取文件长度fseek(cipher,0,SEEK_END); //将文件指针置尾,距SEEK_END 0的位置, fileLen = ftell(cipher); //取文件指针当前位置,相对于文件头,即可取文件长度. rewind(cipher); //将文件指针重指向文件头while(1){fread(cipherBlock,sizeof(char),8,cipher);DES_DecryptBlock(cipherBlock,subKeys,plainBlock);times += 8;if(times < fileLen){fwrite(plainBlock,sizeof(char),8,plain);}else{break;}}if(plainBlock[7] < 8){for(count = 8 - plainBlock[7]; count < 7; count++){if(plainBlock[count] != '\0'){break;}}}if(count == 7){//有填充fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);}else{//无填充fwrite(plainBlock,sizeof(char),8,plain);}fclose(plain);fclose(cipher);return OK;}int main(){clock_t a,b; // 时间类型变量a = clock(); //时间函数DES_Encrypt("plaint.txt","10101010","cipher.txt");b = clock();printf("加密消耗%d毫秒\n",b-a);system("pause"); //暂停一下a = clock();DES_Decrypt("cipher.txt","10101010","result.txt");b = clock();printf("解密消耗%d毫秒\n",b-a);getchar();return 0;}明文文件为:plaint.txt,密钥:key.txt,密文文件为:cipher.txt,解密得到明文为:result.txt运行结果如下:3、输入明文,调试程序,结果如下:从实验结果可以看出,明文就算是相差一个位,但是他们的密文完全没有规律可循,这就保证了数据加密的可靠性,至于这样的原因,DES是由于采用了Feistel结构,在加密过程中经过多轮重复操作,但每一轮的子密钥不同,这样就使得即使原来很相近的两个数据串经过N轮后,这个数据串被分得很散,也就很不一样了.。