版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
wordword文档可自由复制编辑一.实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。二.实验软件环境运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。三.实验内容算法分析根据所提供的程序分析DESDES程序包括一个头文件和一个实现DES算法的CDES程序通过宏定义可选择小代码模式smallDES算法中的很多加密解密时主要用到下面5个函数。(l)intdes_setup(constunsignedchar*key,intkeylen,intnum_rounds,des_key*skey)函数名称:密钥生成函数。参数说明:key是一个指针,指向用户输入的初始密钥。keylen是输入密钥的长度,以字节为单位。num_rounds是加密轮数,当输入0时,使用算法默认的轮数。skey当密钥生成时,返回值为CRYPT_O(0,结果保留在Skey指向的结构体。des_key的定义如下:typedefstructdes_key{ulong32ek[32],dk[32];}des_key结构体里的ek存储加密时用的子密钥,dk存储解密时用的子密钥。232483248864888。这样做是为了加密时可以把扩展和查表运算结合起来。voiddes_ecb_encrypt(constunsignedchar*pt,unsignedchar*ct,des_key*key)函数名称:加密函数。参数说明;pt是指向待加密的明文数组的指针。ct是指向存储加密结果的指针。key加密成功时,返回。voiddes_ecb_decrypt(constunsignedcharchar*pt,des_key*key)函数名称:解密函数。参数说明:ct是指向待解密的密文数组的指针。pt是指向存储解密结果的指针。key是调用密钥生成函数后存储每一轮子密钥的结构体变量。解密成功时,返回CRYPT_OK。加密和解密时,pt和ct可以指向同一块内存。int函数名称:测试函数。这个函数用来对加密算法进行测试这个函数还可以用来测试函数的运行时间。nitdes_keysize(int函数名称:密钥长度检验函数。参数说明:desired_keysize是使用者所想要的密钥长度。当密钥长度小于所需密钥长度时,返回值为CRYPT_INVALID_KEYSIZE,否则,desired_keysize指向的变量被置为8。使用实例分析#include"des.h"intmain(intargc,char*argv[]){unsignedcharpt[9]="abcdefg",ct[9],key[8]={'a','b','c','d','a','b','c','d'};des_keyskey;pt[9l=ct[9]='\0';des_setup(key,8,0,&skey);des_ecb_encrypt(pt.ct,&skey);des_ecb_decrypt(ct.pt,&skey);printf("%s\n",pt);prinif("%s\n",ct);system("PAUSE");retun0;}8Byteptpt和ct9。四、实验结果:(1)使用附录提供的程序对一个文件进行加密和解密,提交程序代码和执行结果。①修改程序,添加main函数,使程序能够正常运行,并作修改如下:intmain(intargc,char*argv[]){intchoice;system("colorf0");cout<<"╭═══════════╮"<<endl;cout<<"║选项: cout<<"║1.文件加密2.文件解密║"<<endl;cout<<"╰═══════════╯"<<endl;cout<<"选择:";cin>>choice;cout<<endl;if(choice==1){chara;charifn[10];charofn[10];//文件名cout<<"输入需要加密的文件名:"<<endl;cin>>ifn;cout<<cin>>ofn;ifstreamf1(ifn); //从文件中读ofstreamf2(ofn); //写到到文件unsignedcharpt[9],ct[9],nt[50],mt[9],key[8]={'a','b','c','d','a','b','c','d'};symmetric_keyskey;intn=0;intnn=0;while(!f1.eof()){a=f1.get();nt[n]=a;n++;}nt[n]='\0';for(intcount=0;count<=(n-1)/8;count++){mt[8]='\0';ct[8]='\0';pt[8]='\0';for(inti=0;i<8;i++){pt[i]=nt[nn];nn++;}des_setup(key,8,0,&skey);des_ecb_encrypt(pt,ct,&skey);for(intm=0;m<8;m++)f2.put(ct[m]);}cout<<"加密完成!"<<endl;f1.close();f2.close();system("PAUSE");}elseif(choice==2){chara;charifn[10];charofn[10];//文件名cout<<cin>>ifn;cout<<cin>>ofn;ifstreamf1(ifn); //从文件中读ofstreamf2(ofn); //写到到文件unsignedcharpt[9],ct[9],nt[50],mt[9],key[8]={'a','b','c','d','a','b','c','d'};symmetric_keyskey;intn=0;intnn=0;while(!f1.eof()){a=f1.get();nt[n]=a;n++;}nt[n]='\0';for(intcount=1;count<=(n-1)/8;count++){mt[8]='\0';ct[8]='\0';pt[8]='\0';for(inti=0;i<8;i++){ct[i]=nt[nn];nn++;ct[8]='\0';}des_setup(key,8,0,&skey);des_ecb_decrypt(ct,pt,&skey);for(intm=0;m<8;m++){if(pt[m]==255)break;f2.put(pt[m]);}}cout<<f1.close();f2.close();}elseif(choice==3){unsignedcharpt[50]="ilovec",ct[50],mt[50],key[8]={'a','b','c','d','a','b','c','d'};symmetric_keyskey;pt[8]=ct[8]='\0';mt[8]='\0';des_setup(key,8,0,&skey);des_ecb_encrypt(pt,ct,&skey);printf("%s\n",pt);printf("%s\n",ct);des_ecb_decrypt(ct,mt,&skey);printf("%s\n",ct);printf("%s\n",mt);}elsecout<<return0;}②运行结果:初始文件:123.txt对123.txt进行加密加密后文件:321.txt再对经过加密的文件321.txt解密{{word文档可自由复制编辑解密后文件:111.txt(转化成二进制数000llll,比较输入和输出。当把输入的数改变一个位时(如把1F变为1并说明原因。①程序修改如下:intmain(){//生成密钥unsignedcharkey[8]={'a','b','c','d','a','b','c','d'};des_keyskey;des_setup(key,8,0,&skey);cout<<"\n加密前输入原文:";stringbufferString1;voidinputData(string&input);inputData(bufferString1);//加密数据stringbufferString2;voidencodeHexadecimal(string&input,string&output,des_key&skey);encodeHexadecimal(bufferString1,bufferString2,skey);//输出加密数据cout<<"\noutputData(bufferString2);//解密数据voiddecodeHexadecimal(string&input,string&output,des_key&skey);decodeHexadecimal(bufferString2,bufferString1,skey);//输出解密数据cout<<"\n解密后输出原文:";outputData(bufferString1);return0;}//输入16进制数据,转换为按字节存储的字符串,即待加密的数据voidinputData(string&input)for(chartempChar1=cin.get();tempChar1!=10;tempChar1=cin.get()){charascToHexadecimal(charasc);tempChar1=ascToHexadecimal(tempChar1)<<4;chartempChar2=cin.get();if(tempChar2==10){tempChar2=48;input+=ascToHexadecimal(tempChar2)+tempChar1;return;}input+=ascToHexadecimal(tempChar2)+tempChar1;}}//将需要输出的数据转换为16进制数并输出voidoutputData(string&output){for(inti=0;i<output.length();i++){charhexadecimalToAsc(charhexadecimal);cout<<hexadecimalToAsc(output[i]>>4&0x0f);cout<<hexadecimalToAsc(output[i]&0x0f);}cout<<endl;}//用DES算法加密input中的数据,存放在output中voidencodeHexadecimal(string&input,string&output,des_key&skey){for(inti=0;i<input.length();i+=8){charbufferChar1[9],bufferChar2[9];for(intj=0;j<8;j++){if(i+j<input.length()){}else{}
bufferChar1[j]=input[i+j];bufferChar1[j]=0;bufferChar2[j]=0;}bufferChar1[8]=bufferChar2[8]=0;des_ecb_encrypt((unsignedchar*)bufferChar1,(unsignedchar*)bufferChar2,&skeyfor( j=0;j<8&&bufferChar2[j];j++){output+=bufferChar2[j];}}}//用DES算法解密input中的数据,存放在output中voiddecodeHexadecimal(string&input,string&output,des_key&skey){output="";for(inti=0;i<input.length();i+=8)wordword文档可自由复制编辑charbufferChar1[9],bufferChar2[9];for(intj=0;j<8;j++){if(i+j<input.length()){}else{}
bufferChar1[j]=input[i+j]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版房屋代持业务合同范本3篇
- 二零二五版电机维修智能化改造合同范本3篇
- 二零二五年度房地产经纪服务合同7篇
- 二零二五版购房借款及房地产开发商风险控制担保服务合同3篇
- 二零二五版商业地产买卖合同模板下载3篇
- 二零二五年度高等教育机构外国专家项目合作合同参考书3篇
- 二零二五版家用空调安装与室内环境改善合同3篇
- 二零二五年度成都上灶师父招聘与餐饮业人才服务合同2篇
- 展会创意展示合同(2篇)
- 2025年度油气田2#配电房土建安装与防爆电气设备合同3篇
- 下肢皮牵引护理PPT课件(19页PPT)
- 台资企业A股上市相关资料
- 电 梯 工 程 预 算 书
- 参会嘉宾签到表
- 机械车间员工绩效考核表
- 形式发票格式2 INVOICE
- 2.48低危胸痛患者后继治疗评估流程图
- 人力资源管理之绩效考核 一、什么是绩效 所谓绩效简单的讲就是对
- 山东省医院目录
- 云南地方本科高校部分基础研究
- 废品管理流程图
评论
0/150
提交评论