解读简单的加密文件.docx
《解读简单的加密文件.docx》由会员分享,可在线阅读,更多相关《解读简单的加密文件.docx(15页珍藏版)》请在冰豆网上搜索。
解读简单的加密文件
沈阳航空工业学院
课程设计
学号200604021007
班级6402101
姓名张雪颖
指导教师王晓岩
2007年9月18日
沈阳航空工业学院
课程设计任务书
院系:
电子专业:
电子信息工程班级:
6402101
学号:
200604021007题目:
解读简单的加密文件
一、课程设计时间
2007年9月10日至2007年9月14日,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
设一个文件中,前2个字节存储的是“解密码”;后面连续存储了5个浮点型数据(file09.dat,由指导教师提供,参考下图),它们是5个浮点型数据与“解密码”进行位的异或运算的结果数据。
要求用再次利用“解密码”数据,以及“位的异或运算”方法,将文件中的5个浮点型数据恢复成原始数据,并打印到屏幕上。
提示:
①一个整数与另一个整数“异或”运算2次,结果还是原来的整数,即:
若A^K的值为T,则T^K的值必为A。
请参考教材中有关“位运算”的内容。
②利用指针,可以把4个字节的浮点数据理解为由2个整型数据构成的。
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“显示解密码”、“显示解密之前的浮点数据”、“显示解密之后的浮点数据”、“退出”4项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
张雪颖
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现说明及相应程序段7
四、个人总结11
五、参考文献12
六、源程序13
一、需求分析
根据对程序设计所给的题目的分析可知,整个程序的设计完成实现大致可分为三个部分,其中每一个部分对应一个函数,他们的功能分别为:
1)读取并显示所给的解密码函数(mima);
2)显示解密码前的符点型数据函数(nowfloat);
3)显示解密码只后的符点型数据函数(oldfload);
在这三个函数当中,每一步都是按照题目所给的要求来实现的.
(一)文件分析:
文件file09.dat一共有22个字节,前2个字节是1个整型数据,后面是有由每4个字节组成的浮点型数据,一共5个浮点型数据。
(二)具体方法:
一个整数与另一个整数“异或”运算2次,结果还是原来的整数。
利用指针,可以把4个字节的浮点数据理解为由2个整型数据构成的。
二、程序流程图
程序总体结构图:
三、核心技术的实现说明及相应程序段
(1)如何打开读取文件并显示解密码:
文件共22个字节,解密码为整形,占两个字节.利用fread函数阅读文件file09.dat.如读取解密码可表示为:
if((fp=fopen("d:
\\0009\\file09.dat","rb"))==NULL)
/*打开文件file09.dat*/
{
printf("cannotopenfile\n");
exit(0);/*终止程序*/
printf("jiemima");
printf("\n");
fread(&b,2,1,fp);/*阅读文件*/
(2)如何读取并显示解秘前的五个连续符点型数据:
文件存放的五个连续的符点型数据,每个符点型数据占4个字节,共二十个字节,再次利用fread函数阅读文件file09.dat.读取5个连续的符点型数据,可表示为:
for(i=0;i<5;i++)
{
fread(&s[i],4,1,fp);
printf("%f",s[i]);
printf("\n");
}
(3)如何把5个浮点型数据变成10个整型数据,进行整型与整型之间的“异或”运算。
4个字节5个浮点型数据
图1
2个字节10个整型数据
图2
如图1,2,把一个浮点型数据变成2个整型数据,利用指针先把浮点型数据的地址赋给整型指针变量,表示为:
for(k=0;k<5;k++)
fread(&s[k],4,1,fp);
p=s;/*把浮点型数据的地址赋给整型指针变量*/然后以2个字节为1个整型数据,把它们赋给整型数组变量,共循环10次,可表示为:
for(i=0;i<10;i++)
Y[i]=*p++;/*把整型指针变量指向的内容赋给整型数组变量*/
形成的10个整型数据Y[10]分别与解密码b进行“异或”运算,变成10个新的整型数据z[10],可表示为:
for(l=0,j=0;l<10,j<10;l++,j++)
z[l]=Y[j]^b;/*整型数据与解密码进行异或运算*/
(4)整个程序的收尾完善阶段,最后把10个新的整型数据z[10],每2个合成1个浮点型数据,共5个u[5].
利用指针,把10个新整型数据的地址赋给浮点型指针变量,把浮点型指针变量指向的内容赋给浮点型数组变量,分别输出。
可表示为:
voidman(intw[],intm)
{
float*q,u[5];
inti;
q=w;/*把整型数据的地址赋给浮点型指针变量*/
for(i=0;i{
u[i]=*q++;/*把浮点型指针变量指向的内容赋给浮点型数组变量*/
}
printf("%f",u[i]);
printf("\n");
}
四、个人总结
为期一周的C语言程序设计结束了,仔细回想一下,在这一周的学习中,收获不少.
通过这次C语言课程设计,使我更进一步了解认识C语言这一门学科,他不仅仅是简单的设计编辑程序,他需要更深度的理论和完整准确的数据作为支撑点,每个程序的编译都要掌握其真正的操作价值,明确他的目的.这是智慧与逻辑的结合,考察我们的思维能力,锻炼我们的实际操作能力.通过这次C语课程设计,使我加深了对C语言的了解,也提高了C语言的应用能力。
这次课程任务设计,主要考察怎样打开并读取所给的文件的内容,如何使用调用函数,怎样对整形数据进行位的异或运算.在我做这次课设之前,对这些程序的运用还是很陌生,不知怎样才能更好的利用,也不理解什么时候该使用,但通过这次课设,经过查找资料,请教老师和同学,终于能够完成这项任务,并且掌握了运用方法,同时还增强了我的动手能力和逻辑思维,使我受益匪浅.
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、源程序
#include
voidmima()
{
intb;
FILE*fp;/*定义文件型指针变量*/
if((fp=fopen("d:
\\0009\\file09.dat","rb"))==NULL)
/*打开文件file09.dat*/
{
printf("cannotopenfile\n");
exit(0);/*终止程序*/
}
printf("jiemima");
printf("\n");
fread(&b,2,1,fp);/*阅读文件*/
printf("%d",b);/*输出整型数据*/
printf("\n");
fclose(fp);/*关闭文件*/
}
voidnowfloat()
{
inti;
intb;
floats[5];
FILE*fp;
if((fp=fopen("d:
\\0009\\file09.dat","rb"))==NULL)
/*打开文件file09.dat赋给fp*/
{
printf("cannotopenfile\n");
exit(0);
}
printf("mimaqiandefloat");
printf("\n");
fread(&b,2,1,fp);
for(i=0;i<5;i++)
{
fread(&s[i],4,1,fp);
printf("%f",s[i]);
printf("\n");
}
fclose(fp);
}
voidoldfloat()
{
inti,j,l,k;
intb;
intz[10];
intY[10];
int*p;
floats[5];
FILE*fp;
if((fp=fopen("d:
\\0009\\file09.dat","rb"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
printf("jiemihoudefloat");
printf("\n");
fread(&b,2,1,fp);
for(k=0;k<5;k++)
fread(&s[k],4,1,fp);
p=s;/*把浮点型数据的地址赋给整型指针变量*/
for(i=0;i<10;i++)
Y[i]=*p++;
/*把整型指针变量指向的内容赋给整型数组变量*/
for(l=0,j=0;l<10,j<10;l++,j++)
z[l]=Y[j]^b;/*整型数据与解密码进行异或运算*/
man(z,10);
fclose(fp);
}
voidman(intw[],intm)
{
float*q,u[5];
inti;
q=w;/*把整型数据的地址赋给浮点型指针变量*/
for(i=0;i{
u[i]=*q++;
/*把浮点型指针变量指向的内容赋给浮点型数组变量*/
printf("%f",u[i]);
printf("\n");
}
}
main()
{
while
(1)
{
intch;
gotoxy(1,1);/*窗口开始坐标函数*/
window(1,1,99,99);/*窗口结束坐标函数*/
printf("********welcometousejiemima*********\n");
printf(“*-----------zhangxueyingzhizuo----------*\n”);
printf("********************menu********************\n");
printf("*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*\n");
printf("*1>mima2>nowfloat*\n");
printf("*3>oldfloat4>exit(0)*\n");
printf("*---------------------------------------------------------*\n");
printf("Pleaseinputwhichyouwant(1-4):
");
ch=getch();
switch(ch)
{
case'1':
mima();break;
case'2':
nowfloat();break;
case'3':
oldfloat();break;
case'4':
exit(0);
default:
continue;
}
}
}