搜档网
当前位置:搜档网 › C语言加密解密课程设计报告

C语言加密解密课程设计报告

C语言加密解密课程设计报告
C语言加密解密课程设计报告

大学课程设计

文件的加密解密—

单位数理系分院(系)

专业应用物理

学号

学生姓名

指导教师

完成日期 2010 年 9 月 17日

摘要

}

进行程序的加密解密是现在对文件保护的一种重要措施。传统的文件保护方法只是对文件进行封存。随着计算机和网络技术的迅速发展,越来越多的人意识到文件加密的重要性,而采用一定的程序对文件进行加密正是现在人们对文件保护的一种必要手段。

文件加密技术是通过相应程序对文件进行加密,它有许多优点,例如:可以对任意文本文档进行不同种类的加密,对原文件不造成破坏,同时可以将加密后的文件保存起来用于传输。程序灵活性强,可以随时进行加密解密。用户可以根据需要使程序完成相应功能。

本文采用C程序,实现了所述功能中的全部内容。

论文首先介绍了程序的设计思路,其中包括相应的流程图。其次,介绍了函数的主要功能。最后,利用C语言环境编辑程序实现了全部功能,并作了详细描述。

关键词:文件加密,功能,文件,C程序。

目录

第1章选题的意义……………………………………………………………………………

错误!未定义书签。

文件加密的意义……………………………………………………………………错误!未定义书签。

设计程序的意义…………………………………………………………………错误!

未定义书签。

第2章系统功能需求分析……………………………………………………………………

错误!未定义书签。

系统的基本要求…………………………………………………………………错误!

未定义书签。

功能设计…………………………………………………………………………错误!

未定义书签。

第3章系统设计………………………………………………………………………………

错误!未定义书签。

设计思路 (6)

程序模块 (7)

功能图 (7)

函数分析 (11)

第4章系统实现………………………………………………………………………………

错误!未定义书签。

第5章总结……………………………………………………………………………………

错误!未定义书签。

第1章选题的意义

文件加密的意义

随着科学的日益进步,电子技术越来越被人们所广泛使用。在此期间,自然就涉及到文件的传递。在此之前有关文件的转移都是人为进行转移,因此所谓的加密是物理意义上的加密。物理上的加密就是对文件封存,以至于文件内容不会泄露。但在这个网络的时代,文件的传递有着更加快捷的方式,就是通过互联网。这是种抽象的传输方式,文件不通过接触性交换,而是以数据的形式传送。在传递过程中,文件很容易被人截获,从而被他人得到了文件内容。如果不进行有效的保护措施,一旦发生这种情况,文件内容自然就没有保密可言,将会造成严重的损失。如果将原文件加密,虽然在传输过程中仍有被截获的可能,但窃取者可能无法阅读文件中的内容,从而间接的保护了文件。因此可以说,对文件的加密是极为重要的。

^

设计程序的意义

本题目的内容是要对一个文件进行加密与解密。

通过对程序的设计,可以对C程序中的数组·函数·分支·循环·文件等内容有更深入的理解与运用。

设计程序的过程中,通过已有知识的运用和独立完成与思考,能够做到对知识的整体理解。通过解决设计过程中遇到的问题,能够提高设计程序的熟练度,并对知识有巩固作用。

另外,所选题目与自己的兴趣有关。编程之中不仅能提高题目涉及到的内容的兴趣,更主要在于能够对C语言更加感兴趣。

第2章系统功能需求分析

系统的基本要求

本题目的要求是通过程序,将已有文件进行加密解密。其中要求加密解密方式不止一种,也就是说,运行程序后,提供给使用者不同的选择。使用者根据自己的需要,选择相应的选项,就可以得到不同的结果。与此同时,也要将加密或解密后的程序予以保存。原文件和要保存的文件路径由使用着自己确定。设计的过程中要求设计者独立完成,程序设计思路清晰,报告画面整洁。

功能设计

·

本程序要完成如下几项功能:

