操作系统课程设计报告加密与解密_第1页
操作系统课程设计报告加密与解密_第2页
操作系统课程设计报告加密与解密_第3页
操作系统课程设计报告加密与解密_第4页
操作系统课程设计报告加密与解密_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象课程设计加密与解密学生姓名:;学 号:;班 级:计算机应用一班指导教师:; 2011-12-29 一实验目的二实验内容三实验算法及实验过程四源程序代码五实验总结一 实验目的1、复习、巩固c+语言的基础知识,进一步加深对c+语言的理解和掌握; 2、课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力;3、培养学生在项目开发中团队合作精神、创新意识及能力。二 实验内容 1、要求:(1).给定任意一个文本文件,进行加密,生成另一个文件。(2).对加密后的文件还原。(3).要求采用有多种

2、加密算法,对多种加密算法进行比较。(4).采用图形用户界面。三 实验算法及实现过程 1、解密与解密算法算法:(1). 希腊数学家 欧几里得算法, 称为辗转相除,又叫“辗转相除法” 简单的描述就是,记gcd(a,b)表示非负整数a,b的最大公因数,那么:gcd(a,b) =gcd(b,a%b)。 (2). euclid算法定义:gcd(a,b)=gcd(b, a+kb) a,b,k为任意整数 即gcd(a,b)=gcd(b, a mod b) a0,b0example:gcd(55,22)=gcd(22, 55mod22)=gcd(22,11)=11证明:假定d=gcd(a,b),那么有d|a和

3、d|b.对任何正整数b,a 可表示为如下形式: a=kb+r r mod b, a mod b =r , 因 此,有(a mod b )= a-kb,k为某个整数。但由于d|b,b也 能整除kb, 而d|a,故有d|(a mod b), 这表明d 也是b 和(a mod b) 的公因子。由于这是可逆的,如果d 是b 和(a mod b) 的公因子,那么d|kb,且d|kb+(a mod b)这等同于 d|a。这样a和b的公因子集合等同于b 和(a mod b) 的公因子集合。 2、euclid算法流程图四 源程序代码:#include #include #include #include #i

4、nclude #include #define max 100#define len sizeof(struct slink) void sub(int amax,int bmax ,int cmax );struct slink int bignummax;/*bignum98用来标记正负号,1 正,0 负 bignum99来标记实际长度*/struct slink *next;/*/-建立的大数运算库-*/ void print( int amax ) int i; for(i=0;il2) return 1; if (l1=0;i-) if (a1ia2i) return 1 ; if

5、(a1ia2i) return -1; return 0; void mov(int amax,int *b) int j; for(j=0;jmax;j+) bj=aj;return ; void mul(int a1max,int a2max,int *c) int i,j; int y; int x; int z; int w; int l1, l2; l1=a1max-1; l2=a2max-1;if (a1max-2=-& a2max-2=-) cmax-2=0;else if (a1max-2=-) cmax-2=-;else if (a2max-2=-) cmax-2=-; fo

6、r(i=0;il1;i+) for(j=0;jl2;j+) x=a1i*a2j; y=x/10; z=x%10; w=i+j; cw=cw+z;cw+1=cw+1+y+cw/10;cw=cw%10; w=l1+l2;if(cw-1=0)w=w-1; cmax-1=w; return; void add(int a1max,int a2max,int *c) int i,l1,l2; int len,tempmax; int k=0; l1=a1max-1; l2=a2max-1;if(a1max-2=-)&(a2max-2=-) cmax-2=-;elseif (a1max-2=-) mov(

7、a1,temp);tempmax-2=0; sub(a2,temp,c); return;elseif (a2max-2=-)mov(a2,temp); temp98=0; sub(a1,temp,c); return;if(l1l2) len=l1;else len=l2;for(i=0;ilen) for(i=len;il1;i+) ci=(a1i+k)%10;k=(a1i+k)/10; if(k!=0) cl1=k; len=l1+1; else len=l1; elsefor(i=len;il2;i+)ci=(a2i+k)%10; k=(a2i+k)/10; if(k!=0) cl2=

