




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 验 报 告课程:密码学 班级: 姓名: 学号:成绩: 指导教师: 实验日期:2011/5/25实验密级: 预习程度: 实验时间:12:50-15:20仪器组次: 18 必修/选修:必修 实验序号:4实验名称: 实现DES 分组密码算法的加解密 实验目的与要求:1、掌握DES 分组密码算法的软件实现方法;2、复习DES 分组密码算法设计的基本原理;3、能用DES 分组密码算法实现已知明文的加解密 实验仪器:名称型号数量计算机Lenovo1一、 实验要求1、求主密钥的扩展密钥前,先输出使用的PC-1 置换和PC-2 置换;2、对明/密文文件用DES 算法进行加/解密前,先输出确定使用的S 盒和
2、有关置换表;3、“确定主密钥的扩展密钥”和“对明/密文文件的加/解密”分别编写两个模块,如果时间不够,可以任选一个模块;4、确定扩展密钥前,先指出是加密密钥还是解密密钥;5、密钥扩展的移位的位数可以先添表,但最后一轮移位完后,必须回到初始值c0d0。6、主密钥长度与明文相一致,需要忽略校验位;7、能完成任意给定的一个明/密文文件的加/解密;8、加解密结果正确。二、实验内容与步骤下面是程序的部分代码int main() char MingWen104; char target8; char InputKey8; int text64; int text_ip64; int L032,Li32;
3、int R032,Ri32;int RE048; int key64; int keyPC156; int A28; int B28;int keyAB56; int K1648; int RK48; int RKS8; int SP32; int RKSP32; int text_end64; int text_out1464; char init9="HTmadeit" int CBC64;int result1364;int H208;char MiWen208;int C832;int M138;char choice;int t;int i,j;int k,l,m
4、,n;int r8,c8;int flag=1;printf("欢迎使用DES加密解密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"
5、;); scanf("%c",&choice);getchar(); printf("请输入8位密钥:n");gets(InputKey);while(InputKey7='0'|InputKey8!='0') printf("您输入的密钥位数有误,请重新输入8位密钥:n"); gets(InputKey);for(i=0;i<8;i+) 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
6、;j<8;j+) key(i*8)+j=a7-j;for(i=0;i<56;i+) keyPC1i=keyPC1i-1; for(i=0;i<28;i+) Ai=keyPC1i; Bi=keyPC1i+28; for(t=0;t<16;t+) if(movet=1) n=A0; for(i=0;i<27;i+) Ai=Ai+1; A27=n; n=B0; for(i=0;i<28;i+) else for(i=0;i<8;i+) targeti=MingWeni+(8*l); for(i=0;i<8;i+) int a8=0,0,0,0,0,0,
7、0,0; m=targeti; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j<8;j+) text(i*8)+j=a7-j; /for(i=0;i<64;i+) /printf("%d,",texti); /printf("n"); /for(i=0;i<64;i+) /printf("%d,",text_outli); /printf("n"); for(i=0;i<64;i+) /CBC模式下前一分组的密文异或当前分组 texti=text_outl
8、itexti; /for(i=0;i<64;i+) /printf("%d,",texti); /printf("n"); /对每个text进行DES加密 for(i=0;i<64;i+) /进行初始换位 text_ipi=textIPi-1; for(i=0;i<32;i+) /分成左右两部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i<32;i+) / printf("%d,",L0i); /for(i=0;i<32;i+) / printf(&quo
9、t;%d,",R0i); /十六次迭代 for(t=0;t<16;t+) for(i=0;i<48;i+) /将右半部分通过扩展换位表E从32位扩展成48位 RE0i=R0Ei-1; /printf("RE0n"); /for(i=0;i<48;i+) /printf("%d,",RE0i); for(i=0;i<48;i+) /RE与K异或运算 RKi=RE0iKti; /printf("n"); /for(i=0;i<48;i+) /printf("%d,",RKi);
10、for(i=0;i<8;i+) /将R和K异或运算的结果通过S位移表 ri=RK(i*6)+0*2+RK(i*6)+5; ci=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;i<8;i+) /把结果转成32位二进制储存在数组SP中 int b4=0,0,0,0; m=RKSi; for(j=3;m!=0;j-) b
11、j=m%2; m=m/2; for(j=0;j<4;j+) SPj+(i*4)=bj; for(i=0;i<32;i+) /将二进制结果再经过一个P盒换位 RKSPi=SPPi-1; for(i=0;i<32;i+) /与前一次的左部异或运算,得到本次迭代的右部 Rii=L0iRKSPi; for(i=0;i<32;i+) L0i=R0i; R0i=Rii; else if(choice='B'|choice='b') printf("请输入密文内容:n"); gets(MiWen); for(i=0;i<208
12、;i+) Hi=0; for(i=0;MiWeni!='0'i+) /将十六进制密文转化成十进制存放在数组H中 if(MiWeni>='0'&&MiWeni<='9') Hi=MiWeni-'0' else if(MiWeni>='A'&&MiWeni<='F') Hi=MiWeni-'A'+10; else if(MiWeni>='a'&&MiWeni<='f') H
13、i=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<208;i+) Hi=0; for(i=0;MiWeni!='0'i+) /将十六进制密文转化成十进制存放在数组H中 i
14、f(MiWeni>='0'&&MiWeni<='9') Hi=MiWeni-'0' else if(MiWeni>='A'&&MiWeni<='F') Hi=MiWeni-'A'+10; else if(MiWeni>='a'&&MiWeni<='f') Hi=MiWeni-'a'+10; for(i=0;i<n;i+) /将十进制密文转化成二进制存放在数组C中
15、int he4=0,0,0,0; for(j=3;Hi!=0;j-) hej=Hi%2; Hi=Hi/2; for(j=0;j<4;j+) Cj+(i*4)=hej; /for(i=0;i<130;i+) / printf("%d,",Ci); /printf("n"); k=n/16; for(l=0;l<k;l+) for(i=0;i<64;i+) /将每个分组对应的64位二进制密文放到text_out中 text_outl+1i=Ci+(l*64); /for(i=0;i<64;i+) / printf("%
16、d,",text_outli); /printf("n"); /对每个text进行DES解密 for(i=0;i<64;i+) /进行初始换位 text_ipi=text_outl+1IPi-1; /for(i=0;i<64;i+) /printf("%d,",text_ipi); /printf("n"); for(i=0;i<32;i+) /分成左右两部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i<32;i+) / printf("%d
17、,",L0i); /for(i=0;i<32;i+) / printf("%d,",R0i); /CBC模式下的解密 for(i=0;i<64;i+) /前一分组的密文异或当前分组所得明文的二进制放到result中 resultli=text_outlitexti; for(i=0;i<(n/16);i+) /将二进制转成十进制 for(j=0;j<8;j+) Mij=resulti(j*8)+0*128+resulti(j*8)+1*64+resulti(j*8)+2*32+resulti(j*8)+3*16+resulti(j*8)+4
18、*8+resulti(j*8)+5*4+resulti(j*8)+6*2+resulti(j*8)+7; printf("您的文件经过DES解密后的明文是:n"); for(i=0;i<(n/16);i+) for(j=0;j<8;j+) printf("%c",Mij); printf("nnn"); flag=0;printf("是否继续?n");printf("Y继续,N退出,请选择:n");scanf("%c",&choice);while(choice!='Y'&&choice!='N'&&choice!='y'&&choice!='n')printf("对不起,您的输入不合法。请选择Y或N,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兼职外访合同标准文本
- 修建房子合同标准文本
- 公司保洁临时合同标准文本
- 农村烟花购买合同标准文本
- 专利 外包合同标准文本
- 农村猪圈出售合同标准文本
- 2025合同法案例:租赁合同纠纷处理
- 医院的聘用合同(2025年版)
- 中小企业经济分析合同
- 疫情防控知识专题课件
- 湖北省武汉市2025届高三下学期二月调研考试数学试卷
- 2025年志愿服务知识竞赛考试题(附答案)
- 上海市徐汇区上海中学2024-2025学年高一下学期3月月考地理试题(含答案)
- 二零二五年度研学旅行基地运营管理合同协议
- 仓储场所消防安全培训
- 大学课件-电路分析基础
- 2025年中国流行成分和原料消费深度洞察白皮书
- 2025年昆明长水机场勤务员招聘笔试参考题库含答案解析
- (八省联考)陕西省2025年高考综合改革适应性演练 生物试卷(含答案详解)
- 《光电对抗原理与应用》课件第3章
- 二次供水水箱清洗操作流程
评论
0/150
提交评论