1.提供给使用者选择加密与解密的方式的界面,界面自由设计,但必须包括不同加密解密方式的提示,以及提示使用者输入文件读入的路径和文件保存的路径。比如“请输入要读入文件的完整路径”“请输入要将加密后的文件保存的完整路径”“请选择加密方式”“ASCII 码加密请按一”等等;

2.根据使用者的选择,执行相应加密或解密函数,对文档加密或解密。这是程序的主要部分,程序中要编译许多函数以完成相应功能。加密方式包括ASCII码加密;倒叙加密;二进制加密。所以至少要完成三种加密函数,才能够完整的执行全部功能。

3.将以加密的文件保存,并显示在屏幕上。这是程序的收尾工作。因为题目为文件的加密解密,所以自然要包括加密后对文件的保存。加密后的文件可以通过互联网传输,将加密后的文件以某种格式保存后,便于文件的传递。显示于屏幕上方便于使用者查看加密后的效果。打开保存的文件对比后,发现显示的内容与文件中的内容一致。即做到了文件的保存。

第3章系统设计

设计思路

1.程序中涉及到的全局变量:

Int k 为一全局变量,起其作用是用来存放用户对加密与解密方式的选择。

2.程序中涉及到的自定义函数:

Void password1:ASCII码加密函数;

Void pass1:ASCII码解密函数;

Void password2:倒叙加密函数;

Void pass2:倒叙解密函数;

Void password3:二进制加密函数;

Void pass3:二进制解密函数;

3.设计:

(1)主函数:

-

主函数完成的功能包括,提供给使用者选择界面,以及根据使用者的选择,执行不同功能。函数中首先要对自定义函数进行声明。运行该函数,显示出程序能够完成的加密与解密功能,并提供给使用者自行选择的空间。使用者根据提示,选择相应的功能后,通过选择语句,执行相应的函数,以完成使用者的要求。

可以考虑在函数中定义整型变量k,该变量的作用是从键盘上读取一个数字,该数字为使用者选择程序要执行的功能选项。这样就可以编写一个switch选择语句,将不同的k值指向不同的自定义函数,以进一步完成相应的功能。

(2)加密部分:

该部分是程序中十分重要的一部分,对文件的加密过程要在此完成。该部分包括三种不同的自定义函数:Void password1;void password2;void password3。即可完成三种不同的加密方法。执行该函数,将已有文件保存在一个数组中,通过对该数组元素的加密,实现对原文件中的内容的加密。再将加密后的结果显示在屏幕上,供使用者检查,并将加密后的内容保存在使用者指定的文件中。

虽然有三个不同的函数,但主要思想是一样的。函数中要定义文件类型指针FILE *fp,*fp2.指针的作用是只想要打开的文件和要保存的地址,只有这样才能实现对文件的加密和保存。

Char a[]:用以保存打开文件中的内容;char outfile[],infile[]用以记录使用者选

择打开文件和保存文件的路径。Int i:是对数组进行加密是定义的一个整型变量,他通过循环体,将数组中不同位置的元素进行改变。Int m:通过循环体,记录文件中包括的字符的总数,通过m,可将文件整体内容复制到数组a[]中。

(3)解密部分:

该部分是根据加密部分相应编辑出来的。这一部分同样由三种不同的自定义函数组成,可以想象到,三个函数与加密函数一一对应。运行解密函数之前,可以先运行相应的加密函数,将加密后的内容保存到某一文件中。然后运行解密函数,选择被打开的文件为刚加密的文件,这样可以发现,解密后的内容与原文件相同。

Char a[]:用以保存打开文件中的内容;char outfile[],infile[]用以记录使用者选择打开文件和保存文件的路径。Int i:是对数组进行加密是定义的一个整型变量,他通过循环体,将数组中不同位置的元素进行改变。Int m:通过循环体,记录文件中包括的字符的总数,通过m,可将文件整体内容复制到数组a[]中。

程序模块

图1 功能模块组成

系统分为三部分:显示加密或解密方式;显示加密或解密结果;保存结果。

功能图

主函数

自定义函数void password1

Void password2

Void pass1

;

Void pass2

图4 pass2函数算法函数分析

