DES加密算法地实现

上传人:无*** 文档编号:82940263 上传时间:2022-04-30 格式:DOC 页数:42 大小:261KB
收藏 版权申诉 举报 下载
DES加密算法地实现_第1页
第1页 / 共42页
DES加密算法地实现_第2页
第2页 / 共42页
DES加密算法地实现_第3页
第3页 / 共42页
资源描述:

《DES加密算法地实现》由会员分享,可在线阅读,更多相关《DES加密算法地实现(42页珍藏版)》请在装配图网上搜索。

1、word某某工学院计算机信息工程学院数据结构课程设计报告题 目 DES加密算法的实现班 级 14软一学号某某 王磊组长 学号某某 王凯旋学号某某 陶伟2016 年01月06日一,实验名称: DES加密算法的实现二,实验内容:a) 熟悉DES算法的根本原理;b) 依据所算如此的算法,编程实现该该算法;c) 执行程序并分析结果;三,实验原理1,概述DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端 输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法除密钥编排不同以外。 密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶

2、检验,可以忽略)。密钥可以是任意的56位数,且可以在任意的时候改变。 DES算法的入口参数有3个: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的输出结果。2,DES算法详述DES算法把64位的明文输入块变为64位的密文输出块

3、,他所使用的密钥也是64位,DES对64 位的明文分组进展操作。通过一个初始置换,将明文分组分成左半局部和右半局部,各32位长。然后进展16轮一样的运算,这些一样的运算被称为函数f,在运算过程中数据和密钥相结合。经过16轮运算后左、右局部在一起经过一个置换初始置换的逆置换,这样算法就完成了。 1初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两局部,每局部各长32位,即将输入的第58位换到第1位,第50位换到第2位,依次类推,最后一位是原来的第7位,L0,R0如此是换位输出后的两局部,L0是输出的左32位,R0是右32位。 2逆置换 经过16次迭代运算后,得到L16,

4、R16,将此作为输入进展逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置 换,又将第40位换回到第1位。3函数f(Ri,Ki)的计算“扩展置换是将32位放大成48位,“P盒置换是32位到32位换位,在Ri,Ki算法描述图中,选择函数功能是把6 b数据变为4 b数据。(4)子密钥Ki(48 b)的生成算法 开始,由于不考虑每个字节的第8位,DES的密钥从64位变为48位,如表6所示,首先56位 密钥被分成两个局部,每局部28位,然后根据轮数,两局部分别循环左移l或2位。DES算法规定,其中第8,16,64位是奇偶校验位,不参与DES运算。

5、故Key实际可用 位数只有56位。即:经过密钥置换表的变换后,Key的位数由64位变成了56位,此56位分为C 0,D0两局部,各28位,然后分别进展第一次循环左移,得到C1,D1,将C1(28位),D1(28位 )合并得到56位,再经过压缩置换,从而便得到了密钥K0(48位)。依次类推,便可得到K1,K 2,K15。需要注意的是,16次循环左移对应的左移位数要依据表7所示的规如此进展。 以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅在于第一次迭代时用子密钥K15,第二次是K14,最后一次用K0,算法本身并没有任何变化。四,实验步骤:a) 选择并熟悉一种密码算法。b) 编

6、写概要设计,详细设计报告c) 使用visual c+工具,编码.d) 调试与测试五,主要程序#include#include#includevoid show1() /主界面printf(nnntt* DES加密解密系统 *nn);printf(tt-n);/printf(tt-n);printf(tt*n);printf(tt*tttttt*n);printf(tt*tttttt*n);printf(tt*ttt1.加密ttt*n);printf(tt*tttttt*n);printf(tt*ttt2.解密ttt*n);printf(tt*tttttt*n);printf(tt*ttt3.退

