文件加密.docx
- 文档编号:6643868
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:19
- 大小:271.12KB
文件加密.docx
《文件加密.docx》由会员分享,可在线阅读,更多相关《文件加密.docx(19页珍藏版)》请在冰豆网上搜索。
文件加密
XXXXXXX大学
程序设计报告
题目:
文件加密
专业计算机科学与技术
学生姓名XXX
班级学号XXXXXXXX
指导教师XXXXX
指导单位计算机学院
日期2011-12-2
一:
题目要求
题目7.文件加密
1系统的基本功能
文件的传输有明文和密文两种。
明文发送不安全,可以用程序实现文件内容的加密和解密操作。
加密算法、密钥设计可以采用现有算法,也可以自己设计。
2要求
1)从键盘输入需要加密的文件名称、所在路径、使用的密钥;对文件的字符进行加密后,加密的内容写入同一个目录下的新生成的文件中,该文件名自行定义;
2)从键盘输入需要解密的文件名称、所在路径、使用的密钥;对文件的字符进行解密后,解密后的内容写入同一个目录下的新生成的文件中,该文件名自行定义。
3)允许不同的文件采用不同的密钥。
2、需求分析
(1)在屏幕上显示文件内容voidprinttxt();
便于将加密前的文件内容和加密后的文件内容作比较,方便检验程序执行的是否正确。
(2)加密函数voidencode();
对原文件中的字符串进行加密并将加密后的内容写入到自定义的加密文件夹中。
加密时每个字符依次反复加上加密字符串(如4963287312)如果范围超过ASCALL码值的032(空格)-122(‘Z’),则进行模运算(即N%122)
例如:
加密the
(t)116+4,(h)104+9,(e)107+6
变为xqk
(3)解密voiddecode();
对加密后的文件中的字符串进行解密,并将解密后的内容写入到自定义的文件中。
解码过程与加密过程正好相反,即从第一个字符依次反复减去“4963287312”中的数字,若执行减法后得到一个负数,则把这个负数加122.即(N+122)其中N为负数。
例如:
把xqk解密
(x)120-4,(q)111-9,(k)107-6
变为the
(4)显示菜单:
*********************************
1.设置密钥
2.加密文件
3.解密文件
4.显示文件
5.退出
*********************************
请选择输入1~5
(5)加密方法用结构体表示
typedefstructpassword/*加密方法*/
{
charps[50];/*加密字符串*/
longwd;/*加密的字节数*/
}password;
三、概要设计
在程序设计中定义了两个全局变量,字符数组PS用来存放加密字符串,长整形变量wd用来记录加密的字节数的长度。
并且定义了四个成员函数模块,分别实现不同的功能.
程序的核心思想:
一个对字符文件(由数字或字母组成)进行加密解密的程序。
可以将所需要的内容(整个文件或者输入的一行字符)加密,也可以将存储的加密文件翻译回来。
例如加密时可以将选取内容的每个字符依次反复加上”4963287312”中的数字,如果范围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(既N%122)。
解密与加密的顺序相反。
4、详细设计
1.对程序运行时的步骤大致可用流程图表示出来
2.流程图大致如下:
1.设置密码函数voidsetkey();
主要定义了以下变量:
1、FILE*pfile;
//定义文件指针用于打开密钥路径下的文件夹;
2、charpathname[50];
//定义字符数组存放密钥路径;
3、passwordpw;
//定义了一个结构体对象,用来应用全局变量wd;
该成员函数主要功能是自己可以任意指定密钥的存放位置,并且向其文件中写入加密字符串;保存并关闭。
2.加密函数voidencode();
主要定义了以下变量:
1、FILE*pfile,*pkey,*pefile;
2、charkeypathname[50];
//用来存放密钥完整路径
3、charfilepathname[50];
//存放文件完整路径
4、charefilepathname[50];
//存放加密后文件完整路径
5、passwordkey;//定义的结构体变量
6、passwordfile;//定义的结构体变量
7、inti=0;
//定义及初始化,便于函数中的循环运算
关键代码:
key.wd=fread(key.ps,1,50,pkey);
//读取pkey所指文件(密钥文件)的内容到字符数组key.ps中
fflush(stdin);
//清除缓存的作用
printf("请输入明文(字符串):
");
gets(file.ps);
file.wd=strlen(file.ps);
fwrite(file.ps,1,file.wd,pefile);
////将加密前文件中的内容记录到字符数组file.ps中
for(i=0;i!
=file.wd;++i)
{
file.ps[i]=(file.ps[i]+key.ps[i]-48)%122;
}
代码思想:
开始,以输出方式打开加密文件,以输入的方式打开原始文件,判断文件是否为空,如果为空,则输出打开文件错误,若不为空,则将文件中的字符进行加密。
请文件中字符所对应的ASCALL码值的032(空格)-122(‘Z’),进行模运算(即N%122)将加密后的字符写入加密文件。
3.解密函数voiddecode();
FILE*pfile,*pkey,*pdfile;
charkeypathname[50];
charfilepathname[50];
chardfilepathname[50];
passwordkey;
passwordfile;
inti;
解密函数定义的变量和加密函数的变量类似,文件指针分别用于打开不同的文件,字符数组用来存放个文件的路径。
关键代码:
key.wd=fread(key.ps,1,50,pkey);
file.wd=fread(file.ps,1,50,pfile);
for(i=0;i!
=file.wd;++i)
{
file.ps[i]=(file.ps[i]-key.ps[i]+48+122)%122;
}
fwrite(file.ps,1,file.wd,pdfile);
代码思想:
开始,以输出方式打开解密文件,以输入方式打开加密文件,对加密后的文件中的字符串进行解密,即将字符所对应的ASCALL码减去加密字符串所对应的数字加上48,得到的就是解密后的字符。
若执行减法后得到一个负数,把这个负数加122,即(N+122),其中N为负数。
将解密后的字符写入解密文件,关闭打开的的两个文件,屏幕显示解码成功。
4.显示函数voidprinttxt();
该函数用来显示加密前文件的内容和解密后文件内容作对比,看是否符合题意,方便读者进行比较。
下面是完整的程序代码:
#include
#include
typedefstructpassword/*加密方法*/
{
charps[50];/*存放加密字符串*/
longwd;/*加密的字节数*/
}password;//将password作为structpassword的别名
voidprinttxt();//在屏幕上显示文件
voidencode();//加密
voiddecode();//解密
voidsetkey();//设置密码
voidmain()
{
printf("文件加密\n");
printf("*********************************\n");
printf("1.设置密钥\n");
printf("2.加密文件\n");
printf("3.解密文件\n");
printf("4.显示文件\n");
printf("5.退出\n");
printf("*********************************\n");
charchoice;
while
(1)
{
printf("请重新输入1~5:
");
fflush(stdin);
scanf("%c",&choice);
switch(choice)
{
case'1':
setkey();
break;
case'2':
encode();
break;
case'3':
decode();
break;
case'4':
printtxt();
break;
case'5':
printf("谢谢使用!
即将退出!
\n");
return;
}
}
}
voidsetkey()
{
FILE*pfile;//定义文件指针
charpathname[50];//定义字符数组存放密钥路径
passwordpw;
fflush(stdin);//清除缓存
printf("密钥完整路径:
");
gets(pathname);
if((pfile=fopen(pathname,"w"))==NULL)//以写的方式打开密钥文件,若不存在,则建立一个新的。
{
printf("打开文件错误!
\n");
return;
}
printf("请输入密码:
");
gets(pw.ps);//从键盘输入
pw.wd=strlen(pw.ps);//记录机密字符串的长度
fwrite(pw.ps,1,pw.wd,pfile);//将当前pw.ps的内容写入pfile所指的文件中(即密钥文件)
printf("密钥保存成功!
\n");
fclose(pfile);
}
voidencode()//加密程序
{
FILE*pfile,*pkey,*pefile;//定义文件指针
charkeypathname[50];//密钥完整路径
charfilepathname[50];//文件完整路径
charefilepathname[50];//加密后文件完整路径
passwordkey;
passwordfile;
inti;
fflush(stdin);//清除缓存
printf("获取密钥完整路径:
");
gets(keypathname);
if((pkey=fopen(keypathname,"r"))==NULL)//以读的方式打开文件,该文件必须存在,否则,文件不能打开
{
printf("打开密钥错误!
\n");
return;
}
fflush(stdin);//清理缓存
printf("加密前文件完整路径:
");
gets(filepathname);//从键盘直接输入文件路径
if((pefile=fopen(filepathname,"w"))==NULL)
{
printf("打开密钥错误!
\n");
return;
}
fflush(stdin);
printf("加密后文件完整路径:
");
gets(efilepathname);
if((pfile=fopen(efilepathname,"w"))==NULL)
{
printf("打开文件错误!
\n");
return;
}
key.wd=fread(key.ps,1,50,pkey);//读取pkey所指文件(密钥文件)的内容到字符数组key.ps中
fflush(stdin);
printf("请输入明文(字符串):
");
gets(file.ps);
file.wd=strlen(file.ps);
fwrite(file.ps,1,file.wd,pefile);//将加密前文件中的内容记录到字符数组file.ps中
for(i=0;i!
=file.wd;++i)
{
file.ps[i]=(file.ps[i]+key.ps[i]-48)%122;//'0'的ASCALL码值为48,'Z'的ASCALL码值为122
}
fwrite(file.ps,1,file.wd,pfile);//将加密后文件中的内容记录到字符数组file.ps中
printf("加密成功!
\n");
fclose(pfile);
fclose(pkey);
fclose(pefile);
}
voiddecode()//解密程序
{
FILE*pfile,*pkey,*pdfile;
charkeypathname[50];//字符数组存放密钥完整路径
charfilepathname[50];//加密后文件完整路径
chardfilepathname[50];//解密后完整路径
passwordkey;
passwordfile;
inti;
fflush(stdin);
printf("输入密钥完整路径:
");
gets(keypathname);
if((pkey=fopen(keypathname,"r"))==NULL)//以读的方式打开密钥文件
{
printf("打开密钥错误!
\n");
return;
}
fflush(stdin);//清理缓存
printf("加密后文件完整路径:
");
gets(filepathname);
if((pfile=fopen(filepathname,"r"))==NULL)//以读的方式打开加密后文件
{
printf("打开文件错误!
\n");
return;
}
fflush(stdin);
printf("解密后完整路径:
");
gets(dfilepathname);//从键盘输入解密后完整路径
if((pdfile=fopen(dfilepathname,"w"))==NULL)
{
printf("打开文件错误!
\n");
return;
}
key.wd=fread(key.ps,1,50,pkey);//
file.wd=fread(file.ps,1,50,pfile);
for(i=0;i!
=file.wd;++i)
{
file.ps[i]=(file.ps[i]-key.ps[i]+48+122)%122;//'0'的ASCALL码值为48,'Z'的ASCALL码值为122
}
fwrite(file.ps,1,file.wd,pdfile);
printf("解密成功!
\n");
//printtxt();
file.ps[file.wd]='\0';
//printf("解密后的明文:
%s\n",file.ps);
fclose(pfile);
fclose(pkey);
fclose(pdfile);
}
voidprinttxt()
{
FILE*pfile;
charfilepathname[50];
passwordfile;
fflush(stdin);
printf("原文件完整路径:
");
gets(filepathname);
if((pfile=fopen(filepathname,"r"))==NULL)
{
printf("打开原文件错误!
\n");
return;
}
file.wd=fread(file.ps,1,50,pfile);
file.ps[file.wd]='\0';
printf("原文件的明文:
%s\n",file.ps);
printf("解密后的明文:
%s\n",file.ps);
fclose(pfile);
}
5.测试数据及其结果分析
程序编译后的结果:
1、存放密钥的文件
2、加密前文件及其内容
3、加密后文件
4、解密后的文件及其内容
5、如果密钥的路径输入错误,则提示
6.如果输入密钥文件时路径出错,指向一个空文本文件中,则改加密软件失效,即,加密前与加密后的文件中的内容一样。
六.调试过程中的问题
在这个编程中,如果你在设计时存在逻辑错误,虽然源代码没错,不过在运行时就有问题,在调试中前后函数的功能要对应,要不然就不能正确运行,还得注意文件的打开方式以及英文的大小写问题。
七.课程设计总计
经过这两周的程序设计,使我巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过的知识技能来分析,解决实际问题的能力。
使我体会到了自身的知识能力能在实际中应用和发挥不但可以激发创新意识,还可以开发创造能力,养成独立思考问题的能力,经过这两周的学习使我受益非线。
通过实习丰富了我对VC环境的经验,还应此接触了MFC,虽然最终没能做出成果,但起码熟悉了了其环境,更强了它的使用技巧。
评分细则
评分项
总分
评分
平时表现(20%)
遵守机房规章制度
5
上机时的表现
5
学习态度
10
软件设计
及其实现
(45%)
团队合作精神
5
程序准备情况
5
程序设计能力
10
软件设计合理性
10
用户界面设计
5
软件功能实现情况
10
报告
(25%)
报告书写规范程度
10
内容详实程度
10
文字表达熟练程度
5
答辩(10%)
回答问题准确度
10
评分等级
总评分
评语
教师签名:
年月日
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 加密
![提示](https://static.bdocx.com/images/bang_tan.gif)