(1)主函数:void main()

功能

显示加密与解密方式选项,对使用者不同选择,对应执行相应的函数。

内容分析

Void password ;void pass是对自定义函数的声明,其函数内容会在后面编译。Int k 定义整型变量,记录使用者的选择。

Printf()显示提示语句,提示使用者选择不同的数字会得到不同的结果。

Switch(k)根据k值的不同,对应执行不同的函数。

(2)void password1()

功能

完成对已有文件的ASCII码加密,程序中设计的是用该字母前面的第5个字母代替。加密后字幕的相对差值没有改变,但每个字母都变为自身前面第5个字母。使他人无法阅读,实现了加密功能。

内容分析

Scanf()使用户输入原文件的位置。

fp=fopen(infile,"r")打开相应的文件。

While()用m记录文件共用多少个字符。

Rewind()使文件指针从新指向文件开头。

fgets(a,m,fp)将文件中的全部内容付给a[]数组。

For()实现对数组a中的元素改变。a[i]=a[i]-5,即用元素字母前面第5个字母代替当前字母

Puts (a)在屏幕上显示出数组内容,即加密后的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。

Fclose()关闭文件。

(3)void password2()

功能

完成对以有文件的倒叙加密,即将文件中的内容全部倒置。加密后文件字母没有改变,但顺序改变,使人一时间无法识破,实现加密功能。

内容分析

?

Scanf()使用户输入原文件的位置。

fp=fopen(infile,"r")打开相应的文件。

While()用m记录文件共用多少个字符。

Rewind()使文件指针从新指向文件开头。

fgets(a,m,fp)将文件中的全部内容付给a[]数组。

t=a[i];a[i]=a[j];a[j]=t;将文件最后一个字符付给第一个字符,将第一个字符付给最后一个字符。再将第二个与倒数第二个交换,以此类推。用for()实现循环。

Puts (a)在屏幕上显示出数组内容,即加密后的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。

|

Fclose()关闭文件。

(4)void password3()

功能

完成对已有文件的二进制加密,将文件中的字母转换成数字不同字母(包括大小写)由不同数字代替,标点符号和间隔符也转换成相应的数字。其他人看到的加密后的文件只是很多的数字,根本无法阅读,实现了加密功能。

内容分析

Scanf()使用户输入原文件的位置。

fp=fopen(infile,"r")打开相应的文件。

While()用m记录文件共用多少个字符。

&

Rewind()使文件指针从新指向文件开头。

fgets(a,m,fp)将文件中的全部内容付给a[]数组。

b=a[i]将数组a中的字符付给b。

switch(b)根据b的值的不同,使c对应相应的数字。

For()实现数组中全部字符的转换。

d[i][]=c将c中的内容付给二维数组。

Printf()显示二维数组中的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。

Fclose()关闭文件。

(5)void pass1()

功能

完成对已加密后的文件进行ASCII码解密。即用每个字符前的第5个字母代替该字母,还原加密后无法阅读的文件。是文件重新还原,供使用者阅读。

内容分析

Scanf()使用户输入原文件的位置。

While()用m记录文件共用多少个字符。

Rewind()使文件指针从新指向文件开头。

fgets(a,m,fp)将文件中的全部内容付给a[]数组。

a[i]=a[i]+5将数组中的元素用自身后面第5个字母代替。

Puts (a)在屏幕上显示出数组内容,即加密后的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。

Fclose()关闭文件。

(6)void pass2()

功能

·

使用该函数要想得到解密结果,只能对已加密的文件解密。它与加密函数void password2作用相同,即将文件中倒数第j个字母与文件中正数第i个字母交换。实现解密功能。

内容分析

Scanf()使用户输入原文件的位置。

fp=fopen(infile,"r")打开相应的文件。

While()用m记录文件共用多少个字符。

Rewind()使文件指针从新指向文件开头。

fgets(a,m,fp)将文件中的全部内容付给a[]数组。

t=a[i];a[i]=a[j];a[j]=t;将文件最后一个字符付给第一个字符,将第一个字符付给最后一个字符。再将第二个与倒数第二个交换,以此类推。用for()实现循环。

