




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(实习论文) 文件的DES加解密作者:陈建湘; 学号:023421031; 班级:科计A班中文摘要:本文主要以DES算法为例,介绍分组密码体制,在具体的实践中模拟把文件名为letter.doc的书信加密成密文文件cipher.dat,而对方则通过解密程序又把密文译回成原来的明文。用面向对象的思想,与文件操作相结合,分析现代密码体制的优缺点,考虑密码技术的发展方向,提出作者自己的一些构思。关键字:DES,加密,解密,文件,面向对象,算法前言:本文面向读者群体为两类,一类为熟悉信息密码技术的专业人士,则只需阅读加下划线的作者的创新思想和后面源程序的第2,3页的主程序和头函数即可,而处于学习密码技术和C编程的人员则可以学习作者独特的经验和方法技巧,以便在今后的学习中把握好方向,少走弯路。正文:DES算法及分组密码体制 DES(Data Encryption Standard)是分组密码体制,于1977年元月被采纳为联邦标准,允许在非保密的政府通信中使用。DES加解密变换Ek、Dk,在首尾端使用置换及逆置换,以体现混乱原则;Ek,Dk均要经过16轮迭代,共要用到16个子密匙,还有S盒技术。整个DES算法由子密匙生成算法、加密算法、解密算法3部分组成。VC 中bitset 用法和文件操作 在Visual C 6.0中提供了一个标准库以实现对二进制位的操作,bitset中的N代表bit位数,例如一个英文字符占8个bit位。其中的运算有左移位、与&、或|、抑或等。VC流类库中同样提供了两个函数对文件的读写istream&istream:read(char *,int);ostream&ostream:write(const char *,int);第一个参数代表一个字符串指针,第二个参数为字符串的长度。当然也可以用对单个字符的操作get(),put()函数实现文件的读写,但是这样实现很麻烦,与分组密码体制很难对应,例如DES算法中明文的长度为64bit,即8个字符的长度,如果用get()函数则要读8次,但用read(s,8)则只需要一次就够了,这样既方便又有效,是算法与程序实现的完美结合。漏洞分析虽然采用编程技巧可以降低算法实现的难度,但是也要以牺牲一部分通用操作为代价的。例如在文件中有文件结束字符,可以通过eof()来判断,但是如果在加密时刚好在密文正文中出现了文件结束字符,则解密时只能得到明文的一部分。解决的方法不是没有,但很别扭,可以单独处理文件结束符,也可以手动记录密文或者明文的长度,达到有效解密。憧憬和展望 作者认为,将来的密码体制如能加入时间在算法中的体现则又是一场新的革命,即密匙或者解密算法是随时间而变化,这样就体现了时空的统一和信息的实效性。参考文献:现代密码学与金融信息安全技术王泽辉编著,暨南大学出版社;C函数库查询辞典陈正凯编著,中国铁道出版社; 英文摘要:FOR DES READER.1(主函数)加密主函数:#include Cipher.h#include DES.h#define key_in key.txt#define MI letter.doc#define CI cipher.datvoid main()char* keyfile=key_in;char* mingfile=MI;char* cipherfile=CI;DES d(keyfile);d.Sonkey();d.Encipher(mingfile,cipherfile);解密主函数:#include Cipher.h#include DES.h#define key_in key.txt#define CI cipher.dat#define DE decipher.docvoid main()char* keyfile=key_in;char* cipherfile=CI;char* decipherfile=DE;DES d(keyfile);d.Sonkey();d.Decipher(cipherfile,decipherfile);Cipher类的声明:#ifndef Cipher_h#define Cipher_h#include using namespace std;class Cipherpublic: void Encipher(char* mfile,char* cfile);/virtual=0; void Decipher(char* cfile,char* dfile);/virtual=0;protected:private:;#endif2(头文件)DES类的声明:#ifndef DES_h#define DES_h#include Cipher.h#include #include #include #include #include #define INITDES initialdes.txtclass DES: public Cipherpublic: DES(char* keyfile);void Sonkey(); bitset Enciphering(bitset m); bitset Deciphering(bitset c);void Encipher(char* mfile,char* cfile);void Decipher(char* cfile,char* dfile);private:bitset Key1;bitset K17;bitset l17,ri17,X17,Y17;int PC_I57;int PC_II49;int r17;int Di49;int Mp33,Sb9416;int Ip65,Ip_165;bitset DI(bitset x);bitset SBOX(bitset x);bitset MP(bitset x);bitset IP(bitset x);bitset IP_1(bitset x);bitset L(bitset x);bitset R(bitset x);bitset SW(bitset x,bitset y);bitset f(bitset Ri_1,bitset Ki);long mingsize,ciphersize;3(DES类实现)bitset DES:DI(bitset x)bitset y;int i;bool t;for( i=47;i=0;i-)t=x.at(32-Di48-i);y.set(i,t);/coutyendl;return y;bitset DES:MP(bitset x)bitset y;int i;bool t;for(i=31;i=0;i-)t=x.at(32-Mp32-i);y.set(i,t);return y;bitset DES:IP(bitset x)bitset y;int i;bool t;for(i=63;i=0;i-)t=x.at(64-Ip64-i);y.set(i,t);/coutyendl;return y;bitset DES:IP_1(bitset x)bitset y;int i;bool t;for(i=63;i=0;i-)t=x.at(64-Ip_164-i);y.set(i,t);return y;bitset DES:L(bitset x)bitset y;int i;bool t;for(i=63;i=32;i-)t=x.at(i);y.set(i-32,t);return y;bitset DES:R(bitset x)bitset y;int i;bool t;for(i=31;i=0;i-)t=x.at(i);y.set(i,t);return y;(DES类实现)3(DES类实现)bitset DES:SW(bitset x,bitset y)bitset z;int i;bool t;for(i=31;i=0;i-)t=x.at(i);z.set(i,t);for(i=31;i=0;i-)t=y.at(i);z.set(i+32,t);return z;bitset DES:f(bitset Ri_1,bitset Ki)bitset U;bitset V;U=DI(Ri_1);U=UKi;/coutKiendl;/coutUendl;V=SBOX(U);/coutVendl;V=MP(V);/coutVendl;return V;DES:DES(char* keyfile)/int i,j,k,m;bitset tt;string str;ciphersize=0;char s64=1,x8;unsigned char c,c1;unsigned int t;/=0,ifstream fin(keyfile,ios:in|ios:binary);/|ios:nocreate|if(!fin)coutkeyfile cannot be openned!endl;exit(1);for( i=0;i8;i+)c=fin.get();t=unsigned int(c);/tt=t;/_itoa(t,x,2);str=tt.to_string();strcpy(x,str.c_str();k=i*8;for( j=0;j8;j+)m=k+j;sm=xj;/coutsi*8+jendl;if(i=0) c1=s0;/(DES类实现)4(DES类实现)s64=0;s0=c1;/Key0=bitset(s);/cout种子密匙: Key0endl;/输出K0;fin.close(); fin.open(INITDES,ios:in);/|ios:binary|ios:nocreate|if(!fin)coutkeyfile cannot be openned!endl;exit(1);for(i=1;iPC_Iic;/coutPC_Ii;for(i=1;iPC_IIic;/coutendl;coutPC_IIi,;for(i=1;iric;/coutendl;coutri,;for(i=1;iDiic;/coutDii,;coutendl;for(i=1;iMpic;/coutMpi,;coutendl;for(k=1;k=8;k+)for(i=0;i4;i+)for(j=0;jSbkijc;/coutSbkij,;coutendl;for(i=1;iIpic;/coutIpi,;coutendl;for(i=1;iIp_1ic;/coutIp_1i,;coutendl;fin.close();void DES:Sonkey()bitset C17,D17;int i,j;bool t;bitset w;for(i=55;i=0;i-)t=Key0.at(64-PC_I56-i);w.set(i,t);/coutw=28;i-)t=w.at(i);C0.set(i-28,t);/coutC0=0;i-)t=w.at(i);D0.set(i,t);/coutD0endl;for(i=1;i=0;j-)t=Ci-1.at(j);Ci.set(j+1)%28,t);/coutCi=0;j-)t=Di-1.at(j);Di.set(j+1)%28,t);/coutDi=0;j-)t=Ci-1.at(j);Ci.set(j+2)%28,t);/coutCi=0;j-)t=Di-1.at(j);Di.set(j+2)%28,t);/coutDi=28;j-) t=Ci.at(j-28);w.set(j,t); for(j=27;j=0;j-) t=Di.at(j);w.set(j,t);/coutw=0;j-)t=w.at(56-PC_II48-j);Ki.set(j,t);/coutKiendl;/结束i;bitset DES:SBOX(bitset x)bitset y;int i,j,k,l,ro,co,z;bool t,b6;char row2,col4;bitset m;bitset n;bitset U9;bitset V9;/coutxendl;for(i=1;i=8;i+)for(j=1;j=6;j+)z=48-(i-1)*6-j;t=x.at(z);Ui.set(6-j,t);/coutUiendl;for(k=1;k=8;k+)for(l=0;l6;l+)(DES类实现)5(DES类实现)bl=Uk.at(l);if(b5)row0=1;else row0=0;if(b0)row1=1;else row1=0;m=bitset(row);ro=m.to_ulong();for(l=4;l=1;l-)if(bl)col4-l=1;else col4-l=0;n=bitset(col);co=n.to_ulong();Vk=Sbkroco;/coutVkendl;for(i=1;i=8;i+)for(j=1;j=4;j+)t=Vi.at(4-j);z=32-(i-1)*4-j;y.set(z,t);/coutyendl;return y;bitset DES:Enciphering(bitset M)int i;bitset Z,C;Z=IP(M);l0=L(Z);ri0=R(Z);/coutl0endl;coutri0endl;for(i=1;i=16;i+)li=rii-1;rii=li-1f(rii-1,Ki);Z=SW(l16,ri16);/coutl16endl;/coutri16endl;C=IP_1(Z);/for(i=0;i=16;i+)coutliendl;coutriiendlendl;cout分割endl;return C;bitset DES:Deciphering(bitset C)/coutCendl;bitset Z,M;int i;Z=IP(C);X0=L(Z);Y0=R(Z);for(i=1;i=16;i+)Xi=Yi-1;(DES类实现)6(DES类实现)Yi=Xi-1f(Yi-1,K17-i);/coutK17-iendl;Z=SW(X16,Y16);M=IP_1(Z);/coutMendl;/for(i=0;i=16;i+)coutXiendl;coutYiendlendl;return M;void DES:Encipher(char* mfile,char* cfile)bitset Z,C;bitset tt;string str;int i,j,k;char ch88;char cstr64;char s64=1,x8;unsigned char c,c1,c2;unsigned int t;/ifstream fin(mfile,ios:binary|ios:in);/|ios:nocreateif(!fin)coutmfile cannot be openned!endl;exit(1);ofstream fout(cfile,ios:binary|ios:trunc|ios:out);/|ios:nocreateif(!fout)coutcfile cannot be openned!endl;exit(1);/*/c=fin.get();while(fin)/取数据:c-255t=unsigned int(c);tt=t;/_itoa(t,x,2);str=tt.to_string();strcpy(x,str.c_str();for( j=0;j8;j+)sj=xj;c1=x0;for( i=1;i8;i+)c=fin.get();t=unsigned int(c);tt=t;/_itoa(t,x,2);str=tt.to_string();strcpy(x,str.c_str();k=i*8;for( j=0;j8;j+)sk+j=xj;c=fin.get();(DES类实现)7(DES类实现)s0=c1;s64=0;/coutendl; Z=bitset(s);/cout明文编码: Zendl;/加密开始:C=Enciphering(Z);/cout密文编码: Cendl;str=C.to_string();/coutstrendl; strcpy(cstr,str.c_str(); /coutcstrendl;for(i=0;i8;i+)for(j=0;j8;j+)k=i*8+j;chij=cstrk;tt=bitset(chi);t=tt.to_ulong();c2=t;fout.put(c2);ciphersize+;/加密结束;/结束while;fin.close();fout.close();void DES:Decipher(char* cfile,char* dfile)bitset C,D;bitset tt;string str;int i,j,k;char ch88;char cstr64;char s64=1,x8;unsigned char c,c1,c2;unsigned int t;/ifstream fin(cfile,ios:binary|ios:in);/ios:nocreate|if(!fin)coutcfile cannot be openned!endl;exit(1);ofstream fout(dfile,ios:binary|ios:tr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 猪场建设资金预算方案
- 人防工程施工组织设计方案
- 无人机教学设备更新与技术升级方案
- 新媒体时代新闻真实性变革与公信力维护报告
- 学校消防安全管理人职责社会监督
- 血涂片分类计数数据质量控制流程
- 提升城市对外开放合作水平的策略及实施路径
- 员工辞职报告模板(5篇材料)
- 氢能基础设施2025年市场前景与技术突破分析报告
- 肺癌早期诊断的预防措施
- 国家中医药管理局《中医药事业发展“十五五”规划》全文
- 香港公司章程范本中文
- 人教版高中地理选择性必修一-4.2洋流(第1课时)(教学设计)
- 古建筑修缮脚手架施工案例解析
- 2025心肺复苏术(CPR)指南与实操
- 游艇消防安全培训课件
- 2024-2025学年人教版二年级体育下册全册教案
- 基因工程的伦理准则
- 标本转运流程及注意事项
- 车辆构造与检修(第三版)课件 项目1 铁道车辆基本知识认知
- 2025年全国企业员工全面质量管理知识竞赛题库及答案(共132题) - 副本
评论
0/150
提交评论