河南理工大学万方科技学院。
院系名称建筑与测绘工程系
姓名。学号。
专业地理信息系统
指导教师。数据结构》 1
课程设计报告 1
一、问题描述 3
二、基本要求 3
三、工具/准备工作 3
四、分析与实现 3
一、 概要设计 4
二。详细设计 5
五。附件 8
六。心得体会 13
利用c语言实现一个简单的文件加密/解密系统。该系统采用对称加密体制,由用户指定自己的密钥key。加密函数可描述为:
m=p+key;对应的解密函数可描述为p=m-key;其中p表示8位的明文数据,m表示8位的明文数据。系统要求提供一个字符菜单界面,可以对任意格式的文件进行加密/解密。
1,实现一个简易的文件加密/解密系统。
2,给出自定义的加密解密算法。
3,系统流程规范,可实现系统操作。
硬件:windows xp或7操作系统的计算机;
软件:microsoft visual c++ 6.0;
准备工作:安装microsoft visual c++ 6.0;
对称加密体制是一种传统而经典的加密体制策略,多为对称加密体制即加密方a和解密方b共享一个key.加密方a使用该密钥key对要进行的文件进行加密操作。从而生成密文;解密方使用key对文件进行解密操作从而形成明文。
如图1所示。
key加密方a图1 对称密码体制示意解密方b
简易加密解密文件系统结构示意图2
图2 文件加密/解密系统的结构功能图。
图2所示,该文件主要是有3个模块组成的文件加密,文件解密和系统菜单。按照自顶向下,按步求精的顺序,又可将文件的加密和解密系统继续划分。如图3所示。
文件加密子模块划分。
文件解密子模块划分。
如图3所示可将文件的加密/解密2个模块继续继续划分,其中读入明文是指将用户磁盘上的文件读入缓存区,准备加密。加密明文是指将内存中的明文加密,然后在回到内存中的缓冲区中,这个过程中需要用户指定密钥。保存密文是指将内存缓冲区中的密文数据以文件的形式保存在用户指定的文件夹下。
“文件解密”的第三个模块的功能刚好与“文件加密”的功能相反,但是操作基本是一致的,只是加密/解密的函数算法有区别,因此可以最大限度的复用**。
对应上述划分的6个子模块,可以分别映射为函数来使用。但是有些模块的操作是完全一致的,因此可以最大限度的复用**。
将“读入明文”模块中的和“读入密文”合并为一个模块读入源文件”模块,因为他们的操作都是一样的。都是讲用户指定磁盘上的文件读入到内存中,读入源文件的函数定义如下:
int opensrcfile(char **buffer)
file *myfile_src源文件指针*/
char filename[20文件名数组*/
long file_size记录文件的长度*/
printf("please input the path and filename of the file you want to process");
scanf("%s",filename);
if(!(myfile_src = fopen(filename,"rb"))
fseek(myfile_src,0,seek_end);
file_size = ftell(myfile_src);
fseek(myfile_src,0,seek_set);
*buffer = char *)malloc(file_size);
fread(*buffer,1,file_size,myfile_src读入文件*/
fclose(myfile_src);
return file_size
数中定义一个指向字符型变量的指针 char*buffer,然后造函数 opensrcfile()中开辟内存缓冲区,将指定目录下的文件(明文件或者密文件)读入缓冲区中。该缓冲区的首地址是buffer ,这样可以通过该参数直接修改主调函数中的指针变量 buffer 。该函数的返回值为读入的文件(明文或者密文)的长度。
文件加密函数定义如下:
void encryption(char buffer,int file_size,int key)
int i;
for( i = 0; i < file_size; i++)
buffer[i] =buffer[i] +key; /m=2*(p+key) *
该函数将缓冲区 buffer 中储存的明文进行加密,并将密文存放于缓冲区中,参数 file_size 为文件的长度。key为用户的输入的密钥。
文件加密函数定义如下:
void decryption(char buffer,int file_size,int key)
int i;
for( i = 0; i < file_size; i++)
buffer[i] =buffer[i] -key;
该函数将缓冲区 buffer 中储存的密文进行解密,并将明文存放于缓冲区之中。参数file_size 为文件的长度,key为用户输入的密码。
并将“保存密文”模块与“保存明文”模块合并成保存目标文件”模块,因为他们的操作系统是一样的,都是讲缓冲区中的 buffer 中的数据(明文数据或者密文数据)保存在指定的文件目录上。保存在目标文件的函数定义如下:
void s**edstfile(char *buffer,long file_size)
file *myfile_dst源文件指针*/
char filename[20文件名数组*/
printf("please input the path and filename of the file you h**e processed");
scanf("%s",filename);
if(!(myfile_dst = fopen(filename,"wb"))
fwrite(buffer,1,file_size,myfile_dst);
printf("ok");
fclose(myfile_dst);
调用函数s**edstfile()时,主调函数(调用函数s**edstfile的函数)中定义的指针buffer 指向缓冲区中已存在处理好的数据(明文数据或密文数据)。通过函数s**edstfile 只是将缓冲区 buffer 中的内容写到用户自定义的文件夹中去。参数file_size 为文件的长度,即缓冲区 buffer 的长度。
将上述函数通过一个函数process()整合在一起,函数 process() 由主函数 main()调用。函数process()的定义如下:
viod process(int a)
file *myfile_dst;
char * buffer;
int key;
long file_size记录文件的长度*/
file_size = opensrcfile(&buffer读入源文件*/
printf("please input the key (a integer) for encryption or decryption");
scanf("%d",&key用户输入密钥*/
if(a ==0)
elses**edstfile(buffer,file_size);
函数 process()的参数由用户指定,当参数a等于0时为加密模式。当a等于1时为解密模式。对文件(明文文件或者密文文件)的操作由函数openarefile()来完成,对文件进行不同的处理,主函数main()的定义如下:
main()
char flag;
menu();
flag = getchar();
getchar();
while(flag !=q')
flag = getchar();
getchar();
整个程序调用关系结构如图4所示。
有一下几点值得指出:
1. 这个“简易加密解密系统”的设计程序遵循了“自顶向下的分析”和“自低向上的设计”的原则。
数据结构课程设计
课程设计说明书 题目哈夫曼编码问题的设计和实现。课程名称数据结构课程设计。院 系 部 中心。专业。班级。学生姓名。学号。设计地点。指导教师。设计起止时间 2008 年6月 2日至 2008 年 6月 6 日。目录。1 问题描述 2 1.1 题目内容 2 1.2 基本要求 2 1.3 测试数据 2 2...
数据结构课程设计
数据结构 课程设计。实验报告。学院 信息工程学院。班级 姓名 学号 指导老师 题目2 一元多项式的计算。1 实验目的。1 掌握链表的灵活运用 2 学习链表初始化和建立一个新的链表 3 知道怎样去实现链表删除结点操作与插入结点 4 理解链表的基本操作 包括数据域数据的相加 并能灵活运用。2 实验内容。...
数据结构课程设计
班级 信计 1102 姓名 李娜娜。学号 1108060209 设计日期 2013.07.15 西安科技大学计算机学院 1.实验题目 编制一个演绎扫雷游戏的程序。2.问题描述。做一个n x m的扫雷游戏,每个方格包含两种状态 关闭 closed 和打开 opened 初始化时每个方格都是关闭的,一个...