"

Puts (a)在屏幕上显示出数组内容,即加密后的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。

Fclose()关闭文件。

(7)void pass3()

功能

该函数用以解密二进制加密后的文件。将文件中的数字通过选择语句还原回字符,是文件变得重新可读。实现了解密功能。

内容分析

Scanf()使用户输入原文件的位置。

fscanf(fp,"%d",&d[i][0])是文件中的数据付给二维数组d[i][]。n++用n记录文件中数据的长度。

c=d[i][0]用for()循环将二维数组中的内容付给变量c。

switch(c)通过选择语句,将不同的c值对应不同的字符。

Printf()显示数组中的内容。

Fputs(a,fc)将加密后的数组保存到fd所指向的文件中。Fclose()关闭文件。

第4章系统实现

本系统针对信息维护、数据查询统计、报表打印分别设计了7个界面,下面举例说明一些功能界面的设计。

系统首页界面设计:

建立一个表单做欢迎界面设计,在表单中添加一个标签,在其中输入所需文字。

建立一个表单做登录界面设计,添加两个按钮,分别为确定和取消。如图1所示:

:

图 1

图 1

添加学生信息

建立一个表单做欢迎界面设计,在表单中添加一个标签,在其中输入所需文字。

建立一个表单做登录界面设计,添加两个按钮,分别为确定和取消。如图1所示:[

!

|

维护学生信息)

图 1

第5章总结

通过课程设计,我学习到了许多内容。首先是对已学过的内容的一个深入理解。可以说,以前内容学的不好的话,是很难完成这项工作的。其次,在程序编译过程中,我遇到了许许多多的问题,这些问题大多数都是小问题,主要是对问题思考的不够全面的结果。但是在自己的反复检查,实验,以及老师的帮助下,这些问题都迎刃而解。在解决问题的过程中,我能够了解到我设计中的不足之处。

刚开始的时候,面对一张空空的程序编辑界面,一时之间还真没有头绪。但随着思维的跟进,我将程序分为几部分处理,用不同的函数实现不同的功能。这样就将难点分散开来,逐一实现了加密与解密功能。

程序设计中没遇到问题后,就要停下来仔细分析问题出处,及时修改。这就不免使设计过程变得有些乏味。这也正是设计程序的另一个目的,他在你设计过程中不经意地考验了你的耐心和恒心。只有能够坚持到最后的人才能够设计出出色的程序。

$

程序编辑过程中,我也深深的感觉到了自己的不足,对已学过的知识是有所理解,也能够合理地运用,但对边角的内容有所忽略,这也正是有时程序无法正常运行时不知错在哪的原因。因此这让我懂得了,学习过程要仔细认真。

最后,经过许多天的设计过程,我终于完成了程序的全部内容过程。经过调试后,程序已经能够正常运行,并能实现全部功能。看到这么多天的成果,我感到一种成就感。

程序设计让我将以学过的知识综合运用,我感觉编译这种程序确实很有意思。因为它不仅考察一个人知识的掌握情况,也也考验遇到问题的分析能力,和自身的学习能力。所以我感觉课程设计很有用。

附录源程序代码

#include<>

#include<>

·

#include<>

int main()

{

void password1();

void password2();

void pass1();

void pass2();

void password3();

void pass3();

int k;

loop:printf("选择加密解密方式\n");

printf("(加密1:ASCII加密) 请按1\n");

printf("(加密2:倒序加密) 请按2\n");

printf("(加密3:二进制法加密) 请按3\n");

printf("(解密1:ASCII解密) 请按4\n");

printf("(解密2:倒序解密) 请按5\n");

printf("(解密3:二进制法解密) 请按6\n");

scanf("%d",&k);

switch(k)

{

case 1:password1();break;

case 2:password2();break;

case 3:password3();break;

case 4:pass1();break;

case 5:pass2();break;

case 6:pass3();break;

default:printf("错误,无法加密惑解密\n");

}

goto loop;

}

void password1()

相关主题