-程序设计报告(2013/2014学年第二学期)题目:加解密处理系统专业信息管理与信息系统组长学号姓名组员学号姓名指导教师指导单位计算机学院软件学院日期2014年6月19日-成员分工负责组员的工作分配,统一指挥;以及程序的基础构思、框架设计、功能设计、编写程序代码、设计报告等。进行程序框架内功能、算法等程序的设计填写;以及相关算法的调试与改进和编写程序设计报告等。进行程序编写时程序运行调试,编写程序部分功能程序的收集整理,录入相关数据及编写程序设计报告等。评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:年月日评分等级备注评分等级共五种:优秀、良好、中等、及格、不及格-加解密处理系统一、课题内容和要求该系统要求编写一个程序,设计一套加解密处理系统,实现对选定的文件或字符串(由数字或字母组成)进行加密解密的程序。可以将所需要的内容(整个文件或者输入的一行字符)加密,也可以将存储的加密文件翻译回来。例如加密时可以将选取内容的每个字符依次反复加上“49632873”中的数字,如果范围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(既N%122)。解密与加密的顺序相反。主要要求为:从键盘输入要进行加密的一行字符串或者需要加密的文件名。显示菜单:设置加密方法、加密、解密、显示原始文件和解密文件。选择菜单,进行相应的操作。加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到result.txt文件中;解密是将加了密的文件还原并保存到recall.txt文件中,同时应比较与原始文件的一致性;显示是将文件在屏幕上显示出来。二、需求分析加解密的功能框架图如图所示:设置加密方法加密解密保存显示文件加解密处理系统图1功能框架图(1)提供可操作的主菜单:输出菜单,提供若干个可选的功能选项,如有设置加密方法、加密、解密、显示原文件和加密解密后文件。根据用户输入的选项来运行不同的功能,运行不同的函数。(2)加密:加密字符串或者文件。加密字符串:将输入的字符串复制到source.txt文件中,然后对字符串每个字符依次加密运算,将结果输入result.txt文件中;加密文件:输入文件名,文件指针指向该文件,将文件中的字符复制到source.txt文件中,然后进行加密运算,将结果输入result.txt文件中。(3)解密:fgetc函数依次从result.txt文件得到字符进行解密运算,并将结果输入到recall.txt文件中。-三、概要设计1.主要结构体structpassword/*加密方法结构变量*/{charps[10];/*加密字符串*/longwd;/*加密的字节数*/}2.主要函数流程图(1)加密函数:用于加密字符串或者指定文件,将输入的字符串或指定的文件复制到source.txt文件中,然后加密并将结果复制到result.txt文件中。图2加密函数(2)文件比较函数:打开source.txt文件和recall.txt文件,用fgetc函数从两个文件中分别提取字符,然后比对两个字符是否一致。若一致,则输出该字符;若不一致,则输出“_”。提取字符加密并复制复制文件内容复制字符串加密文件加密字符串开始创建文件指针选择加密输入文件名名输入字符串Source文件Result文件结束-然后判断是否到文件结尾(到文件结尾会返回EOF),是否进行循环。函数流程图如下图所示:图3.文件比较函数四、源程序代码#includestring.h#includestdlib.h#includestdio.h#includewindows.hstructpassword/*加密方法结构变量*/{charps[10];/*加密字符串*/否是是否指向指向开始创建文件指针Source.txt文件Recall.txt文件是否一致分别提取字符输出字符输出“_”是否到文件结尾结束-longwd;/*加密的字节数*/};structpasswordpassword;chars[100];voidset()//加密方法设置函数{printf(\n输入加密字符串:);scanf(%s,password.ps);printf(\n输入加密字节数:);scanf(%ld,&password.wd);getchar();system(pause);/*系统函数,按任意键继续,使界面整洁*/}voidPrinttxt()/*显示显示原始文件和解密文件函数*/{/*以读方式打开文件*/FILE*source=fopen(source.txt,rt);FILE*result=fopen(result.txt,r);FILE*recall=fopen(recall.txt,rt);charc;//临时字符存储变量if(source==NULL){printf(无法打开source.txt\n);exit(0);}if(result==NULL){printf(无法打开result.txt\n);exit(0);}if(recall==NULL){printf(无法打开recall.txt\n);exit(0);}c=fgetc(source);//先从原始文件读出一个字符,若不是文件结尾,则文件内容非空if(c==EOF)//文件内容为空,输出加密字符{printf(\n加密字符:);printf(%s\n,s);}else//文件非空,输出原始文件-{printf(\n原始文件:);printf(%c,c);while((c=fgetc(source))!=EOF)printf(%c,c);}printf(\n);printf(\n加密文件:);while((c=fgetc(result))!=EOF)//文件非空,输出加密文件printf(%c,c);printf(\n);printf(\n);printf(\n解密文件:);while((c=fgetc(recall))!=EOF)//文件非空,输出解密文件printf(%c,c);printf(\n);fclose(source);fclose(result);fclose(recall);system(pause);}voidencode()/*加密函数*/{intm,n=strlen(password.ps),i,flag=1;//m存储加密字符长度,n存储加密字符串长度,i为临时变量charN=0,w=0;charc=0,C=0;//临时字符存储变量FILE*result=fopen(result.txt,wt);FILE*source=fopen(source.txt,wt);if(result==NULL){printf(无法打开result.txt\n);exit(0);}if(source==NULL){printf(无法打开source.txt\n);flag=0;}flag=0;intb;-printf(\n请选择加密对象:\n);printf(\n1.加密字符串\n);printf(\n2.加密文件\n);scanf(%d,&b);if(b==1){flag=0;}else{FILE*fp;charfilename[30];printf(请输入文件名:\n);scanf(%s,filename);if((fp=fopen(filename,r))!=NULL){printf(文件打开成功!\n);flag=1;while(!feof(fp)){charn;n=fgetc(fp);fputc(n,source);}printf(文件复制成功!\n);}else{printf(文件打开失败\n);exit(0);}fclose(source);}if(flag==0)//判断文件是否为空,为空的话,对输入字符加密{printf(请输入要加密的字符串:\n);scanf(%s,s);m=strlen(s);fprintf(source,%s,s);inta=0;for(i=0;im;i++){if(apassword.wd){N=s[i]+password.ps[a%n]-48;if(N122){N=N%122;/*模运算*/}fputc(N,result);a++;-}elsefputc(s[i],result);}}else//文件非空,对文件加密{fopen(source.txt,r);C=fgetc(source);w=C+password.ps[0%n]-48;fputc(w,result);inta=1;for(i=0;(c=fgetc(source))!=EOF;i++){if(apassword.wd){N=c+password.ps[a%n]-48;if(N122){N=N%122;/*模运算*/}fputc(N,result);a++;}else{fputc(c,result);}}}printf(\n加密成功!\n);fclose(result);fclose(source);system(pause);}voiddecode()/*解密函数*/{FILE*recall=fopen(recall.txt,wt);FILE*result=fopen(result.txt,rt);charc,N;intn=strlen(password.ps),i;//n存储加密字符串长度,i为临时变量if(result==NULL){printf(无法打开result.txt\n);exit(0);}if(recall==NULL)-{printf(无法打开result.txt\n);exit(0);}inta=0;for(i=0;(c=fgetc(result))!=EOF;i++)//对加密文件进行译码{if(apassword.wd){N=c-(password.ps[a%n]-48);if(N0){N=(N+122)%122;/*模运算*/fputc(N,recall);}else{if(N==0)fputc('z',recall);//将解密结果输出至recall文件elsefputc(N,recall);}a++;}else{fputc(c,recall);}}printf(\n解密成功!\n);fclose(result);fclose(recall);system(pause);}voidcmptxt()/*比较解密文件和原始文件的一致性,一致输出原字符,不一致输'_'*/{FILE*source=fopen(source.txt,rt);FILE*recall=fopen(recall.txt,rt);charc,d;//临时字符存储变量if(source==NULL){printf(不存在source.txt文件\n);exit(0);-}if(recall==NULL){printf(不存在recall.txt文件\n);exit(0);}//先从原始文件读出一个字符,若不是文件结尾,则文件内容非空c=fgetc(source);d=fgetc(recall);if(c==EOF){printf(读文件错误!!\n);exit(0);}if(d==EOF){printf(读文件错误!!\n);exit(0);}printf(文件比较:);while((c=fgetc(source))!=EOF&&(d=fgetc(recall))!=EOF)//文件非空调用判断{if(c==d)//比较,输出字符{printf(%c,c);}elseprintf(文件比较不一致!);break;}printf(\n);fclose(source);fclose(recall);system(pause);}voidcmptxt()/*比较解密文件和原始文件的一