文件移位加密与解密系统C课程设计.docx
《文件移位加密与解密系统C课程设计.docx》由会员分享,可在线阅读,更多相关《文件移位加密与解密系统C课程设计.docx(18页珍藏版)》请在冰点文库上搜索。
文件移位加密与解密系统C课程设计
计算机学院计算机科学与技术专业
《程序设计综合课程设计》报告
(20010/2011学年第一学期)
学生姓名:
学生班级:
学生学号:
指导教师:
2011年 01月 08日
文
件
移
位
加
密
与
解
密
系
统
第一章.课程设计目的和要求
1.1设计目的:
1、提高程序设计和分析的能力。
2、深入了解c++程序设计的知识与技巧.
3、进一步掌握c++程序设计的思想.
4、初步了解程序加密与解密的思想.
1.2设计要求:
1、完整的理解课程设计任务的要求.
2、用C语言实现系统.
3、函数功能要划分好(结构化程序设计).
4、设计的程序结构完整、简明、可读性强.
5、界面友好(良好的人机交互),加必要的注释.
6、设计的程序调试成功,能稳定的运行.
7、提供程序测试方案.
8.列出参考的文献和完整的程序清单.
第二章.课程设计任务内容
设计一个文件加密与解密的程序,主要功能主要包括以下内容:
1.文件加密:
设计三种加密算法
2.文件解密。
3.实现主函数和子函数之间的参数传递.
第三章.详细设计说明
3.1模块描述
该模块是一个简单完整的程序,主要包括3个算法。
其功能是将某一已知文件的内容(仅限于英文字母)以字符形式读出,根据密钥或密码(用户从键盘输入)将对应字符进行加密、解密操作并输出结果。
3.2性能
(1)要求有较快的运算速度,能很快的执行函数功能;
(2)要求程序运行稳定,无误;
(3)要求程序有良好的人机互动.
3.3输入项
包括以下内容:
(1)要加密的字符窜s,其类型为string类型。
(2)加密密匙或密码key;其中密匙为int类型,密码为string类型。
(3)解密密匙或密码key1;
(4)执行操作与否的判断y/n;其类型为字符型。
所有的输入均有用户由键盘输入。
3.4输出项
包括以下内容:
(1)必要的提示数据:
中文和*号;
(2)已加密的密文和解密后的明文;其类型均为string类型.
所有输出项都由显示器输出。
3.5算法
就是明文的一个字符用相应的一个密文字符代替。
加密过程中是从明文字母表到密文字母表的一一映射。
例如:
加密:
设原文为abcdef,密钥为5,则有abcdef每个字母按字母表
移动5位(注:
z后接a)可得到密文(乱码)fghijkl;对该文件解密:
文件内容为fghijk1,密钥为5,则有fghijk1每个字母向前移动5位(注a后接z),可得到原文abcdef。
凯撒密码就是单表代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替,W由Z代替,X由A代替,Y由B代替,Z由C代替)。
单表代替密码是很容易破译的,因为它没有把明文的不同字母的出现频率掩盖起来。
可以使用统计攻击。
多表代替密码有多个单字母密钥,每一个密钥被用来加密一个明文字母。
第一个密钥加密明文的第一个字母,第二个密钥加密明文的第二个字母等等。
在所有的密钥用完后,密钥又再循环使用,若有20个单个字母密钥,那么每隔20个字母的明文都被同一密钥加密,这叫做密码的周期。
维吉尼亚密码是多表代替密码的例子。
例如:
加密时,将每个字符的ascll码依次反复加上“2011”(密码,由用
户自由输入)中的数字,并在32(‘‘)~122(’z')之间做摸运算。
算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码也叫换位密码。
如矩阵换位密码。
它的加密方法是将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。
行列换位法采用密钥,假设密钥是5,明文是IamaChineseboy那么就会以5位列数排成一个矩阵。
Iamac
hines
eboy
那么密文就是iheaibmnoaeycs×,最后一行不足的用随机字母填充,
(×代表那个随机字母)!
先加密后解密
N
Y
才【
N
Y
N
Y
Y
N
Y
N
Y
图3-5-1单表移位算法流程图
图3-5-2多表移位算法流程
(1)
图3-5-2多表移位算法流程图
(2)
图3-5-3置换算法流程图
(1)
图3-5-3置换算法流程图
(2)
图3-5-3置换算法流程图(3)
3.6函数主程序流程
Y
N
Y
N
Y
N
Y
Y
图3-6主函数流程图
3.7接口
本程序是一个独立的程序,并无上下接口。
3.8数据文件存储说明
本程序中数据皆为一次性数据,不进行数据的存储操作。
3.9注释设计
在各个变量和各个函数后都附加了注释。
3.10限制条件
本程序只适合vc++平台。
3.11测试计划
图3-11-1程序测试运行结果
图3-11-2程序测试运行结果
图3-11-3程序测试运行结果
图3-11-4程序测试运行结果
图3-11-5程序测试运行结果
图3-11-6程序测试运行结果
经过不同测试,本程序运行良好,运算速度基本达到要求。
第四章.软件使用说明
本程序仅适用于vc++平台,可以将某一已知文件的内容(仅限于英文字母)以字符形式读出,根据密钥(用户从键盘输入)将对应字符进行移位简单的加密、解密操作。
第五章.课程设计心得与体会
3周的程序设计就要结束了,我的设计成果也就要完成了。
回想这三周的学习设计历程,突然间想到了很多。
刚拿到设计题目的时候,觉得挺简单的,马上就有了思路,但当我真正去设计的时候才发现困难重重,突然间才意识到学到的知识太少了,真是“书到用时方恨少”。
当我明白自己的知识有多么匮乏时,我开始行动起来寻找帮助,图书馆,上网,问同学等等。
而在寻找帮助的过程中,我更是深深的意识到:
知识是无穷尽的!
在设计的过程中有很多的困难,有些通过上网查资料,问同学基本上能解决,但也有些困难解决不了。
这时候是老师给我指明了道路,让我豁然开朗。
现在想想,终于体会到了“导师”的含义。
程序设计完成后,最重要的任务是写程序报告。
这却是让我体会最深的。
首先,程序报告的格式让我明白了什么叫“最正确的”。
报告格式的内容很多,大大小小方方面面都要注意,
其实做人,做事也是如此,细节决定成败。
见微知著,报告格式的严谨也让我想到,如果学习有这么严谨的态度,怎会没有成就?
通过这次的程序设计,我学到了很多,也明白了很多。
最深的感触是:
“其实,人都是逼出来的!
”。
以前觉的课程设计那么难,怎么可能完成呢,现在成果就在眼前,突然发现自己的潜力有多么深,如果以前上课时都能这么努力,学习怎么可能不好?
这次的程序设计让我感到自己要学的还真的很多,也让我明白该如何去掌握如何学习新知识的能力。
以前一直觉得课本里的知识已经很够用了,现在才发现自己学到的真得太少,真的是见大海方知天地广。
还有就是知识的迁移能力太差了,明明就是课本上的知识却感觉棘手,
以后要重点培养自己的知识运用能力。
最后就是,发现学习知识的途径是很多的,并不是局限于学校,老师,其实,网络是一个巨大的资源库,合理利用会让我学到很多的知识。
总之,这次的程序设计让我看到了自己的差距,也明白了以后要努力的目标,真正体会到了学习的含义。
附录1:
参考文献
[1]C++语言程序设计作者:
谭浩强出版社清华大学出版社出版日期:
2004
[2]C++Primer中文版(第4版)作者:
StanleyB.Lippman,JoseeLajoie,BarbaraE.Moo译者:
李师贤蒋爱军梅晓勇林瑛出版社人民邮电出版社出版日期:
2006-03-31
[3]C++语言程序设计作者:
蒋爱军刘红梅王泳梁小萍出版社人民邮电出版社出版日期:
2008-05-29
[4]C++必知必会作者:
StephenC.Dewhurst译者:
荣耀出版社人民邮电出版社出版日期:
2010-11-15
[5]C++编程规范:
101条规则、准则与最佳实践作者:
HerbSutter,AndreiAlexandrescu译者:
刘基诚出版社人民邮电出版社出版日期:
2010-11-15
[6]写给大家看的C++书作者:
LarryUllman,AndreasSigner译者:
杨涛王建桥杨晓云出版社人民邮电出版社出版日期:
2009-06-15
附录2:
源代码
//Note:
YourchoiceisC++IDE
#include
#include
#include
#include
#include
usingnamespacestd;
voidShift();
voidVigenere();
voidPermutation();
intmain()
{
chari='0';
while(i!
='4')
{
cout<<"请选择您要进行的操作:
"<cout<<"********Press1~4tochoose:
********\n";
cout<<"1:
单表移位算法;"<cout<<"2:
多表移位算法;"<cout<<"3:
置换算法;"<cout<<"4:
退出;"<cout<i=getch();
if(i=='1')
{
cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<cout<<"您选择的是单表移位算法:
"<Shift();
cout<cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<}
elseif(i=='2')
{
cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<cout<<"您选择的是多表移位算法:
"<Vigenere();
cout<cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<}
elseif(i=='3')
{
cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<cout<<"您选择的是置换算法:
"<Permutation();
cout<cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<cout<}
elseif(i=='4')
{
cout<<"您选择退出."<break;
}
}
return0;
}
voidShift()
{
charc[100];
chars[100];
intlength,i=0,key=0;
//输入要加密的字符窜和密匙。
cout<<"请输入要加密的字符窜:
"<//cin.get();
gets(c);
strcpy(s,c);
length=strlen(c);
cout<<"请输入密匙:
";
cin>>key;
//验证密匙。
if(key<0)
{
cout<<"密匙输入错误!
"<cout<<"Pressanykeytoreturn...";
getchar();
return;
}
//加密过程。
for(i=0;i{
if(c[i]>96&&c[i]<123)
c[i]=(c[i]+key-97)%26+65;
elseif(c[i]>64&&c[i]<91)
c[i]=(c[i]+key-65)%26+65;
}
cout<<"加密完成!
密文为:
"<cout<//解密过程。
stringrsp;
cout<<"是否解密?
[yes]|[no]";
cin>>rsp;
if(!
rsp.empty()&&rsp[0]!
='n')
{
cout<<"解密完成!
原文为:
"<cout<
cout<}
else
cout<<"已确认,不需解密!
"<}
voidVigenere()
{
//输入要加密的字符串和密码。
stringp;
cout<<"请输入密码:
";
cin>>p;
conststringpassword=p;
cin.ignore(100,'\n');
strings,s1,s2;
cout<<"请输入要加密的字符串:
"<getline(cin,s);
//加密过程。
s1=s;
string:
:
size_typej=0;
for(string:
:
size_typei=0;i!
=s1.size();++i)
{
s1[i]+=password[j]-'0';
if(s1[i]>122)
{
s1[i]=s1[i]%122+32;
}
++j;
if(j==password.size())
{
j=0;
}
}
cout<<"加密后的字符串:
"<//解密过程。
stringrsp;
do{
cout<<"请输入解密密码:
";
stringpsw;
cin>>psw;
s2=s1;
for(i=0,j=0;i!
=s2.size();++i)
{
s2[i]-=psw[j]-'0';
if(s2[i]<32)
{
s2[i]=s2[i]+122-32;
}
++j;
if(j==psw.size())
{
j=0;
}
}
if(s2==s)
{
cout<<"解密成功,解密后的字符串:
"<};
if(s2!
=s)
{
cout<<"密码错误,解密失败!
"<}cout<<"More?
[yes]|[no]";
cin>>rsp;
}while(!
rsp.empty()&&rsp[0]!
='n');
}
//置换算法
#defineCODELEN256/*密文长度.*/
char*encode(char*dest,char*str,intkey)
{
inti,j,len,len2,n=0;
len=strlen(str);
if((len%key)!
=0)
{
len2=len+key-(len%key);
}
else
{len2=len;
}
srand(time(NULL));
for(i=len;istr[i]=(char)((rand()%26)+(rand()%1)*('A'-'a')+'a');
str[len2]=0;
for(j=0;jfor(i=0;idest[n++]=str[i*key+j];
dest[n]=0;
str[len]=0;
returndest;
}
char*decode(char*dest,char*str,intkey)
{
inti,j,len,n=0;
len=strlen(str);
if((len%key)!
=0)
returnNULL;
len=len/key;
for(i=0;ifor(j=0;j{
dest[n++]=str[j*len+i];
}
dest[n]=0;
returndest;
}
voidPermutation()
{
strings1,s2;
intkey,i,j,len;
charstr[CODELEN],s[CODELEN];
charxstr[CODELEN];
//输入要加密的字符窜和密匙。
cout<<"请输入要加密的字符窜:
"<gets(str);
strcpy(s,str);
cout<<"请输入密匙:
";
cin>>key;
cout<//输出原始铭文和加密密文。
cout<<"原始明文:
"<encode(xstr,str,key);
cout<<"加密密文:
"<//解密。
stringrsp;
cout<<"是否解密?
[yes]|[no]";
cin>>rsp;
if(!
rsp.empty()&&rsp[0]!
='n')
{
cout<<"解密完成!
"<cout<<"原文为:
"<
cout<}
else
cout<<"已确认,不需解密!
"<}