文件资料加解密处理程序.docx
《文件资料加解密处理程序.docx》由会员分享,可在线阅读,更多相关《文件资料加解密处理程序.docx(21页珍藏版)》请在冰豆网上搜索。
文件资料加解密处理程序
程序设计报告
(2012/2013学年第一学期)
题目:
文件加解密处理程序
专业
学生姓名
班级学号
指导教师燕俐
指导单位计算机系统结构与网络教学中心
日期2012.12.10~12.21
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
一、课题容及要求
1.功能要求
编写一个对文件(由数字或字母组成)进行加密解密的程序。
可以将所需要的容(整个文件或者输入的一行字符)加密,也可以将存储的加密文件翻译回来。
例如加密时可以将选取容的每个字符依次反复加上”49632873”中的数字,如果围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(既N%122).解密与加密的顺序相反。
2.菜单要求:
从键盘输入要进行加密的一行字符串或者需要加密的文件名。
显示菜单:
1.设置加密方法
2.加密
3.解密
4.显示原始文件和解密文件
选择菜单,进行相应的操作。
加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到文件中;解密是将加了密的文件还原并保存到文件中,同时应比较与原始文件的一致性;显示是将文件在屏幕上显示出来,供人工校对。
3.程序设计参考思路:
(1)定义原始文件sourse.txt、加密文件result.txt和还原文件recall.txt
(2)程序模块及函数功能:
(1)在屏幕上显示文件voidprinttxt();
(2)加密voidencode();
(3)解密voiddecode();
(4)文件比较voidcmptxt();
4.需要的知识:
(1)文件读取写入操作语言
(2)字符串的处理,如何对字符进行加减操作,并保证加减后的数值处于某一围之(模运算)
(3)了解加解密的基本原理
二、需求分析
模块分析:
(1)在屏幕上显示文件voidprinttxt()
用于将原始文件sourse.txt,加密文件result.txt,解密文件recall.txt,的容显示在屏幕上,方便检验程序是否正确执行。
在此函数中要以输入方式打开三个文件。
(2)加密voidencode()
对原始文件sourse.txt整个或部分字符串加密,并将加密后的容写入result.txt上。
加密时,每个字符依次反复加上”4963287312”中的数字,如果围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(即N%122).
例如:
加密the
(t)116+4,(h)104+9,(e)101+6
变为xqk
(3)解密voiddecode()
对加密后的result.txt进行解密,并将解密后的容写入recall.txt文件中。
解密过程与加密过程的顺序正好相反,即从第一个字符开始,每个字符依次反复减去”4963287312”中的数字,若执行减法后得到一个负数,则把这个负数加122,即(N+122),其中N为负数。
例如:
把xqk解密
(x)120-4(q)111-9(k)107-6
变为the
(4)设置加密方法voidset()
由键盘输入,得到加密字节数和加密字符串,进行加密方法的设置,主要由输出输入语句组成,目的是为了方便人机交流。
(5)加密方法用结构表示
structpassword/*加密方法*/
{
charps[10];/*加密字符串*/
longwd;/*加密的字节数*/
};
(6)文件比较voidcmptxt()
从source文件和recall文件中读取字符并进行比较,看加解密是否成功。
但由于已经在屏幕上显示原文件和解密文件,故不调用。
(7)显示菜单:
******************
*1.设置加密方法*
*2.加密*
*3.解密*
*4.显示文件*
*5.退出 *
******************
三、概要设计
1.加密程序的设计:
开始,以输出方式打开加密文件,以输入方式打开原始文件,判断文件是否为空,若为空,对字符串进行加密:
定义for循环,判断i值是否小于字符串的长度,是则进行加密运算,即将字符所对应的ASCALL码加上加密字符串所对应的数字减去48,得到的就是加密后的字符,如果围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(即N%122),将加密后的文字写入加密文件,关闭打开的两个文件,屏幕显示加密成功。
如果文件不为空,则对文件中字符加密,加密过程与上述加密过程相似。
2.解密程序的设计:
开始,以输出方式打开解密密文件,以输入方式打开加密文件,对加密后的文件中的字符串进行解密:
定义for循环,判断i值是否小于字符串的长度,是则进行加密运算,即将字符所对应的ASCALL码减去加密字符串所对应的数字加上48,得到的就是解密后的字符,若执行减法后得到一个负数,则把这个负数加122,即(N+122),其中N为负数。
将解密后的文字写入解密文件,关闭打开的两个文件,屏幕显示解密成功。
3.显示程序的设计:
以输入方式打开原始文件,加密文件,解密文件,将文件中进行的字符串读入到屏幕上,方便读者进行比较。
4.主函数的设计:
选用switch语句,从键盘读入字符以选择调用函数,实现操作。
四、源程序
#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,w;
charc,C;//临时字符存储变量
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;
}
if(flag=1)C=fgetc(source);//得到一个文件容
if(flag==0||C==EOF)//判断文件是否为空,为空的话,对输入字符加密
{
printf("请输入要加密的字符串:
\n");
scanf("%s",s);
m=strlen(s);
fprintf(source,"%s",s);
for(i=0;i{
staticinta=0;
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//文件非空,对文件加密
{
w=C+password.ps[0%n]-48;
fputc(w,result);
for(i=0;(c=fgetc(source))!
=EOF;i++)
{
staticinta=1;
if(a{
N=c+password.ps[a%n]-48;
if(N>122)
{
N=N%122;/*模运算*/
}
fputc(N,result);
a++;
}
elsefputc(N,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);
}
for(i=0;(c=fgetc(result))!
=EOF;i++)//对加密文件进行译码
{
staticinta=0;
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++;
}
elsefputc(c,recall);
}
printf("\n解密成功!
\n");
fclose(result);
fclose(recall);
system("pause");
}
voidcmptxt()/*比较解密文件和原始文件的一致性,一致输出原字符,不一致输出'_'*///在程序中没有调用
{
FILE*source=fopen("sourse.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&&(c=fgetc(source))!
=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();
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设置加密方法,加密字符串496,为前五位字符加密
从键盘读入要加密的字符串文件并加密
解密
显示加密文件与解密文件
七、课程设计总结
遇到的问题:
1,在解密文件时会遇到将未被加密的字符进行解密,以致出现错误的解密文件。
后来发现解密函数中有一句的文件字符写入写错了,从result文件中读出即可解决。
2,程序不能给长文件加密,后来计算需加密文件长度,对加密字符串长度取余,即可实现重复的加密,实现全文加密。
感想:
虽然老师什么都不讲,但是自己动手查资料,讨论语句的功能还是很有意思的,也更加巩固了c语言知识,能灵活的运用知识了。