ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:19.10KB ,
资源ID:28240576      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28240576.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DES算法源代码.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DES算法源代码.docx

1、DES算法源代码#includevoid main() /声明变量char MingWen104; /存放原始的明文char target8; /将明文断成8个字符的一个分组char InputKey8; /存放字符型的八位密钥int text64; /存放一个分组转成二进制后的数据int text_ip64; /存放第一次初始换位的结果int L032,Li32; /将64位分成左右各32位进行迭代int R032,Ri32;int RE048; /存放右半部分经过E表扩展换位后的48位数据int key64; /存放密钥的二进制形式int keyPC156; /存放密钥key经过PC1换位

2、表后变成的56位二进制int A28; /将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移int B28;int keyAB56; /将循环左移后两部分的结果合并起来int K1648; /存放16次循环左移产生的子密钥int RK48; /存放RE和K异或运算后的结果int RKS8; /存放经过查找8个S表后得到的8个十进制结果int SP32; /将RKS表中的十进制数化成二进制int RKSP32; /存放SP表经过P盒换位后的结果int text_end64; /存放经过左右32位换位后的结果int text_out1464; /存放初始化向量和所有经过DES

3、的分组的二进制char init9=HTmadeit; /设置初始化向量为“HTmadeit”int CBC64;int result1364;int H208;char MiWen208;int C832;int M138;char choice;int t;int i,j;int k,l,m,n;int r8,c8;int flag=1;int IP64= /初始换位表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,

4、 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;int E48= /扩展换位表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,

5、29, 28, 29, 30, 31, 32, 1 ;int PC156= /PC1换位表(6456)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 ;int move16= /循环移位表1,1,2,2,2,2,2,2

6、,1,2,2,2,2,2,2,1;int PC248= /PC2换位表(5648)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 ; int S1416= /S换位表14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 1

7、5, 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;int S2416=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,

8、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;int S3416=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,

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

10、 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;int S6416=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,

11、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;int S7416= 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,

12、2, 3, 12;int S8416=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 P32= /P换位表16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,2

13、4,14,32,27,3,9,19,13,30,6,22,11,4,25;printf(欢迎使用SKY的加密&解密小程序!nn);while(flag)printf(A加密,B解密,请选择:n);scanf(%c,&choice);while(choice!=A&choice!=B&choice!=a&choice!=b)printf(对不起,您的输入不合法。请选择A或B,A表示加密,B表示解密。n); scanf(%c,&choice);getchar(); /生成子密钥printf(请输入8位密钥:n);gets(InputKey);while(InputKey7=0|InputKey8!

14、=0) printf(您输入的密钥位数有误,请重新输入8位密钥:n); gets(InputKey);for(i=0;i8;i+) /将密钥转化成64位二进制数放到一维数组key中 int a8=0,0,0,0,0,0,0,0; m=InputKeyi; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) key(i*8)+j=a7-j; /for(i=0;i64;i+) /printf(%d,keyi); for(i=0;i56;i+) /通过PC1换位表变成56位密钥放在keyPC1中 keyPC1i=keyPC1i-1; for(i=0;i28;

15、i+) /分成A和B两部分,各28位 Ai=keyPC1i; Bi=keyPC1i+28; for(t=0;t16;t+) if(movet=1) /按照循环移位表将Ai和Bi分别左移movet位 n=A0; for(i=0;i27;i+) Ai=Ai+1; A27=n; n=B0; for(i=0;i28;i+) Bi=Bi+1; B27=n; else n=A0; m=A1; for(i=0;i26;i+) Ai=Ai+2; A26=n; A27=m; n=B0; m=B1; for(i=0;i26;i+) Bi=Bi+2; B26=n; B27=m; for(i=0;i28;i+) /将

16、A和B合并成56位 keyABi=Ai; keyABi+28=Bi; for(i=0;i48;i+) /通过PC2换位表变成48位密钥 Kti=keyABPC2i-1; /for(t=0;t16;t+) /for(i=0;i48;i+) / printf(%d,Kti); for(i=0;i8;i+) /将初始化向量转化成二进制数储存到数组text_out的第一行中 int a8=0,0,0,0,0,0,0,0; m=initi; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) text_out0(i*8)+j=a7-j; /加密程序if(choi

17、ce=A|choice=a) printf(请输入您想加密的内容:n); /输入明文 gets(MingWen); while(MingWen0=0) printf(对不起,明文不可为空,请您输入正确的明文。n); gets(MingWen); /CBC模式下的加密 i=0; /将明文每8个字符作为一个分组,共有n个分组 n=0; while(MingWeni!=0) n+; i+; k=n%8; n=(n-1)/8+1; for(l=0;ln;l+) if(l=(n-1)&k!=0) for(i=0;ik;i+) /将每个分组的8个字符放到数组target中,不够的用空格补充 targeti

