文件移位加密与解密系统C课程设计.docx

上传人:b****3 文档编号:11222255 上传时间:2023-05-29 格式:DOCX 页数:18 大小:25.83KB
下载 相关 举报
文件移位加密与解密系统C课程设计.docx_第1页
第1页 / 共18页
文件移位加密与解密系统C课程设计.docx_第2页
第2页 / 共18页
文件移位加密与解密系统C课程设计.docx_第3页
第3页 / 共18页
文件移位加密与解密系统C课程设计.docx_第4页
第4页 / 共18页
文件移位加密与解密系统C课程设计.docx_第5页
第5页 / 共18页
文件移位加密与解密系统C课程设计.docx_第6页
第6页 / 共18页
文件移位加密与解密系统C课程设计.docx_第7页
第7页 / 共18页
文件移位加密与解密系统C课程设计.docx_第8页
第8页 / 共18页
文件移位加密与解密系统C课程设计.docx_第9页
第9页 / 共18页
文件移位加密与解密系统C课程设计.docx_第10页
第10页 / 共18页
文件移位加密与解密系统C课程设计.docx_第11页
第11页 / 共18页
文件移位加密与解密系统C课程设计.docx_第12页
第12页 / 共18页
文件移位加密与解密系统C课程设计.docx_第13页
第13页 / 共18页
文件移位加密与解密系统C课程设计.docx_第14页
第14页 / 共18页
文件移位加密与解密系统C课程设计.docx_第15页
第15页 / 共18页
文件移位加密与解密系统C课程设计.docx_第16页
第16页 / 共18页
文件移位加密与解密系统C课程设计.docx_第17页
第17页 / 共18页
文件移位加密与解密系统C课程设计.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

文件移位加密与解密系统C课程设计.docx

《文件移位加密与解密系统C课程设计.docx》由会员分享,可在线阅读,更多相关《文件移位加密与解密系统C课程设计.docx(18页珍藏版)》请在冰点文库上搜索。

文件移位加密与解密系统C课程设计.docx

文件移位加密与解密系统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;i

str[i]=(char)((rand()%26)+(rand()%1)*('A'-'a')+'a');

str[len2]=0;

for(j=0;j

for(i=0;i

dest[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;i

for(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<<"已确认,不需解密!

"<

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2