C语言程序设计文件加密.docx
《C语言程序设计文件加密.docx》由会员分享,可在线阅读,更多相关《C语言程序设计文件加密.docx(12页珍藏版)》请在冰豆网上搜索。
C语言程序设计文件加密
C语言程序设计
课程设计报告
学期:
2014-2015
(1)
班级:
计科14-1
学号:
1060314014039
1060314014041
组员姓名:
张浩刘润龙
指导教师:
李竹林
完成日期:
2014年12月
文件加密与解密
一、设计目的:
通过对文件的加密保护与解密,使我们能更好的掌握好高级语言程序,从而了解对程序设计的基本概念和方法,进而学会利用C语言解决一般应用问题,并为后续的专业学习奠定基础。
同时增强同学们之间的团队合作精神,使我们更好的融入社会,将来成为社会有用之才!
二、设计内容:
将某一已知文件的内容(仅限于英文字母)以字符形式读出,根据密钥(用户从键盘输入)将对
应字符进行移位操作即可,解密时移动相反。
例如:
加密:
设原文为abcdef,密钥为5,则有abcdef每个字母按字母表向后移动5位(注:
z后接a)可
得到密文(乱码)fghijkl;对该文件解密:
文件内容为fghijk1,密钥为5,则有fghijk1每个字母向前
移动5位(注a后接z),可得到原文abcdef。
三、设计安排:
第一阶段:
选择课程设计的题目
第二阶段:
搜寻有关课程设计的资料,查阅相关的书籍
第三阶段:
开始编写C语言程序
第四阶段:
完成C语言程序的编写,开始撰写C语言课程设计报告
第五阶段:
完成C语言课程设计报告的撰写
四、组员分工:
文件的加密、解密程序部分由张浩同学负责。
课程设计报告,资料查询和程序调试修改由刘润龙同学负责,最后共同总结学习体会与心得。
五、总体方案的设计思想及说明:
1.主要思想:
为由总到分,由上到下的逐级分配任务的思想。
通过主函数调用各个被调用的函数,再由被调用函数通过多个循环嵌套的使用实现各自的功能,最终达到程序的要求。
2.程序说明:
(1)主函数其中包括:
输入函数input(),加密函数jiami(),解密函数jiemi(),显示函数
show(),。
(2)输入函数中:
while((c=getchar())!
=EOF)的使用能提示使用者结束的命令,并且通过fputc(c,fp)把一个字符c写到由文件指针fp指定的磁盘文件上。
(3)加密函数中:
先定义两个指针,将输入的文件内容通过fputc(c+1,fp1);进行加密并保存到fp1所指定的文件上。
(4)解密函数中:
在进入解密系统时,需先输入解密密码,然后在打开文件进行文件里内容解密。
根据加密时对每个文件内容的加密操作,所以解密时只需按照相同方法反操作即可。
六、源程序:
#include
#include
#include
#include
#include
#define N 30 /*文件名字符串数组大小* /
#define M 30 /* 解密码字符串数组大小*/
#define E 500 /*数组大小 */
void menu(void); /*主菜单 */
void input(void); /*输入数据的函数*/
void jiami(void); /*对输入数据加密的函数*/
void jiemi(void); /*对已加密内容进行解密的函数 */
void show(void); /*显示内容的函数*/
int judge(void); /*判断是否要继续的函数*/
char code[]="2011810063"; /*设置进入解密系统所需的密码*/
main()
{
int num;
while
(1)
{
menu();
flushall();
scanf("%d", &num);
switch(num)
{
case 0:
printf("\n");
exit(0);
case 1:
system("cls");
input();
break;
case 2:
system("cls");
jiami();
break;
case 3:
system("cls");
jiemi();
break;
case 4:
system("cls");
show();
break;
case 5:
system("cls");
count1();
break;
case 6:
system("cls");
count2();
break;
default:
printf("\n\t输入错误,请按规范重新输入!
");
break;
}
getch(); /* 等待数据输入,使界面停留*/
}
}
void menu(void)
{
printf("\n\n\n\n\t**************************************************\n");
printf("\t**\n");
printf("\t* 1--输入 2--加密 3--解密 4--显示 0--退出 *\n");
printf("\t**\n");
printf("\t********************************************************\n");
printf("\n\n\t 0. 退出系统。
\n");
printf("\t 1. 输入信息,并写入文本文件。
\n");
printf("\t 2. 对给定的文件进行加密。
\n");
printf("\t 3. 对给定的文件进行解密。
\n");
printf("\t 4. 显示文本文件的内容。
\n");
printf("\n\t 请选择(0--4):
");
}
void input(void)
{
int n=1;
FILE *fp;
char c, fname[N];
while(n)
{
printf("\n请输入文件名:
\n");
scanf("%s",fname);
if ((fp=fopen(fname,"w")) == NULL)
{
printf("文件打不开!
\n");
exit(0);
}
Else
{
printf("请输入文件内容:
(若结束请按ctrl+z)\n");
while((c=getchar())!
=EOF) /* 输入文件的内容,以ctrl+z结束*/
fputc(c,fp);
fclose(fp);
}
printf("文档输入并保存成功!
\n");
printf("\n若继续创建文档,请输Y或y...");
n=judge(); /*退出解密系统*/
}
}
void jiami(void)
{
int n=1;
FILE *fp,*fp1;
char c,fname[M];
while(n)
{
printf("\n请输入要加密的文件名称:
\n");
scanf("%s",fname);
if ((fp=fopen(fname,"r")) == NULL)
{
printf("\n无法打开文件!
\n若重新输入,请输Y或y...");
n=judge(); //退出
}
if ((fp1=fopen("jiami.txt","w"))==NULL)
{
printf("无法打开文件!
\n");
exit(0);
}
while((c=fgetc(fp))!
=EOF) /*按ctrl+z结束*/
{
fputc(c+1,fp1); // 加密
putchar(c+1);
}
fclose(fp1);
fclose(fp);
remove(fname); /* 删除被加密的原文件*/
rename("jiami.txt",fname); /* 加密后的文件名更改为原文件名*/
printf("\n文档加密并保存成功!
\n");
printf("\n\n是否继续加密?
若继续请按Y或y...\n");
n=judge();/*退出*/
}
}
void jiemi(void)
{
int n=1;
FILE *fp,*fp1;
char c, fname[M],code1[M];
while(n)
{
printf("\n请输入进入解密系统所需密码:
");
scanf("%s",code1);
if(strcmp(code1,code)==0) /*比较字符串大小是否相等*/
{
while(n)
{
printf("\n请输入要解密的文件名:
");
scanf("%s",fname);
if ((fp=fopen(fname,"r")) == NULL)
{
printf("\n文件打不开\n");
exit(0);
}
if ((fp1=fopen("jiemi.txt","w"))==NULL) {
printf("无法打开文件!
\n");
exit(0);
}
while((c=fgetc(fp))!
=EOF)
{
fputc(c-1,fp1); /*解密*/
putchar(c-1);
}
fclose(fp1);
fclose(fp);
remove(fname); /* 删除被解密的原文件*/
rename("jiemi.txt",fname); /*解密后的文件名更改为原文件名*/
printf("\n是否继续解密?
若继续请按Y或y...");
n=judge(); /*退出*/
}
}
else {
printf("\n输入密码有误!
请重新输入...\n");
}
}
}
void show(void)
{
int n=1;
FILE *fp;
char fname[M];
while(n)
{
printf("\n请输入要显示的文件名称:
");
scanf("%s",fname);
if ((fp=fopen(fname,"r"))==NULL)
{
printf("\n文件打不开,若要继续输入请按Y或y...");
n=judge();/*继续*/
}
Else
{
printf("\n%s的内容是:
\n\n",fname);
while(!
feof(fp)) /*判断是否是文件末尾*/
putchar(fgetc(fp)); /*显示文件内容*/
printf("\n");
fclose (fp);
printf("若要继续显示文件,请按Y或y...");
n=judge(); /*退出*/
}
}
}
1.输入文件内容界面
2.文件加密界面
(2)显示解密文件
七、实验总结:
1.把程序写成小函数的集合,有助于程序编写、调试、维护和修改的方便。
2.在相关性不是很大的语句之间可以使用空行隔开,有利于区分各个语句的具体作用,在修改程序时起到一定的作用,提高了程序的可读性。
3.在switch语句中未加getch();使得界面不会停留,直接跳回主菜单界面。
4.在输入文件时,语句scanf("%s",fname);中的%s误写成%c,导致输入错误。
5.在对文件操作时需要注意关闭文件的操作,假如没有关闭,将会使在运行程序之时,不能对文件进行删除或者重命名的操作。
导致一些未知错误。
6.要及时使用清屏函数清除键盘缓冲区的文件及数据流,否则会导致不必要的错误。
7.在编写解密程序时,要注意使用两个while进行嵌套,使得在判断是否输入密码正确后,再判断解密的文件及是否继续解密其他文件。
8.通过这次的课程设计,我明白了,不管多么复杂的程序,其实都是有许许多多的小集合体组成的,只要肯花时间,肯认真,在编写程序的实践中,终将会将一系列的问题解决,从而达到目的,提高自己的能力,实践是检验真理的唯一标准!
八、个人收获与体会:
组员:
张浩
通过这次的作业我觉得最大的收获是不仅把平时学习到的知识理解的更加透彻,而且使知识更加系统化,同时还把有些平时不太注意的小问题发现了出来,这不但有利于我学习C语言,而且对于我学习任何一门课程都是很有益处的。
总之,做这份作业对于我们学习C语言有很大的帮助。
在做课程设计时,由于运用了很多新知识,新的方法,还有题目更加复杂,应用性更强,在编写过程中遇到了很多困难,幸好我们有团结的集体,通过大家的努力、配合,我们将问题逐个解决,最终成功的完成了作业,对c语言有了进一步理解,这对我们说意义是相当重大的,在此感谢我组同学的支持和老师的帮助和指导。
经过这次的学习、设计,我们学到了许多以前不懂的、难懂的知识。
这真是锻炼人的好机会,我很喜欢这种应用性的学习。
我要感谢我的老师、我的伙伴,你们使我懂得了许多、许多。
组员:
刘润龙
在这次和同组人一起设计程序过程中,我深刻体会到一个人的力量是渺小的,只有大家同心协力,才能完成好一项工作。
在设计统计块时,开始遇到了不少困难。
如:
在写程序时,因为对数组,指针不熟悉,而出现了不少错误。
经过学习,讨论,最后克服了这些困难。
经过这次设计,我对数组,指针的知识和使用又上了一个台阶。
数组和指针那么地方便,它真是C语言的重点,精华所在。
所以,在以后的学习中,我更应抓紧对指针的学习。
我想有了这样一次体验,在以后漫长的人生路上,
我们在面对许多意想不到的困难与挫折时,我们会更从容的去面对。
通过这次合作,我使自己的动手能力和与人沟通的能力得到了提高,这将使我在以后的的道路上走的更稳,收获更多。
所以,我们应感谢老师的良苦用心。
同时我也知道了我们随时都要培养自己的动手能力,只有这样,才能更好的适应这个日新月异的飞速发展的社会。