7、出ttt*n);printf(tt*tttttt*n);printf(tt*tttttt*n);printf(tt-n);void show2()/加密界面printf(nnntt* DES加密 *nn);printf(tt-n);printf(tt*n);printf(tt*tttttt*n);printf(tt*t请选择明文和密钥的输入方式:tt*n);printf(tt*tttttt*n);printf(tt*tt1.直接输入ttt*n);printf(tt*tttttt*n);printf(tt*tt2.从文件读取ttt*n);printf(tt*tttttt*n);printf(tt

8、*tt3.退出tttt*n);printf(tt*tttttt*n);printf(tt-n);printf(ttt选择:);void reader(char str30,char s8) /读取明文和密钥FILE *fp;fp=fopen(str,r);if(fp=NULL)printf(明文读取失败!n);elsefscanf(fp,%s,s);fclose(fp);void To2Bin(char p8,int b64) /将字节转换成二进制流int i,k=0;for(i=0;i=1) if(j&pi) bk+=1; else bk+=0; int IP_Table64 = /初始置换

9、(IP) 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;int E_Table = /扩展变换E 31, 0, 1, 2, 3, 4,3, 4, 5, 6,

10、 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;int S_Box8416 = /8个s盒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

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

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

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

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

15、 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, 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;int IP_1_Table64 =/逆初始置换IP-1 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 4

16、5, 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;int P_Table32 =/置换运算P15,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; int PC_156 =56

17、,48,40,32,24,16,8, /密钥置换PC_1 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; int PC_248 =/密钥置换PC_213,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,47,43,4