18、=MingWeni+(8*l); for(i=k;i8;i+) targeti= ; else for(i=0;i8;i+) targeti=MingWeni+(8*l); for(i=0;i8;i+) /将得到的明文转化成二进制数储存到数组text中 int a8=0,0,0,0,0,0,0,0; m=targeti; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) text(i*8)+j=a7-j; /for(i=0;i64;i+) /printf(%d,texti); /printf(n); /for(i=0;i64;i+) /printf(

19、%d,text_outli); /printf(n); for(i=0;i64;i+) /CBC模式下前一分组的密文异或当前分组 texti=text_outlitexti; /for(i=0;i64;i+) /printf(%d,texti); /printf(n); /对每个text进行DES加密 for(i=0;i64;i+) /进行初始换位 text_ipi=textIPi-1; for(i=0;i32;i+) /分成左右两部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i32;i+) / printf(%d,L0i); /for(i=0

20、;i32;i+) / printf(%d,R0i); /十六次迭代 for(t=0;t16;t+) for(i=0;i48;i+) /将右半部分通过扩展换位表E从32位扩展成48位 RE0i=R0Ei-1; /printf(RE0n); /for(i=0;i48;i+) /printf(%d,RE0i); for(i=0;i48;i+) /RE与K异或运算 RKi=RE0iKti; /printf(n); /for(i=0;i48;i+) /printf(%d,RKi); for(i=0;i8;i+) /将R和K异或运算的结果通过S位移表 ri=RK(i*6)+0*2+RK(i*6)+5; c

21、i=RK(i*6)+1*8+RK(i*6)+2*4+RK(i*6)+3*2+RK(i*6)+4; RKS0=S1r0c0; RKS1=S2r1c1; RKS2=S3r2c2; RKS3=S4r3c3; RKS4=S5r4c4; RKS5=S6r5c5; RKS6=S7r6c6; RKS7=S8r7c7; for(i=0;i8;i+) /把结果转成32位二进制储存在数组SP中 int b4=0,0,0,0; m=RKSi; for(j=3;m!=0;j-) bj=m%2; m=m/2; for(j=0;j4;j+) SPj+(i*4)=bj; for(i=0;i32;i+) /将二进制结果再经过

22、一个P盒换位 RKSPi=SPPi-1; for(i=0;i32;i+) /与前一次的左部异或运算,得到本次迭代的右部 Rii=L0iRKSPi; for(i=0;i32;i+) L0i=R0i; R0i=Rii; /一个左右32位交换 for(i=0;i32;i+) Lii=R0i; for(i=0;i32;i+) R0i=L0i; for(i=0;i32;i+) L0i=Lii; /初始换位的逆过程 for(i=0;i32;i+) /把左右两部分合起来存到text_end中 text_endi=L0i; for(i=32;i64;i+) text_endi=R0i-32; for(i=0;

23、i64;i+) /进行初始换位的逆过程 text_outl+1IPi-1=text_endi; for(i=0;i64;i+) resultli=text_outl+1i; /for(i=0;i64;i+) /printf(%d,resultli); /printf(n); for(j=0;jn;j+) /把result中的二进制密文转成十进制存到数组H中for(i=0;i16;i+)Hi+(j*16)=resultj0+(i*4)*8+resultj1+(i*4)*4+resultj2+(i*4)*2+resultj3+(i*4);/for(i=0;il*16;i+)/printf(%d,H

24、i);for(i=0;in*16;i+) if(Hi10) MiWeni=Hi+48; else if(Hi=10) MiWeni=a; else if(Hi=11) MiWeni=b; else if(Hi=12) MiWeni=c; else if(Hi=13) MiWeni=d; else if(Hi=14) MiWeni=e; else if(Hi=15) MiWeni=f; /else MiWeni=0; for(i=l*16;i224;i+) MiWeni=0;printf(您的文件经过DES加密后的密文是:n);printf(%sn,MiWen);printf(nn); /解密程

25、序else if(choice=B|choice=b) printf(请输入密文内容:n); gets(MiWen); for(i=0;i=0&MiWeni=A&MiWeni=a&MiWeni=f) Hi=MiWeni-a+10; else printf(请输入用十六进制表示的密文内容:n); gets(MiWen); i=0; n=i; /密文中共有n个字符 if(n%16!=0) printf(对不起,您输入的密文不正确,请确认密文的内容,密文的字符数应是16的倍数。n); printf(请输入密文内容:n); gets(MiWen); for(i=0;i=0&MiWeni=A&MiWeni=a&MiWeni=f) Hi=MiWeni-a+10; for(i=0;in;i+) /将十进制密文转化成二进制存放在数组C中 int he4=0,0,0,0; for(j=3;Hi!=0;j-) hej=Hi%2; Hi=Hi/2; for(j=0;j4;j+) Cj+(i*4)=hej;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1