des算法实验指导_第1页
des算法实验指导_第2页
des算法实验指导_第3页
des算法实验指导_第4页
des算法实验指导_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验1 DES加密与解密算法的实现【实验目的】1、理解DES加密与解密的程序设计算法思想。2、编写DES加密与解密程序,实现对文件的加密与解密,加深对数据加密与解密的理解,掌握DES加密算法思想,提高网络安全的编程能力。【实验性质】综合与设计性实验【实验条件】 计算机一台【实验要求】本实验内容多,要求两次完成。实验2要求:读懂代码,修改其中循环移位的错误;如何判断是否修改正确,参考课堂上所讲举例内容,即输入密码为:,明文为:,而结果和教师课堂举例的运行结果一致则修改正确,否则要继续修改。实验3要求:自己添加些代码,得到明文加密一轮后的结果,即得到L1和R1。【实验导读】1、DES算法简介数据加

2、密标准DES(Data Encryption Standard)算法是一个分组加密算法,也是一个对称算法,加密和解密使用同一个算法,利用传统的换位、异或、置换等加密方法。DES算法以64位(8 byte)为分组对数据加密,其中有8位(第8、16、24、32、40、48、56和64位)用作奇偶校验位,另外的56位为真正的密钥,保密性依赖于密钥,加密和解密过程使用同一个密钥。2、加密过程设计DES首先对64位的明文数据分组进行操作,通过一个初始置换,将明文分组等分成左、右两半部分,然后进行16轮完全相同的运算,在每一轮运算中,对密钥位进行移位,再从56为密钥中选出48位;同时通过一个扩展置换将数据

3、的右半部分扩展成48位,再通过异或操作与计算得到的48位子密钥结合,并通过8个S盒将这48位替代成新的32位数据,再将其置换一次。然后,通过另一个异或运算,将运算函数f的输出与左半部分结合,其结果成为新的右半部分,旧的右半部分成为新的左半部分。将该操作重复16次,便实现了DES的16轮运算。经过16轮后,左、右半部分合在一起,最后再通过一个逆初始置换(初始置换的逆置换),这样就完成DES加密算法。DES加密算法的具体过程描述如下:1)、计算密钥KI对64位密钥而言,因为每个字节的第8位为校验位,故密钥由64位减至56位,而16个子密钥Ki(I值从1到16)是在DES算法中的每一轮运算中,从56

4、位密钥产生出的不同的48位子密钥。产生方式如下:首先进行密钥置换,使得密钥的各个位与原密钥位对应关系表如下表所示。接着把经过置换后的56为密钥等分成两部分,其中前28位记为 C0,后28位记为D0。然后从i=1开始,分别对Ci-1,Di-1做循环左移来生成Ci,Di。每次循环左移位数,这两部分分别循环左移1位或2位,如下表所示。然后串联Ci,Di,就可以得到一个56位数,对此数做下表所示的压缩置换以产生48位子密钥Ki。通过以上方法就可以计算出16个子密钥Ki(I值从1到16)。2)、加密数据块把要加密的数据块分成64位的数据块,不满64位的以适当的方式填补至64位。在第一轮运算之前,先对数据

5、块作初始置换IP(初始置换是简单的比特移位),即设有一个比特的信息块m=m1m2m64,(其中,mi=1,2,I=1,2,64),则IP(m)= m58 m50m7。初始置换如下表所示。再将置换后的数据块等分成两部分,前面32位记为L0,后面32位记为R0。然后运算函数f根据如表7-5所示的扩展置换(也叫E盒置换),把32位的输入扩展成48位,并与密钥Ki作异或运算,再把所得的48位分成8组,每组6位,使用一个数组来储存,设16位为B1,712位为B2,4348位为B8。下表是压缩置换每组分别通过S1,S2,S8盒输出,每个S盒是一个4行,16列的表。盒中的每一项都是一个4位数。取出B j 的

