东北大学软信 密码学程序实践报告.doc_第1页
东北大学软信 密码学程序实践报告.doc_第2页
东北大学软信 密码学程序实践报告.doc_第3页
东北大学软信 密码学程序实践报告.doc_第4页
东北大学软信 密码学程序实践报告.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

袃芄蕿薄羆葿蒅薃肈节莁薂膀肅蚀蚁袀芀薆蚀羂肃蒂虿肅艿莈虿袄肂莄蚈羇莇蚃蚇聿膀蕿蚆膁莅蒄蚅袁膈莀螄羃莄芆螃肆膆薅螃螅莂薁螂羇膅蒇螁肀蒀莃螀膂芃蚂蝿袂肆薈螈羄芁蒄袇肆肄莀袇螆芀芆袆袈肂蚄袅肁芈薀袄膃膁蒆袃袃莆莂袂羅腿蚁袁肇莄薇羁膀膇蒃羀衿莃荿薆羂膆芅薅膄蒁蚃薅袃芄蕿薄羆葿蒅薃肈节莁薂膀肅蚀蚁袀芀薆蚀羂肃蒂虿肅艿莈虿袄肂莄蚈羇莇蚃蚇聿膀蕿蚆膁莅蒄蚅袁膈莀螄羃莄芆螃肆膆薅螃螅莂薁螂羇膅蒇螁肀蒀莃螀膂芃蚂蝿袂肆薈螈羄芁蒄袇肆肄莀袇螆芀芆袆袈肂蚄袅肁芈薀袄膃膁蒆袃袃莆莂袂羅腿蚁袁肇莄薇羁膀膇蒃羀衿莃荿薆羂膆芅薅膄蒁蚃薅袃芄蕿薄羆葿蒅薃肈节莁薂膀肅蚀蚁袀芀薆蚀羂肃蒂虿肅艿莈虿袄肂莄蚈羇莇蚃蚇聿膀蕿蚆膁莅蒄蚅袁膈莀螄羃莄芆螃肆膆薅螃螅莂薁螂羇膅蒇螁肀蒀莃螀膂芃蚂蝿袂肆薈螈羄芁蒄袇肆肄莀袇螆芀芆袆袈肂蚄袅肁芈薀袄膃膁蒆袃袃莆莂袂羅腿蚁袁肇莄薇羁膀膇蒃羀衿莃荿薆羂膆芅薅膄蒁蚃薅袃芄蕿薄羆葿蒅薃肈节莁薂膀肅蚀蚁袀芀薆蚀羂肃蒂虿肅艿莈虿袄肂莄蚈羇莇蚃蚇聿膀蕿蚆膁莅蒄蚅袁膈莀螄羃莄芆螃肆膆薅螃螅莂薁螂羇膅蒇螁肀蒀莃螀膂芃蚂蝿袂肆薈螈羄芁蒄袇肆肄莀袇螆芀芆袆袈肂蚄袅肁芈薀袄膃膁蒆袃袃莆莂袂羅腿蚁袁肇莄薇羁膀膇蒃 信息加解密实践总结报告 专 业 信息安全 班 级 软信0902 学 号 姓 名 日 期 东北大学软件学院一、 实践目的与意义通过实践使信息安全专业学生加深对密码学基本原理和加解密理论知识的理解。培养学生在计算机上实现不同类型加密、解密操作运算功能的能力。利用实现的典型加解密方法对输入明文或文件实施加密,并对密文或文件进行解密。能够实现基本的密钥分配方法。培养学生具备简单网络程序开发能力,能够在两个联网终端间进行消息加解密操作。通过参与信息加解密实践,提高学生的分析设计能力、开发过程的团队合作能力、组织管理能力和语言表达能力。二、 实践环境组内成员使用的系统为fedora 15和ubuntu 11.04的linux内核系统。编译工具为gcc。调试工具为gdb。图形界面的开发使用的qt平台。三、 项目组分工组长代哲负责rsa加密的实现以及其rsa公钥加密的双机通信实现。修改des代码,使之为针对文件的操作。组员邵兵负责DH密钥交换的实现,图形界面的开发及网络传输上的整合。修改des使之可针对不同长度明文进行加密。组员胡殿坤负责置换,列置换,playfair和8位明文的des加密的实现。组员李峰负责RC4加密算法和keyword加密方法对文件加密的实现。组员王雷负责Caesar,Affine,Vegenere,Autokey,多文字加密方法的实现。四、 系统设计下面为队员们所做的密码系统中的几大模块:(一) 凯撒密码:主要算法如下:while(plain=getc(f1)!=EOF)/加密if(int)a+key)(int)z)cipher=(char)(int)plain+key-25);elsecipher=(char)(int)plain+key);putc(cipher,f2);解密过程即把密文再向前移相同位,即得到明文:while(plain=getc(f2)!=EOF)/解密if(int)(a-97)=A&ch=a&ch=A&ch=a&ch=z)count=0,i=0;while(ch!=keywordi+) count+; putc(count+a,p3);此函数将密钥数组与按序存储的字母数组相对应,将从密文文件中读出的密文字母,转化为按序字母数组中所对应字母,然后写入解密后文件中。len=strlen(keyword);for(i=0;ilen;i+)for(j=0;ji;j+)if(keywordj=keywordi)for(z=i;zlen;z+)keywordz=keywordz+1;len-;i-;这段代码的将所输入的密钥单词中的重复的字母去掉,保存剩余结果。int flag=0;for(i=len2;iAlpLen;i+)for(j=0;jlen2;j+)if(keywordj=a)a+;flag=1;break;flag=0;if(flag=0)keywordi=a;a+;else i-;keywordi=0;这段代码的作用,是将处理后的密钥单词结果后面,填充未曾出现的字母。多文字加密:主要代码如下:while(plaintext=getc(f1)!=EOF)i=0;if(plaintext=j)plaintext=i;while(plaintext!=key1i)i+;m=key2i%5;n=key2i/5;putc(m,f2);putc(n,f2);解密过程由:字母两两组成一对解密,由一对字母的值确定明文在表中的位置,得到明文。主要代码如下:while(cipher=getc(f2)!=EOF)i=0;while(cipher!=key2i)i+;a=i;i=0;cipher=getc(f2);while(cipher!=key2i)i+;b=i;plaintext=key1b*5+a;putc(plaintext,f3);仿射密码:与凯撒密码相似,对字母表的字母赋予一个初值,a , b为密钥,且GCD(a,26)=1,P为明文,C为密文,则C = (aP+b)(mod26) , P=a(C-b)(mod26)。关键代码如下:char ciphers(char cipher,int m,int n)/加密函数int tmp=(int)cipher-97;cipher=(char)(m*tmp+n)%26+97);return cipher;char plains(char plain,int m,int n)/解密函数int mm=1;/此为m的逆int i=1,tmp;while(mm*m-1)%26)/求逆过程mm+;tmp=(int)plain-97;if(tmpn)tmp=tmp+26;plain=(char)(mm*(tmp-n)%26+97);return plain;(二) 维吉尼亚加密主要代码如下:for(i=0;i26;i+)/此为构建维吉尼亚表for(j=0;j26;j+)if(a+i+j)=z)vij=(char)(a+i+j);elsevij=(char)(a+i+j-26);printf(%c ,vij);while(plain=getc(f1)!=EOF)/加密m = m%keynum;row = (int)keym-(int)a;lie = (int)plain-(int)a;cipher = vrowlie;putc(cipher,f2);m+;解密过程即以密钥字母的值找到其所在行,并在此行找到对应的密文,确定明文的列,其列所在位置即为明文的值。主要代码如下:while(cipher=getc(f2)!=EOF) n=n%keynum;i=0;while(cipher!=v(int)keyn-97i)i+;plain=(char)(97+i);putc(plain,f3);n+;自动密文加密:这是对维吉尼亚加密法的改进,仍然用维吉尼亚表,但初始密钥只使用一次,然后以加密得到的密文做密钥,将剩余明文加密。主要代码如下:for(i=0;ikeynum;i+)/用初始密钥加密plain=getc(f1);row = (int)keyi-(int)a;lie = (int)plain-(int)a;cipheri = vrowlie;putc(cipheri,f2);i=0;while(plain=getc(f1)!=EOF)/用密文做密钥加密i=i%keynum;row=(int)cipheri-(int)a;lie=(int)plain-(int)a;cipheri=vrowlie;putc(cipheri,f2);i+;解密过程与维吉尼亚过程相似,用密钥加密的部分用和维吉尼亚相同的方法解密,余下部分由作为密钥的密文和要解密的密文确定明文。主要代码如下:for(i=0;ikeynum;i+)j=0;m=getc(f1);while(m!=v(int)keyi-97j)j+;plain=(char)(97+j);putc(plain,f2);while(m=getc(f1)!=EOF) j=0;n=getc(f3);while(m!=v(int)n-97j)j+;plain=(char)(97+j);putc(plain,f2);(三)Playfair:主要算法:void replace()/j is repalced with iint i;length=strlen(key);for(i=0;iheloint i,j,t; for(i=0;ilength;i+)for(j=i+1;jlength;j+)if(keyi=keyj)for(t=j;tlength;t+)keyt=keyt+1;j-;length-;if(j=1)keyj=0;break;说明:此段代码实现功能是将输入的密钥中遇到相同的字母,去掉后面的那一个。例如输入hello,此时将转换为helo.for(i=0;i5;i+)for(j=0;j5;j+)tableij=keyj+temp; printf(%c ,tableij); if(j=4) temp+=5; printf(n); 说明:此段代码实现的功能是将密钥转换为Playfair加密要求的5*5矩阵.void plaintext()int i=0,j,k=0,counter=0;FILE *fp;fp=fopen(plain.txt,r);while(!feof(fp)wordi=fgetc(fp);i+;fclose(fp);wordi-2=0;printf(The plaintext is:);printf(%sn,word);len=strlen(word);for(i=0;ii;j-)wordj=wordj-1;wordi+1=x;counter+=1;len1=strlen(word);if(len1%2!=0)wordlen1=x;len1+=1;for(i=0;ilen1;i+)wordi=wordi-32;for(i=0;ilen1;i+)if(wordi=J)wordi=I;说明:此段代码实现功能是将原始明文转换为符合Playfair加密要求的明文,即如果明文中有j用i来替换,如果两个连续的字母出现,在中间加x,如果经过以上处理的明文为奇数,在明文的最后面加x将其补为偶数.void encrypt()int i,j,k,m,n,u,v;for(k=0;klen1;k+) for(i=0;i5;i+) for(j=0;j5;j+) if(wordk=tableij) m=i; n=j; if(wordk+1=tableij) u=i; v=j; if(m=u)&(n!=v) wordk=tablem(n+1)%5;wordk+1=tableu(v+1)%5; else if(m!=u)&(n=v) wordk=table(m+1)%5n; wordk+1=table(u+1)%5v; else if(m!=u)&(n!=v) wordk=tablemv; wordk+1=tableun; k+;printf(The ciphertext is:);for(k=0;klen1;k+)printf(%c,wordk);printf(n);FILE *fp1;int p=0;fp1=fopen(cipher.txt,w);while(wordp!=0)fprintf(fp1,%c,wordp);p+;fclose(fp1);说明:此段代码实现功能是加密.加密分为三种情况,一种是两个相邻的明文在同一行,另一种是两个明文在同一列,最后一种是两个明文既不在同一行也不在同一列.将加密后的密文写入 cipher.txt文件中.(四) 置换:主要算法:for(i=0;ig;i+)for(j=0;jd;j+)cipheraj+5*i-1=plaini*d+j;说明:此段是加密算法,主要实现将从文件读入的明文加密为密文。其中g为将明文分为的组数,d为每组含有的字母数,a存放每组字母的加密顺序。for(i=0;ig;i+)for(j=0;jd;j+)plain1i*d+j=cipheraj+5*i-1;说明:此段代码实现的功能是解密,其中变量的含义与加密算法中的相同.列置换:主要算法:for(i=0;il;i+)numi=0;for(j=0;jl;j+)if(keyji)numi=numi-1;说明:此段代码实现的是将输入的密钥转换为列置换的顺序。例如,若输入的密钥为linux,将其转换为列置换的顺序为:21345.for(i=0;im;i+)for(j=0;jl;j+)cipheri*l+j=plaintexti*l+numj-1;/get the ciphertext说明:此段代码实现的功能是加密,m表示行数,l表示列数,num存储列置换的顺序for(i=0;im;i+)for(j=0;jl;j+)plaintext2i*l+numj-1=cipheri*l+j;说明:此段代码实现的功能是解密. 其中变量的含义与加密算法中的相同.(五) Rc4加密:主要算法:void sbox(char * Sbox,char *key)long len;int i=0,j=0;int temp;for(i=0;ilength;i+)Sboxi=i;printf(please input the key.n);scanf(%s,key);len=strlen(key);for(i=1;ilength/len+1;i+)for(j=0;jlen,(j+i*len)length;j+)keyj+i*len=keyj;for(i=0,j=0;ilength;i+)j=(j+Sboxi+keyi)%length;temp=Sboxi;Sboxi=Sboxj;Sboxj=temp;将s盒初始化,由1开始顺序递增,s(i)=i。输入密钥,将密钥重复输入至完全填充长度为length的密钥数组k盒。计算j=(j+s(i)+k(i)mod(lenghth),然后交换s(i),s(j),循环此操作,循环次数为length长度。该函数主要功能为,得到已经打乱顺序的s盒。void encry(char * sbox,FILE * p1,FILE * p2)int i=0,j=0,t=0,k=0;int ch;char temp;while(ch=getc(p1)!=EOF)i=(i+1)%length;j=(j+sboxi)%length;temp=sboxi;sboxi=sboxj;sboxj=temp;t=(sboxi+sboxj)%length;k=sboxt;ch=k;printf(%c,ch);putc(ch,p2);计算i=i+1,j=j+s(i),然后交换s(i),s(j),t=s(j)+s(i),k=s(t);循环此操作,循环次数为length长度。每次从明文文件中读出一个字符,然后跟每次循环中得到的k异或操作,将异或结果写入密文文件中,即可实现明文至密文的加密过程。同时再次执行此函数,可以对密文内容进行解密。(六) DES程序框图:输入的64位密钥PC 128位C028位D0左移左移28位D1PC2K1输入的64位明文左32位右32位E盒XORS盒P盒XOR右密文32位左密文32位64位密文密钥继续移动,重复第一轮的规则,直到16轮结束将每一轮得到的明文作为下一轮的密文,知道第16轮。最终密文左移28为C1说明:实现DES加密,16轮块加密.对明文进行操作,通过E盒,S盒,P盒等操作,最终与子密钥进行异或,得到第一轮的密文,作为第二轮的明文,直到16轮得到密文。最后将加密后的密文转换为16进制,并写入文件.(七)Rsa加密:主要算法:int change(char temp,int temp18)int i;int a=0;for(i=0;i8;i+)temp1i=temp%2;temp=temp/2;a=temp1i*pow(2,i)+a;return a;此函数的功能是把char类型的字符转换为它的ascii的十进制表示,以便用于rsa算法的计算。通过先算出8 bit ascii的每一位上的数,然后乘以对应位上的权重。最后得到其十进制表示。int suand(int fn,int e) int d=2;while(e*d)%fn!=1)d+;return d;此函数的功能是得到rsa算法中的私钥d。参数fn为(p-1)(q-1),e为一个已知的质数。通过循环,最后得到私钥d。while(temp=getc(fd)!=EOF)a=change(temp,temp1);m1=a;for(i=1;ie;i+)m1=m1*a%n;m1=m1%n;fprintf(fd2,%d ,m1);此函数的功能是,从文件中依次读取字符,直到文件结尾。然后依次把读到的字符转换为十进制,用给出的公钥(e,n)进行rsa算法的加密。然后把加密后的生成的数字依次存到文件中。while(fscanf(fd2,%d ,&a)!=EOF)m1=a;for(i=1;i0)fwrite(buf,1,num,fd1);while(num=fread(buf,1,max,fd2)0)send(sockfd,buf,num,0);Server端存成文件,然后用私钥(d,n)解密,把结果存成明文。(八) DH密钥交换:全称diffie-hellman密钥交换系统。建立DH协议,首先A与B要共享两个数p和g。其中p是一个大素数,g是一个小于p的随机数.,p与g是公开的。A选择一个保密随机数a,将gamodp发送给B,B选择一个保密随机数b,将gbmodp发送给A。A使用自己的保密随机数a与从B接收到的值kb计算kbamodp得到结果k,B使用自己的保密随机数b与从A接收到的值ka计算kabmodp得到结果k,两个结果是相同的,k即成为他们的共同密钥。程序中关键代码如下:A接收B int ka,kb; ka = get_mod(g,a,p); ret = send(connectfd,(void *)&ka,4,0); if(ret append(send ka false.); return; text-append(send ka success.); text-append(waiting for recieving kb.); ret = recv(connectfd,(void *)&kb,4,0); if(ret append(recieve ka success.); int k; k = get_mod(kb,a,p); key = k;B接收A int ka,kb; kb = get_mod(g,b,p); ret = recv(socketfd,(void *)&ka,4,0); if(ret append(receive ka false.); return; text-append(receive ka success.); ret = send(socketfd,(void *)&kb,4,0); if(ret append(send kb false.); return; text-append(send kb success.); int k; k = get_mod(ka,b,p); key = k;以上各种加密程序的操作接口都是针对文件的,即对文件进行直接加密。从而为接下来的图形化集成提供了便利。五、 系统实现5.1实现功能程序具有的主要功能为:进行RSA、列置换、playfair、rc4、caesar、affine、vegenere、autokey加密算法的单机加密。实现文件对文件的接口,并分别显示明文和密文。进行文件传输的功能,使得对多数加密方法实现双机加密。RSA双机加密的实现,包括传输密钥与传输密文的网络通信过程。DH密钥交换的过程,交换密钥的网络通信过程。文件管理的功能,查看通信后接收的文件情况。历史记录,对程序操作的记录,以便查看操作过程。5.2实现效果程序的截图如下所示:左侧选择加解密方法,右侧设置明文、密文路径以及密钥,运行后明文与密文分别会显示出来。设置属性的界面,可以查看本机IP,更改接收文件服务的端口号、文件存放路径。实现双机通信时发送文件的界面,输入目的IP与端口号,并设置好传送的文件后,即可实现发送功能,进度条可以显示传输进度。文件管理的页面,可以查看Path中保存路径的文件,默认为设置界面的接收文件存放的路径。查看历史记录的页面,对程序每个操作都进行了较为详尽的记录,加密还是解密,加解密使用的算法,明文文件与密文文件的路径、日期等信息都进行了记录。5.3 单机加密流程当实现单机加解密时,程序流程图如下:选择加密方法后,选择要加密的明文文件,设置输出密文文件的路径,并根据选择的加解密方法输入符合的密钥,在界面中按Start按钮执行加密过程,并将加密后得到的密文文件显示出来。在程序中,涉及到以下的类:类名实现功能plain_rsaRSA加解密的方法与接口函数的实现plain_colum列转换加解密的方法与接口函数的实现plain_playfairPlayfair加密的方法与接口函数的实现plain_rc4Rc4加解密的方法与接口函数的实现plain_caesarCaesar加解密的方法与接口函数的实现plain_affine仿射加解密的方法与接口函数的实现plain_vegVegenere加解密的方法与接口函数的实现plain_desDES加密的方法与接口函数的实现plain_autokeyAutokey加解密的方法与接口函数的实现5.4 双机加密流程进行双机加解密时,程序的流程图如图所示:一端接收文件,一端发送文件。发送文件时,要事先将明文文件在本地加密;接收文件时,将接收到的消息进行解密,即可实现双机加解密的过程。在实现双机加密功能时,RSA加密方法与DH密钥交换协议需要多次通信方能实现,其中RSA加密在两端在传送文件前,加密端需先向解密端请求密钥,流程图如下所示:在双机通信时,程序中涉及到以下几个类:类名实现功能recv_file在双机通信时接收信息send_message在双机通信时发送信息rsa_socketRSA在双机通信时接收信息rsa_socket_sendRSA在双机通信时发送信息dh_aDH密钥交换的一端dh_bDH密钥交换的一端5.5其他功能为了增加程序的灵活性,所有参数尽可能为可控,如开启服务的端口号、文件保存路径等,具体体现在Setting_wg类中,它是继承自widget的窗口类,即是设置的页面。同时,RSA方法、DH密钥交换的过程也有设置的功能。历史记录的功能,是对程序的一个创新点,既可以记录操作过程方便使用,也可以利于调试,主要的类为history与sethistory,每进行一个操作,都调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论