8、k; len=l2+1; else len=l2; c99=len; return; void sub(int a1max,int a2max,int *c) int i,l1,l2; int len,t1max,t2max; int k=0; l1=a1max-1; l2=a2max-1; if (a1max-2=-) & (a2max-2=-) mov(a1,t1); mov(a2,t2); t1max-2=0; t2max-2=0; sub(t2,t1,c);return; elseif( a2max-2=-)mov(a2,t2); t2max-2=0; add(a1,t2,c); re

9、turn; else if (a1max-2=-)mov(a2,t2); t2max-2=-;add(a1,t2,c); return; if(cmp(a1,a2)=1) len=l2; for(i=0;ilen;i+) if (a1i-k-a2i)0) ci=(a1i-a2i-k+10)%10; k=1; else ci=(a1i-a2i-k)%10; k=0; for(i=len;il1;i+) if (a1i-k)显示为 980 如 了*/ len=l1-1; i=2; while (cl1-i=0)/*111456-111450=00006,消除 0 后变成了 6;*/ len=l1-

10、i; i+; else len=l1; elseif(cmp(a1,a2)=(-1) cmax-2=-; len=l1; for(i=0;ilen;i+) if (a2i-k-a1i)0) ci=(a2i-a1i-k+10)%10; k=1; else ci=(a2i-a1i-k)%10; k=0; for(i=len;il2;i+) if (a2i-k)0) ci=(a2i-k+10)%10;k=1; else ci=(a2i-k)%10; k=0; if(cl2-1=0) len=l2-1; i=2; while (cl1-i=0) len=l1-i; i+; else len=l2; e

11、lse if(cmp(a1,a2)=0) len=1; clen-1=0; cmax-1=len; return; void mod(int amax,int bmax,int *c)/*/c=a mod b/注意:经检验知道此处 a 和 c 的数 组都改变了.*/ int dmax; mov (a,d); while (cmp(d,b)!=(-1)/*/c=a-b-b-b-b-b.until(cb)*/ sub(d,b,c); mov(c,d);/*/c 复制给 a*/ return ;void divt(int tmax,int bmax,int *c ,int *w)/*/试商法/调用以

12、后 w 为 a mod b, c 为 a div b;*/ int a1,b1,i,j,m;/*w 用于暂时保存数据*/ int dmax,emax,fmax,gmax,amax;mov(t,a); for(i=0;imax;i+) ei=0; for(i=0;imax;i+) di=0;for(i=0;i=0;i-)/*341245/3=341245-300000*1-41245-30000*1-11245-3000*3-2245-30 0*7-145-30*4=25-25-3*8=1*/ for(j=0;jmax;j+) dj=0;di=1;dmax-1=i+1;mov(b,g); mul

13、(g,d,e);while (cmp(a,e)!=(-1)ci+;sub(a,e,f);mov(f,a);/*f 复制给 g*/ for(j=i;jmax;j+)/*高位清零*/ej=0; mov(a,w); if (cm=0)cmax-1=m; else cmax-1=m+1; return; void mulmod(int amax ,int bmax ,int nmax,int *m)/*解决 了 m=a*b mod n;*/ int cmax,dmax; int i; for(i=0;imax;i+)di=ci=0;mul(a,b,c);divt(c,n, d,m); for(i=0;

14、immax-1;i+) printf(%d,mmmax-1-i-1);printf(nm length is : %d n,mmax-1); /*接下来的重点任务是要着手解决 m=ap mod n 的函数问题.*/ void expmod(int amax ,int pmax ,int nmax,int *m)int tmax,lmax,tempmax; /*/t 放入 2,l 放入 1;*/ int wmax,smax,cmax,bmax,i;for(i=0;imax-1;i+) bi=li=ti=wi=0;t0=2;tmax-1=1; l0=1;lmax-1=1;mov(l,temp);m

15、ov(a,m);mov(p,b); while(cmp(b,l)!=0) for(i=0;imax;i+) wi=ci=0;divt(b,t,w,c);/*/ c=p mod 2 w=p/2*/mov(w,b);/*/p=p/2*/if(cmp(c,l)=0) /*/余数 c=1*/ for(i=0;imax;i+) wi=0; mul(temp,m,w); mov(w,temp); for(i=0;imax;i+) wi=ci=0;divt(temp,n,w,c);/* c 为余 c=temp % n,w 为商 w=temp/n */ mov(c,temp); for(i=0;imax;i+

16、) si=0; mul(m,m,s);/s=a*a for(i=0;imax;i+) ci=0; divt(s,n,w,c);/*w=s/n;c=s mod n*/ mov (c,m); for(i=0;imax;i+)si=0;/w= p /2mul(m,temp,s); for(i=0;imax;i+) ci=0; divt(s,n,w,c);mov (c,m);/*余数 s 给 m*/ mmax-2=amax-2;/*为后面的汉字显示需要,用第 99 位做为标记*/ return;/*/k=temp*k%n;*/ int is_prime_san(int pmax)int i,amax,

17、tmax,smax,omax;for(i=0;imax;i+) si=oi=ai=ti=0; t0=1; tmax-1=1; a0=2;/ 2,3,5,7 amax-1=1;sub(p,t,s);expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) return 0; a0=3; for(i=0;imax;i+) oi=0;expmod ( a, s, p ,o);if ( cmp(o,t) != 0 ) return 0;a0=5;for(i=0;imax;i+) oi=0; expmod ( a, s, p ,o); if ( cmp(o,t) != 0 )

18、 return 0; a0=7; for(i=0;imax;i+) oi=0;expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) return 0; return 1; int coprime(int emax,int smax) /*/ 求两个大数之间是否互质/*/ int amax,bmax,cmax,dmax,omax,lmax; int i; for(i=0;imax;i+)li=oi=ci=di=0; o0=0;omax-1=1; l0=1; lmax-1=1; mov(e,b); mov(s,a);do if(cmp(b,l)=0) return