18、8,38,55,33,52,45,41,49,35,28,31; void Replacement(int arry1,int arry2,int arry3,int num)/置换函数(初始IP,逆初始IP,int i,tmp;for(i=0;inum;i+)tmp=arry2i;arry3i=arry1tmp;int move_times16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1; /对左移位的规定void lif_move(int arry1,int arry2,int n) /左移位实现函数int i;for(i=0;i28;i+)arry2i=arry1

19、(n+i)%28;int K1648;/存放16轮子密钥int c64;/存放明文或密文int L1732,R1732; /存放加密过程中左右局部void SubKey(int K064)/子密钥产生函数int i;int K156,K256;int C1728,D1728;Replacement(K0,PC_1,K1,56);/密钥置换PC_1for(i=0;i28;i+)/将PC_1输出的56比特分为左右两局部C0i=K1i;D0i=K1i+28;i=0;while(i16)int j;lif_move(Ci,Ci+1,move_timesi);lif_move(Di,Di+1,move_

20、timesi);for(j=0;j28;j+)K2j=Ci+1j;K2j+28=Di+1j;Replacement(K2,PC_2,Ki,48);/密钥置换PC_2i+;/*printf(n子密钥生成过程中,左边生成的值:);for(i=0;i17;i+)int j;printf(nC%d:,i);for(j=0;j28;j+)if(j%7=0)printf( );printf(%d,Cij);printf(n子密钥生成过程中,右边生成的值:);for(i=0;i17;i+)int j;printf(nD%d:,i);for(j=0;j28;j+)if(j%7=0)printf( );prin

21、tf(%d,Dij);*/void S_press(int arry,int shc)/S盒压缩变换,其中数组shc存放经过s盒的结果int h,l;/行,列int sha8; /存放经过s盒的十进制结果int i,j;int temp4;for(i=0;i8;i+) /s盒压缩变换h=arry(1+(i*6)-1*2 + arry(6+(i*6)-1;l =arry(2+(i*6)-1*8 + arry(3+(i*6)-1*4 + arry(4+(i*6)-1*2 + arry(5+(i*6)-1; shai=S_Boxihl; for(i=0;i=0;j-) tempj=shai%2; s

22、hai=shai/2; for(j=0;j4;j+) shc4*i+j=tempj; /*printf(n第%d次s盒的输出:,m+);for(i=0;i32;i+)if(i%8=0)printf( );printf(%d,shci);*/void To10(int a, int b,int n)/二进制转十进制int i,j;int temp;int arry164;for(i=0;in/4;i+)for(j=0;j4;j+)arryij=a4*i+j;for (i=0;i=0;j-)if(arryij=1)t=1;for(k=0;k3-j;k+)t=t*2;temp+=t;*/bi=tem

23、p;void To102(int a, int b,int n)/二进制转十进制int i,j;int temp;int arry88;int t=1,k;for(i=0;in/8;i+)for(j=0;j8;j+)arryij=a8*i+j;for (i=0;i=0;j-)if(arryij=1)t=1;for(k=0;k7-j;k+)t=t*2;temp+=t;bi=temp;void F_Function(int a32,int b32,int n)/F函数int i;int tmp48;int tep32;Replacement(a,E_Table,tmp,48);/扩展变换E/*pr

24、intf(n第%d轮E盒扩展结果:,n);for(i=0;i48;i+)if(i%8=0)printf( );printf(%d,tmpi);*/for(i=0;i48;i+)/与子密钥异或tmpi = Kni;/*printf(n进入S盒的48比特:);for(i=0;i48;i+)if(i%6=0)printf( );printf(%d,tmpi);*/S_press(tmp,tep); /压缩变换SReplacement(tep,P_Table,b,32); /置换运算P/*printf(n第%d次P置盒输出:,l+);for(i=0;i32;i+)if(i%8=0)printf( );

25、printf(%d,bi);*/*printf(nf%d的输出结果:,n);for(i=0;i32;i+)if(i%8=0)printf( );printf(%d,bi);*/void Encryption(int m064,int c164)int i,k;int arry32;int c064,m164;Replacement(m0,IP_Table,m1,64); /初始置换IP/*printf(n初始置换:);for(i=0;i64;i+)if(i%8=0)printf( );printf(%d,m1i);*/for(i=0;i32;i+)L0i=m1i;R0i=m1i+32;k=1;

26、while(k17)F_Function(Rk-1,arry,k-1);for(i=0;i32;i+)Lki=Rk-1i;Rki=Lk-1iarryi;k+;for(i=0;i32;i+)c0i=R16i;c0i+32=L16i;Replacement(c0,IP_1_Table,c1,64); /逆初始置换void changeKey(int a1648)int i,j;int tmp1648;for(i=0;i16;i+)for(j=0;j48;j+)tmpij=aij;for(i=0;i16;i+)for(j=0;j48;j+)Kij=tmp15-ij;void Decryption(i

27、nt c1,int m)int c064,t64;int i,k;int arry32;changeKey(K);/*printf(n交换后的密钥:n);for(i=0;i16;i+)printf(n);for(j=0;j48;j+)if(j%8=0)printf( );printf(%d,Kij);*/Replacement(c1,IP_Table,c0,64);/初始IPfor(i=0;i32;i+)L0i=c0i;R0i=c0i+32;k=1;while(k17)F_Function(Rk-1,arry,k-1);for(i=0;i32;i+)Lki=Rk-1i;Rki=Lk-1iarr

28、yi;k+;for(i=0;i32;i+)ti=R16i;ti+32=L16i;Replacement(t,IP_1_Table,m,64); /逆初始置换void print() /输出函数int i;int a12,b12,d316;int p64,q64;for(i=0;i32;i+)pi=L15i;p32+i=R15i;qi=R16i;qi+32=L16i;To10(K14,a,48);To10(K15,b,48);To10(c,d0,64);To10(p,d1,64);To10(q,d2,64);printf(ntt15轮密钥:);for(i=0;i12;i+)printf(%x,a

29、i);printf(t15轮结果:);for(i=0;i16;i+)printf(%X,d1i);printf(ntt16轮密钥:);for(i=0;i12;i+)printf(%X,bi);printf(t16轮结果:);for(i=0;i16;i+)printf(%X,d2i);printf(ntt最后结果:);for(i=0;i16;i+)printf(%X,d0i);/*printf(n最后结果二进制:);for(i=0;i64;i+)printf(%d,ci);*/int main()int num,i,t;char s18,s28;int m64; /m存放二进制明文/密文int

30、d64; /存放二进制密钥int s8;show1();printf(ttinput you choice:);while(1)scanf(%d,&num);switch(num)case 1:system(cls);/调用清屏函数show2();scanf(%d,&num);if(num=1)while(strlen(s1)!=8)printf(tt请输入明文(8):);scanf(%s,s1);To2Bin(s1,m);/将明文转换成二进制流while(strlen(s2)!=8)printf(tt请输入密钥(8):);scanf(%s,s2);To2Bin(s2,d);/将密钥转换成二进

31、制/*printf(n初始二进制明文:);for(i=0;i64;i+)printf(%d,mi);*/*printf(n初始二进制密钥:);for(i=0;i64;i+)printf(%d,di);*/SubKey(d);/*printf(n16轮子密钥如下:);for(i=0;i16;i+)printf(nK%d:,i+1);for(j=0;j48;j+)if(j%8=0)printf( );printf(%d,Kij);*/Encryption(m,c);/*printf(n16次迭代左结果:);for(i=0;i17;i+)printf(nL%d:,i);for(j=0;j32;j+)

32、if(j%8=0)printf( );printf(%d,Lij);printf(n16次迭代右结果:);for(i=0;i17;i+)printf(nR%d:,i);for(j=0;j32;j+)if(j%8=0)printf( );printf(%d,Rij);*/print();/*printf(n二进制密文:);for(i=0;i64;i+)printf(%d,ci);*/printf(ntt按0将此密文解密,1返回上一层,2返回主界面,其他键退出.);scanf(%d,&t);if(t=0)int s8;int a64;Decryption(c,a);/*printf(n解密后的二进

33、制:);for(i=0;i64;i+)printf(%d,ai);*/To102(a,s,64);printf(ntt解密结果:);for(i=0;i8;i+)printf(%c,si);printf(ntt按1加密,2解密,3退出);else if(t=1)system(cls);show2();else if(t=2)system(cls);show1();elseexit(0);else if(num=2)char str120,str220;printf(tt请输入明文文件名:);scanf(%s,str1);reader(str1,s1);To2Bin(s1,m);printf(tt

34、请输入密钥文件名:);scanf(%s,str2);reader(str2,s2);To2Bin(s2,d);SubKey(d);Encryption(m,c);print();printf(ntt按0将此密文解密,1将密文存入文件,2返回主界面,其他键退出.);scanf(%d,&t);if(t=0)int a64;Decryption(c,a);/*printf(n解密后的二进制:);for(i=0;i64;i+)printf(%d,ai);*/To102(a,s,64);printf(ntt解密结果:);for(i=0;i8;i+)printf(%c,si);printf(ntt按1加密

35、,2解密,3退出);else if(t=1)int a16;char str30;FILE *fw;printf(ntt请输入文件名:);scanf(%s,str);fw=fopen(str,w);if(fw=NULL)printf(ntt文件打开失败!n);elseTo10(c,a,64);for(i=0;i16;i+)fprintf(fw,%X,ai);fclose(fw);printf(ntt密文保存成功!按1加密,2解密,3退出);else if(t=2)system(cls);show1();elseexit(0);else if(num=3)system(cls);exit(0);

36、elseprintf(ntt输入不正确,请重新输入:); break;case 2:system(cls);printf(nntt-DES解密-);while(strlen(s1)!=8)printf(nnntt请输入密文(8):);scanf(%s,s1);To2Bin(s1,m);while(strlen(s2)!=8)printf(tt请输入密钥(8):);scanf(%s,s2);To2Bin(s2,d);SubKey(d);Decryption(m,c);print();printf(ntt按1返回上一层,2返回主界面,其他键退出.);scanf(%d,&t);if(t=1)syst

37、em(cls);printf(nntt-DES解密-);while(strlen(s1)!=8)printf(nntt请输入密文(8):);scanf(%s,s1);To2Bin(s1,m);while(strlen(s2)!=8)printf(tt请输入密钥(8):);scanf(%s,s);To2Bin(s2,d);SubKey(d);Decryption(m,c);print();else if(t=2)system(cls);show1();elseexit(0); break;case 3:system(cls);exit(0);default:printf(输入不正确,请重新输入:);return 0;说明:程序中有大局部的注释代码,去掉注释可查看各局部中间结果,如:十六轮子密钥,十六轮结果等。六,程序运行(1),程序运行主界面:(2) ,加密界面:(3) ,运行选项一:(4) ,运行选项二:42 / 42

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!