6、第1和第6位串联成一个2位数,记为m,是S盒里用来替换B j 的数所在的列数;取出B j 的第2至第5位串联成一个4位数,记为n,是S盒里用来替换B j 的数所在的行数。用S盒里的值S j mn替换B j 。例如:假设S6盒的输入B j 为(二进制),即m=11=3,对应S6盒的第3行,n=1001=9,对应S6盒的第9列。S6盒的第3行第9列的数是14(注意:行、列的记数从0开始),则S j mn值为1110,就代替输入B j (其值为)。S盒的6个输入确定了其对应的输出在哪一行哪一列。8个S盒如下表所示:8个数据块都进行S盒置换后,接着把B1至B8顺序串联起来得到一个32位数,对这个数作如

7、下表所示的P盒置换。P盒是用来对S盒运算后的32位输出进行置换,把每个输入位映射到输出位,最后产生32位输出。即若输入32位为Hi=r1r2r32,则P(Hi)=h16h7h20。将P盒置换后的结果与Li-1作异或运算,并把计算结果赋给Ri,把Ri-1的值赋给Li。循环执行,接着开始新一轮的运算,知道K16也被用到。然后把R16和L16顺序串联起来得到一个64位数。最后对这个数执行逆初始置换IP-1。逆初始置换是初始置换的逆过程,如下表所示。DES算法的加密过程描述至此完成,其流程如下图所示。设初始置换为IP,运算函数为f,16个子密钥为Ki,则DES加密过程表示如下:L0R0=IP(明文)L

8、i=Ri-1,Ri=Li-1f(Ri-1,Ki),其中,i =1,2,64密文=IP-1(R16L16)3)、解密程序设计DES解密和加密使用相同的算法,唯一的不同是密钥的次序相反,即只需要把16个密钥的顺序倒过来。若各轮加密的密钥分别是K1,K2,K3,K16,则解密的密钥为K16,K15,K14,K1。为各轮产生的密钥的算法也是循环的。密钥向右移动,每次移动的个数为:0,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1。DES解密过程可用符号表示如下:R16L16=IP(密文)Ri-1=Li,Li-1= Rif(Ri-1,Ki),其中,i =1,2,64明文=IP-1(R0L0)

9、【实验内容】#include #include #include /*密钥置换选择表PC_1*/const char PC_156= 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;/*左移循环表Left_loop*/

10、const char Left_loop16= 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/*密钥置换选择表PC_2*/const char PC_248= 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 char IP64=

11、 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 char Exp48= 32, 1, 2, 3, 4, 5, 4, 5, 6,

12、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;/*S_Box*/const static char S8416 = 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

13、, 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, 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, 1

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

15、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, 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,

16、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, 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, 4, 11, 2, 14, 15, 0,

17、 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, 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,

18、 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盒中得到的数据重新排列的表*/const char PP32= 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; /*逆IP置换*/const char FP64= 40, 8,

19、 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 ;/* 密钥定义*/static unsigned char DesKey8;static unsigned char

20、SubKey1648;static unsigned char tmp128;void trans_table(unsigned char * Out ,unsigned char * In , const char * Table , int len) int i; for(i=0;i!=len;i+) tmpi=InTablei-1; memcpy(Out , tmp , len);void Bytes_to_Bits(unsigned char * Out , const unsigned char * In , int len) int i; for(i=0;i!=len;i+) Ou

21、ti=(Ini3(i&7) & 1; void Bits_to_Bytes(unsigned char * Out , const unsigned char * In , int len) int i; memset(Out, 0,len3); for(i=0;i!=len;i+) Outi3 |= (Ini8) memcpy(DesKey,key,8); else memset(DesKey,0,8); memcpy(DesKey,key,i); unsigned char tk64; Bytes_to_Bits(tk,DesKey,64); trans_table(tk,tk,PC_1,

22、56); / char C2,D2; for(i=0;i!=16;i+) Rotate(&tk0,28,Left_loopi); Rotate(&tk28,28,Left_loopi); trans_table(SubKeyi,tk,PC_2,48); void S_func(unsigned char E48,unsigned char B32) int i,j,k; for(i=0;i!=8;i+,E+=6,B+=4) j=(E01)+E5; k=(E13)+(E22)+(E3=0;i-) F_func(L,SubKeyi,B); Xor(B,R,32); memcpy(R,L,32); memcpy(L,B,32); trans_table(tt,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论