19、1; for(i=0;ia*/ mov(c,b);/*c-b*/while(cmp(c,o)!=0);/* printf(ihey are not coprime!n);*/return 0; void prime_random(int *p,int *q) int i,k; time_t t;p0=1; q0=3; / p19=1;/ q18=2; pmax-1=10;qmax-1=11;do t=time(null); srand(unsigned long)t);for(i=1;ipmax-1-1;i+) k=rand()%10; pi=k; k=rand()%10;while (k=0

20、) k=rand()%10; ppmax-1-1=k;while(is_prime_san(p)!=1); printf(素数 p 为 : );for(i=0;ipmax-1;i+) printf(%d,ppmax-1-i-1); printf(nn); do t=time(null); srand(unsigned long)t);for(i=1;iqmax-1;i+) k=rand()%10;qi=k; while(is_prime_san(q)!=1); printf(素数 q 为 : ); for(i=0;iqmax-1;i+) printf(%d,qqmax-1-i-1); prin

21、tf(nn); return; void erand(int emax,int mmax) int i,k;time_t t; emax-1=5;printf(随机产生一个与(p-1)*(q-1)互素的 e :);do t=time(null); srand(unsigned long)t);for(i=0;iemax-1-1;i+) k=rand()%10; ei=k; while(k=rand()%10)=0)k=rand()%10; eemax-1-1=k; while(coprime( e, m)!=1);for(i=0;iemax-1;i+)printf(%d,eemax-1-i-1

22、); printf(nn);return ; void rsad(int emax,int gmax,int *d) int rmax,n1max,n2max,kmax,wmax; int i,tmax,b1max,b2max,tempmax; mov(g,n1); mov(e,n2);for(i=0;imax;i+)ki=wi=ri=tempi=b1i=b2i=ti=0;b1max-1=0;b10=0;/*/b1=0;*/ b2max-1=1;b20=1;/*/b2=1;*/ while(1) for(i=0;imax;i+) ki=wi=0; divt(n1,n2,k,w);/*/k=n1

23、/n2;*/ for(i=0;imax;i+) tempi=0; mul(k,n2,temp);/*/temp=k*n2;*/for(i=0;imax;i+) ri=0; sub(n1,temp,r); if(rmax-1=1) & (r0=0)/*/r=0*/ break;else mov(n2,n1);/*/n1=n2;*/ mov( r,n2);/*/n2=r;*/ mov(b2, t);/*/t=b2;*/ for(i=0;imax;i+) tempi=0; mul(k,b2,temp);/*/b2=b1-k*b2;*/ for(i=0;imax;i+) b2i=0;sub(b1,te

24、mp,b2); mov(t,b1); for(i=0;imax;i+) ti=0; add(b2,g,t);for(i=0;imax;i+)tempi=di=0; divt(t,g,temp,d); printf(由以上的(p-1)*(q-1)和 e 计算得出的 d : );for(i=0;idmax-1;i+)printf(%d,ddmax-1-i-1);printf(nn); /*/求解密密钥 d 的函数(根据 euclid 算法)96403770511368768000*/ unsigned long rsa(unsigned long p,unsigned long q,unsigne

25、d long e)/*/求解密密钥 d 的函数 (根据 euclid 算法)*/ unsigned long g,k,r,n1,n2,t;unsigned long b1=0,b2=1; g=(p-1)*(q-1);n1=g; n2=e; while(1)k=n1/n2; r=n1-k*n2;if(r!=0) n1=n2; n2=r; t=b2; b2=b1-k*b2; b1=t; else break; return (g+b2)%g; /*/-导入导出公钥和私钥-/*/ void loadpkey(int emax,int nmax)/导入公钥file *fp; char filename

