欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

DES加密算法地实现

  • 资源ID:82940263       资源大小:261KB        全文页数:42页
  • 资源格式: DOC        下载积分:10积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要10积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

DES加密算法地实现

word某某工学院计算机信息工程学院数据结构课程设计报告题 目 DES加密算法的实现班 级 14软一学号某某 王磊组长 学号某某 王凯旋学号某某 陶伟2016 年01月06日一,实验名称: DES加密算法的实现二,实验内容:a) 熟悉DES算法的根本原理;b) 依据所算如此的算法,编程实现该该算法;c) 执行程序并分析结果;三,实验原理1,概述DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端 输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法除密钥编排不同以外。 密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。密钥可以是任意的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位的密文输出块,他所使用的密钥也是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,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运算。故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) 编写概要设计,详细设计报告c) 使用visual c+工具,编码.d) 调试与测试五,主要程序#include<stdio.h>#include<stdlib.h>#include<string.h>void 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.退出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*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<8;i+) int j=0x80;for(;j;j>>=1) if(j&pi) bk+=1; else bk+=0; int IP_Table64 = /初始置换(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, 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,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, 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, 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, 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, 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, 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;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,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,48,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;i<num;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;i<28;i+)arry2i=arry1(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;i<28;i+)/将PC_1输出的56比特分为左右两局部C0i=K1i;D0i=K1i+28;i=0;while(i<16)int j;lif_move(Ci,Ci+1,move_timesi);lif_move(Di,Di+1,move_timesi);for(j=0;j<28;j+)K2j=Ci+1j;K2j+28=Di+1j;Replacement(K2,PC_2,Ki,48);/密钥置换PC_2i+;/*printf("n子密钥生成过程中,左边生成的值:");for(i=0;i<17;i+)int j;printf("nC%d:",i);for(j=0;j<28;j+)if(j%7=0)printf(" ");printf("%d",Cij);printf("n子密钥生成过程中,右边生成的值:");for(i=0;i<17;i+)int j;printf("nD%d:",i);for(j=0;j<28;j+)if(j%7=0)printf(" ");printf("%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;i<8;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<8;i+) for(j=3;j>=0;j-) tempj=shai%2; shai=shai/2; for(j=0;j<4;j+) shc4*i+j=tempj; /*printf("n第%d次s盒的输出:",m+);for(i=0;i<32;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;i<n/4;i+)for(j=0;j<4;j+)arryij=a4*i+j;for (i=0;i<n/4;i+)temp=arryi0*8+arryi1*4+arryi2*2+arryi3*1;/*for(j=3;j>=0;j-)if(arryij=1)t=1;for(k=0;k<3-j;k+)t=t*2;temp+=t;*/bi=temp;void To102(int a, int b,int n)/二进制转十进制int i,j;int temp;int arry88;int t=1,k;for(i=0;i<n/8;i+)for(j=0;j<8;j+)arryij=a8*i+j;for (i=0;i<n/8;i+)temp=0;for(j=7;j>=0;j-)if(arryij=1)t=1;for(k=0;k<7-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/*printf("n第%d轮E盒扩展结果:",n);for(i=0;i<48;i+)if(i%8=0)printf(" ");printf("%d",tmpi);*/for(i=0;i<48;i+)/与子密钥异或tmpi = Kni;/*printf("n进入S盒的48比特:");for(i=0;i<48;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;i<32;i+)if(i%8=0)printf(" ");printf("%d",bi);*/*printf("nf%d的输出结果:",n);for(i=0;i<32;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;i<64;i+)if(i%8=0)printf(" ");printf("%d",m1i);*/for(i=0;i<32;i+)L0i=m1i;R0i=m1i+32;k=1;while(k<17)F_Function(Rk-1,arry,k-1);for(i=0;i<32;i+)Lki=Rk-1i;Rki=Lk-1iarryi;k+;for(i=0;i<32;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;i<16;i+)for(j=0;j<48;j+)tmpij=aij;for(i=0;i<16;i+)for(j=0;j<48;j+)Kij=tmp15-ij;void Decryption(int c1,int m)int c064,t64;int i,k;int arry32;changeKey(K);/*printf("n交换后的密钥:n");for(i=0;i<16;i+)printf("n");for(j=0;j<48;j+)if(j%8=0)printf(" ");printf("%d",Kij);*/Replacement(c1,IP_Table,c0,64);/初始IPfor(i=0;i<32;i+)L0i=c0i;R0i=c0i+32;k=1;while(k<17)F_Function(Rk-1,arry,k-1);for(i=0;i<32;i+)Lki=Rk-1i;Rki=Lk-1iarryi;k+;for(i=0;i<32;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;i<32;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;i<12;i+)printf("%x",ai);printf("t15轮结果:");for(i=0;i<16;i+)printf("%X",d1i);printf("ntt16轮密钥:");for(i=0;i<12;i+)printf("%X",bi);printf("t16轮结果:");for(i=0;i<16;i+)printf("%X",d2i);printf("ntt最后结果:");for(i=0;i<16;i+)printf("%X",d0i);/*printf("n最后结果二进制:");for(i=0;i<64;i+)printf("%d",ci);*/int main()int num,i,t;char s18,s28;int m64; /m存放二进制明文/密文int 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);/将密钥转换成二进制/*printf("n初始二进制明文:");for(i=0;i<64;i+)printf("%d",mi);*/*printf("n初始二进制密钥:");for(i=0;i<64;i+)printf("%d",di);*/SubKey(d);/*printf("n16轮子密钥如下:");for(i=0;i<16;i+)printf("nK%d:",i+1);for(j=0;j<48;j+)if(j%8=0)printf(" ");printf("%d",Kij);*/Encryption(m,c);/*printf("n16次迭代左结果:");for(i=0;i<17;i+)printf("nL%d:",i);for(j=0;j<32;j+)if(j%8=0)printf(" ");printf("%d",Lij);printf("n16次迭代右结果:");for(i=0;i<17;i+)printf("nR%d:",i);for(j=0;j<32;j+)if(j%8=0)printf(" ");printf("%d",Rij);*/print();/*printf("n二进制密文:");for(i=0;i<64;i+)printf("%d",ci);*/printf("ntt按0将此密文解密,1返回上一层,2返回主界面,其他键退出.");scanf("%d",&t);if(t=0)int s8;int a64;Decryption(c,a);/*printf("n解密后的二进制:");for(i=0;i<64;i+)printf("%d",ai);*/To102(a,s,64);printf("ntt解密结果:");for(i=0;i<8;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请输入密钥文件名:");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;i<64;i+)printf("%d",ai);*/To102(a,s,64);printf("ntt解密结果:");for(i=0;i<8;i+)printf("%c",si);printf("ntt按1加密,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;i<16;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);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)system("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

注意事项

本文(DES加密算法地实现)为本站会员(无***)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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