程序设计 加解密系统DOC.docx
- 文档编号:23696775
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:27
- 大小:252.01KB
程序设计 加解密系统DOC.docx
《程序设计 加解密系统DOC.docx》由会员分享,可在线阅读,更多相关《程序设计 加解密系统DOC.docx(27页珍藏版)》请在冰豆网上搜索。
程序设计加解密系统DOC
程序设计报告
(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函数从两个文件中分别提取字符,然后比对两个字符是否一致。
若一致,则输出该字符;若不一致,则输出“_”。
然后判断是否到文件结尾(到文件结尾会返回EOF),是否进行循环。
函数流程图如下图所示:
图3.文件比较函数
四、源程序代码
#include
#include
#include
#include
structpassword/*加密方法结构变量*/
{
charps[10];/*加密字符串*/
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;i { if(a { N=s[i]+password.ps[a%n]-48; if(N>122) { N=N%122;/*模运算*/ } fputc(N,result); a++; } else fputc(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(a { N=c+password.ps[a%n]-48; if(N>122) { 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(a { N=c-(password.ps[a%n]-48); if(N<0) { N=(N+122)%122;/*模运算*/ fputc(N,recall); } else { if(N==0) fputc('z',recall);//将解密结果输出至recall文件 else fputc(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()/*比较解密文件和原始文件的一致性,一致输出原字符,不一致'_'*/ { 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("文件比较: "); if(c==d) { printf("%c",c); } elseprintf("_"); while((c=fgetc(source))! =EOF&&(d=fgetc(recall))! =EOF)//文件非空调用判断 { if(c==d)//比较,输出字符 { printf("%c",c); } elseprintf("—"); } printf("\n"); fclose(source); fclose(recall); system("pause"); } voidmenu()//菜单函数 { printf("\n****文件加解密****"); printf("\n******************\n"); printf("*1.设置加密方法*\n"); printf("\n"); printf("*2.加密文件*\n"); printf("\n"); printf("*3.解密文件*\n"); printf("\n"); printf("*4.显示文件*\n"); printf("\n"); printf("*5.退出*\n"); printf("\n"); printf("******************\n"); printf("请选择: "); } voidcreat()//创建文件 { FILE*f1=fopen("source.txt","wt"); FILE*f2=fopen("result.txt","wt"); FILE*f3=fopen("recall.txt","wt"); fclose(f1); fclose(f2); fclose(f3); } voidmain()//主函数,进行选择 { inta=0; menu(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); system("color2F"); while(a! =5) { scanf("%d",&a); switch(a) { case1: creat(); set(); system("cls"); menu(); break; case2: encode(); system("cls"); menu(); break; case3: decode(); system("cls"); menu(); break; case4: Printtxt(); system("cls"); menu(); break; case5: printf("\n结束! \n\n"); break; default: printf("\n请再次输入! \n"); system("cls"); menu(); break; } } } 五、测试数据及其结果分析 程序运行时的初始界面,如图1所示: 图1程序运行时的初始界面 选择加密对象是程序运行界面如图2所示: 图2设置加密方式,选择加密字符串或加密文件 若选择加密字符串,输入“1”后,程序会提示输入加密字符串: 图3选择加密字符串,输入字符串,加密成功! 若选择加密文件,输入“2”,程序运行界面提示输入文件名,如图4所示: 图4选择加密文件,输入文件名 程序在相应子目录下找到文件并打开,界面输出“文件打开成功! ”,加密完成后输出“加密成功! ”如图5所示: 图5文件打开成功,复制成功 操作完成后,返回主菜单,选择退出,程序运行界面如图6所示: 图6显示文件后,解密成功,选择退出 六、调试过程中的问题 (1)在解密文件时会遇到将未被加密的字符进行解密,以致出现错误的解密文件。 后来发现解密函数中有一句的文件字符写入写错了,从result文件中读出即可解决。 (2)程序不能给长文件加密,后来计算需加密文件长度,对加密字符串长度取余,即可实现重复的加密,实现全文加密。 (3)由于对文件内字符每操作一次时,内部指针会自动后移一位,导致第二次对文件字符操作时出现错误。 解决方法是本次操作完文件时关闭文件下次重新打开。 (4)定义char字符数组的大小应比实际数据多一个字节,因为char字符数组中包含'\0'占一字节。 (5)循环次数变量i应尽量定义在循环结构内,避免多个循环结构公用一个变量i导致程序运行的结果错误。 七、课程设计总结 在这次加解密系统程序设计中,我们组员之间团体合作分工明确,小组内各个成员通过多种途径查找资料并向同学和老师请教,组员在组长领导下密切协作,解决了在编程过程中的许多问题。 做了两周的课程设计,有很多的心得体会,更多的是同学之间的合作精神,这道课程设计花了我们一到两周的时间,几人合作,老师的帮忙才完成。 我第一次完成这么完美的杰作,心理有一份别样的滋味,在设计过程中,我付出了很多,也懂得了只有付出才有回报。 在这次设计中,我遇到了很多困难,但我没有向困难低头,通过查询资料,虚心向同学、老师请教,才一一得到了解决。 在设计过程中,合作精神必不可少。 单凭一个人的力量是不能完成的,毕竟一个人学的很有限。 每个人掌握的不同。 开始的时候,我画流程图很是困难,需要一个多小时才能清楚的根据自己的想法画出图来,后来画多了,就更加了解它的功能,十分得心应手,能够比较快而准确的画出来。 在这次课程设计中,我们首先对系统的整体功能进行了构思,然后用结构化分析方法进行分析,将整个系统清楚的划分为几个模块,再根据每个模块的功能编写代码。 而且尽可能的将模块细分,最后在进行函数的调用。 由于我们是分工编写代码,最后需要将每个人的代码放到一起进行调试。 因为我们每个人写的函数的思想不完全一样,所以在调试的过程中也遇到了困难,但经过我们耐心的修改,终于功夫不负有心人,我们成功了! 我相信: 态度决定一切,只有努力才有收获。 在加解密系统的设计过程中,我们遇到许多问题,比如在程序大体框图的设计过程中,许多功能算法不知道如何实现,最终通过查询多处资料和一段时间锲而不舍的调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 加解密系统DOC 解密 系统 DOC
![提示](https://static.bdocx.com/images/bang_tan.gif)