26、25,strmax,ch;int i,k;for(i=0;imax;i+)ei=ni=0; while(1) printf(n);printf(为导入(e,n),请输入加密密钥对文件的绝对路径: n); scanf(%s,filename); if(fp=fopen(filename,r)=null) printf(输入的文件不存在,请重新输入!n); else break; k=0; while(ch=fgetc(fp)!=eof) if(ch!= ) strk=ch;k+; else for(i=0;ik;i+)ei=strk-i-1-48; emax-1=k; k=0; for(i=0;

27、ik;i+) ni=strk-i-1-48;nmax-1=k; printf(n 加密密钥 e : ); for(i=0;iemax-1;i+) printf(%d,eemax-1-i-1); printf(n);printf(n 公钥 n : ); for(i=0;inmax-1;i+)printf(%d,nnmax-1-i-1);printf(n); fclose(fp); printf(n 导入(e,n)成功!n); getchar(); void loadskey(int dmax,int nmax) /导入私钥 file *fp; char filename25,strmax,ch;

28、 int i,k; for(i=0;imax;i+)di=ni=0; while(1) printf(为导入(d,n),请输入解密密钥对文件的绝对路径: n); scanf(%s,filename); if(fp=fopen(filename,r)=null) printf(输入的文件不存在,请重新输入!n); else break; k=0; while(ch=fgetc(fp)!=eof) if(ch!= ) strk=ch; k+; else for(i=0;ik;i+)di=strk-i-1-48; dmax-1=k; k=0; for(i=0;ik;i+)ni=strk-i-1-48

29、; nmax-1=k; printf(n 解密密钥 d : );for(i=0;idmax-1;i+)printf(%d,ddmax-1-i-1);printf(n);printf(n 公钥 n : ); for(i=0;inmax-1;i+)printf(%d,nnmax-1-i-1);printf(n); fclose(fp); printf(n 导入(d,n)成功!n); getchar(); void savepkey(int emax,int nmax)/导出公钥 file *fp; int i;char savefile25,ch;printf(导出加密密钥(e,n),存放文件的绝

30、对路径为: ); scanf(%s,savefile); printf(n); fp=fopen(savefile,w); for(i=0;iemax-1;i+) ch=eemax-1-i-1+48; fputc(ch,fp); ch= ;fputc(ch,fp);for(i=0;inmax-1;i+)ch=nnmax-1-i-1+48;fputc(ch,fp); fclose(fp);printf(n 保存(e,n)操作完成!n); void saveskey(int dmax,int nmax)/导出私钥 file *fp; int i; char savefile25,ch; print

31、f(导出解密密钥(d,n),存放的文件的绝对路径为: ); scanf(%s,savefile); printf(n);fp=fopen(savefile,w); for(i=0;idmax-1;i+) ch=ddmax-1-i-1+48; fputc(ch,fp); ch= ;fputc(ch,fp);for(i=0;inmax-1;i+) ch=nnmax-1-i-1+48; fputc(ch,fp); fclose(fp);printf(n 保存(d,n)操作完成!n);/*/-加密和解密的块-/*/ void printbig(struct slink *h)struct slink

32、*p; int i;p=(struct slink * )malloc(len);p=h; if(h!=null)do for(i=0;ibignummax-1;i+)printf(%d,p-bignump-bignummax-1-i-1);p=p-next; while(p!=null);printf(nn); void tencrypto(int emax, int nmax)/* 对有需要的文件进行加密*/ file *fp;int i,k,count,temp,c;char filename25,ch,encryfile25;struct slink *p,*p1,*p2;struct

33、 slink *h;h=p=p1=p2=(struct slink * )malloc(len);h=null;printf(n 输入需要加密的文件的绝对路径 : ); scanf(%s,filename); if(fp=fopen(filename,r)=null)printf(cannot open file !n);exit(0); printf(n 文件的原文内容:nn);count=0;while(ch=fgetc(fp)!=eof) putchar(ch); c=ch;k=0; if(cbignummax-2=0; else p1-bignummax-2=1; while(c/10

34、!=0) temp=c%10; c=c/10;p1-bignumk=temp;k+; p1-bignumk=c; p1-bignummax-1=k+1;count=count+1;if(count=1) h=p1; elsep2-next=p1;p2=p1;p1=(struct slink * )malloc(len); p2-next=null; printf(n);fclose(fp); / printf(加密后文件的保存的绝对路径 : n); / scanf(%s,encryfile); /fp=fopen(encryfile,w);fp=fopen(filename,w); p=p1=

35、(struct slink * )malloc(len); p=h;printf(n 加密后文件中所形成密文:nn); if(h!=null) do expmod( p-bignum , e ,n ,p1-bignum); ch=p1-bignummax-2; printf(%c,ch); fputc(ch,fp); if (p1-bignummax-1/10) =0)/*判断 p1-bignum99的是否大于十;*/ch=0+48; printf(%c,ch);fputc(ch,fp); ch=p1-bignummax-1+48; printf(%c,ch); fputc(ch,fp); e

36、lse ch=p1-bignummax-1/10+48;printf(%c,ch); fputc(ch,fp);ch=p1-bignummax-1%10+48; printf(%c,ch); fputc(ch,fp); for(i=0;ibignummax-1;i+) printf(%d,p1-bignumi); ch=p1-bignumi+48; fputc(ch,fp); p=p-next; p1=(struct slink * )malloc(len); while(p!=null); printf(nn); fclose(fp); return; void tdecrypto(int

37、dmax, int nmax)file *fp; struct slink *h,*p1,*p2; char ch,encryfile25,decryfile25; int i,j,k,c,count,temp;printf(n 输入加密过的文件的绝对路径 : ); scanf(%s,encryfile); if(fp=fopen(encryfile,r)=null) printf(此文件不存在!n);exit(0); printf(n 文件中密文内容:nn); i=0; j=3; count=0; h=p1=p2=(struct slink * )malloc(len); while(ch=

38、fgetc(fp)!=eof)putchar(ch);c=ch; if(j=3) p1-bignummax-2=c;j-; elseif(j=2) temp=c-48;j-; else if(j=1) p1-bignummax-1=temp*10+c-48; j-; elseif (j=0) p1-bignumi=c-48;i+; if(i=p1-bignummax-1)i=0; j=3; count+; if (count=1) h=p1;elsep2-next=p1;p2=p1; p1=(struct slink * )malloc(len); p2-next=null;printf(n)

39、;fclose(fp);/printf(解密后的明文文件保存路径 : n); /scanf(%s,decryfile); /fp=fopen(decryfile,w); fp=fopen(encryfile,w);printf(n 解密密文后文件中的明文:nn);p2=(struct slink * )malloc(len); p1=h;k=0;if(h!=null)/*/temp 为暂存 asiic 码的 int 值*/ do for(i=0;ibignumi=0; expmod( p1-bignum , d ,n ,p2-bignum); temp=p2-bignum0+p2-bignum1*10+p2-bignum2*100; if ( p2-bignummax-2)=0) temp=0-temp; /*/转化为正确的 asiic 码,如-78-96 形成汉字 */ ch=temp;/* strk-ch */printf(%c,ch);/* strk-ch */ fputc(ch,fp);/*写入文件 strk-ch*/k+; p1=p1-next; p2=(str

温馨提示

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

评论

0/150

提交评论