凯撒加密解密C语言课程设计.docx
《凯撒加密解密C语言课程设计.docx》由会员分享,可在线阅读,更多相关《凯撒加密解密C语言课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
凯撒加密解密C语言课程设计
C语言程序设计课程设计(论文)
题目凯撒加密解密课程设计
院(系):
专业班级:
学号:
学生姓名:
指导教师:
教师职称:
起止时间:
课程设计(报告)任务及评语
院(系):
软件学院
教研室:
软件教研窒
学号学生姓名专业班级
程序设计
(报告)
题目
凯撒加密解密课程设计
程序设计的任务与要求:
(1)掌握C语言编程的基础知识。
(2)较熟练地编写C语言应用程序。
程序设计—报告}任务
(3)了解C语言的常用标准函数、编程技巧、异常处理。
(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。
(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩
指导教师签字:
2011
年12月22日
第1章课程设计的目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1程序功能介绍2
2.2程序整体设计说明3
2.1设计思路3
2.2.2数据结构设计及用法说明4
2.换位解密流程图6
3.替代加密流程图7
4.替代解密流程图8
2.2.3程序结构(流程图)5
2.2.4各模块的功能及程序说明10
2.2.5程序结果10
2.3程序源代码及注释12
第3章课程设计总结18
参考资料19
第1章课程设计的目的与要求
1.1课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
1.2课程设计的实验环境
硬件要求能运行Windows2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3课程设计的预备知识
熟悉C语言及C语言开发工具。
1.4课程设计要求
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
第2章课程设计内容
2.1程序功能介绍
文件加密与解密
(1)问题描述
1数据的输入和输出;要求使用文件操作。
文件(明文,仅限于英文字母)存放在某一已知文本文件中,加密后的文件(密文)存放在另一文件中。
2换位加密和解密:
加密:
根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:
输入密文后再输入移位位数则可输出明文;
3凯撒加密和解密:
加密:
根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:
输入密文后再输入移位位数则可输出明文;
4统计单词的个数;
5退出。
(2)功能要求
1系统以菜单方式工作;菜单形式不限。
2界面比较美观。
3要有一定的容错能力,比如说输入一个不存在的菜单项编号。
(3)算法分析
注:
(1)换位加密的原理:
它把明文中的字母重新排列,本身不变,但位置变了,换位密码是靠重新安排字母的次序,而不是隐藏他们。
首先将英文句子中的空格去除,然后将句子排成若干行,每行的字符数为换位位数,再按列输出即为密文,不足部分填入a,b,c…。
例如英文Canyoucomehere若换位位数取4,则形成矩阵
cany
ouco
mehe
reab
则密文为comraueenchayoeb,其中矩阵中的红色a和b是由于不足而填入的。
(2)替代密码原理:
通过将字母按顺序推后n位起到加密作用,如果n=3,则将字母A换作字母D,将字母B换作字母E。
X变成A,丫变成B,Z变成C,x变成a,y变成b,z变成c。
假如有这样一条指令:
Canyoucomehere
用凯撒密码加密后就成为:
FdqBrxFrphkhuh
2.2程序整体设计说明
(1)数据的输入和输出;要求使用文件操作。
文件(明文,仅限于英文字母)存放在某一已知文本文件中,加密后的文件(密文)存放在另一文件中。
(2)换位加密和解密:
加密:
根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:
输入密文后再输入移位位数则可输出明文;
(3)凯撒加密和解密:
加密:
根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:
输入密文后再输入移位位数则可输出明文;
(4)统计单词的个数;
(5)退出。
2.1设计思路
(各模块功能说明,如函数功能、入口及出口参数说明,函数调用关系描述等
这块大家问题最多了,这里不是写程序代码,而是写流程图里面各个主要函数的作用,函数之间关系的说明。
222数据结构设计及用法说明
魔方阵
(1)问题描述
把整数1到n2排成一个n沟方阵,使方阵中的每一行,每一列以及对角线上的数之和
都相同。
1n阶魔方阵的产生;生成后的魔方阵要写入文件。
2最大值的位置;
3指定行的排序,排序方法不限;
4求素数;
5求完数;
6求水仙花数;
7退出。
(2)功能要求
1系统以菜单方式工作;菜单形式不限。
2界面比较美观。
3要有一定的容错能力,比如说按行排序是输入一个不存在的行号,输入的魔方阵阶数为偶数等。
(3)算法分析
如n为奇数,魔方阵可按下述方法构成:
(1)把1填在第一行的正中间,然后填入后续的数;
(2)若数k填在第i行第j列的格子中,那么k+1应填在它的左上方,即第i-1行第j-1列的那个格子中,如果左上方无格子,即:
若i-1为0,那么填在第n行第j-1列的格子中;若j-1为0,那么填在第i-1行第n列的格子中;若i-1和j-1都为0,那么填在第n行第n列的格子中。
(3)若按
(2)的方法找到的格子中已填过数了,那么数k+1改填在第k个数的正
下方。
即填在第i+1行和第j列的那个格子中。
223程序结构(流程图)
开始
图2.2.3
1.换位加密流程图流程图
(对流程图加以说明。
可以把关键语句放在此处,加以注释说明)建立mingwen.txt和miwen.txt文件
输入密钥n
输入明文到数组r
k=strlen(r)j计算数组r长度
Ifori=0tokfputc(r[i],mingwen)将明文存放到
mingwen.txt文件中
关闭并保存mingwen.txt文件
打开mingwen.txt文件
space(h,r)将明文去空格并放到数组h中
m=strlen(h)计算数组h长度
m%n==0'
是
否
hang=m/n
hang=m/n+1j=0
for
fori=mtohang*r
i=0
tohang
for
forj=0to
h[i]='a'+j
'zl[i][j]=h[z]z++
i=0ton
j++
fori=0to
hz=0
arfgrj=oton
zl[i][j]=h[z]
厶■■
forj=0tohang
he[z]=zl[j][i]1
输出he[z]
z++
fputc(zl[j][i],miwen)
fclose()关闭并保存mingwen.txt文件
fclose()关闭并保存miwen.txt文件
清屏返回菜单
2、换位解密流程图
流程图
(对流程图加以说明。
可以把关键语句放在此处,加以注释说明)建立mingwen.txt和miwen.txt文件
输入密钥n
输入明文到数组r
k=strlen(r)j计算数组r长度
1fori=0tok
fputc(r[i],miwen)将密文存放到
miwen.txt文件中
关闭并保存miwen.txt文件
打开miwen.txt文件
space(h,r)将明文去空格并放到数组h中
m=strlen(h)计算数组h长度
是
m%n==O
hang=m/nhang=m/n+1j=0
fori=0toni=mtohang*n
he[z]=zl[j][i]输出he[z]
z++
fputc(zl[j][i],mingwen)
fclose(mingwen)件
关闭并保存mingwen.txt文
fclose(miwen)
关闭并保存miwen.txt文件
清屏返回菜单
3.替代加密流程图
流程图
(对流程图加以说明。
可以把关键语句放在此处,加以注释说明)
建立mingwen.txt和miwen.txt文件
ch=getchar()接收回车字符
Ch=getchar()开始输入明文
当c
h!
='\n'
fputc(ch,mingwen)将明文放到
mi=gwehax()文件中
fclose(mingwen))关闭并保存
mingwen.txt文件
输入密钥
直到!
(i>=0&&i<=26)成立
打开mingwen.txt文件
ch=fgetchar(mingwen)开始从明文中读出字符
当ch!
=EOF
(ch>='a*&&cfi<=^z:
)l|(Gh>='A'&&ch<='Z:
/
ch=ch+i;
ch=ch-26
fputc(ch,miwen)
输出ch
ch=fgetc(mingwen)
fclose(mingwen)关闭并保存mingwen.txt文
件
fclose(miwen);关闭并保存miwen.txt文
件
清屏返回菜单
4.替代解密流程图
流程图
(对流程图加以说明。
可以把关键语句放在此处,加以注释说明)建立mingwen.txt和miwen.txt文件
ch=getchar()接收回车字符
Ch=getchar()开始输入明文
当c
h!
='\n'
fputc(ch,mingwen)将明文放到
mi=gwtchax()文件中
fclose(mingwen))关闭并保存
mingwen.txt文件
输入密钥i
直到!
(i>=0&&i<=26)成立
打开mingwen.txt文件
ch=fgetchar(mingwen)开始从明文中读出字符
当ch!
=EOF
:
>=a&&a<^:
:
/
ch=ch+i;
ch=ch+26
fputc(ch,mingwen)
输出ch
ch=fgetc(miwen)
fclose(mingwen)关闭并保存mingwen.txt文
件
fclose(miwen);关闭并保存miwen.txt文
件
清屏返回菜单
224各模块的功能及程序说明
1文件操作时打开的文件应该及时关闭,不然不会保存,在下次打开时就读不到以前存放在该文件里面的数据,而编译时却不会提示有错误。
2.函数调用时,被调函数必须在前面声明或者写在调用函数的上面,不然在编译时也不会提示错误,程序却不能执行。
3.空格的去除;采用指针的方法将去除空格的字符串放到另一个数组中菜单函数的
容错;用default:
system("cls");caidan();实现。
加密解密后返回主菜单;在每个函数后面加ch=getchar();ch=getchar();system("cls");caidan();第一个h=getchar()接收回车
字符,第二个ch=getchar()使屏幕上的显示暂停,并实现返回主菜单的操作。
2.2.5程序结果
1:
换位加密源码:
Ceshijieguo
密钥:
4
运行结果:
Cigejusiohea
"C:
\U5e说Admini?
tr^tor\De
请输入密钥
I请输入明文
Cesltiji_egnn
Cigejusiohea
密究也可查
-Center键返回主菜单
2换位解密
源码:
Cigejusiohea密钥:
4
运行结果:
Ceshijieguoa
文oh
人.晋疋iJ输沪文"请4请ci明ICG
3凯撒加密
源码:
Ceshijieguo密钥:
4
运行结果:
Giwlmnmikys
*'CAUser^\Administr-ator\Des
Ceshijiequo
请蔬人密钥(旷
4
密文是;_
Giwinnnikys
花也口Sl^miwen.txt
回主菜单
4:
凯撒解密
源码:
Giwlmnmikys
密钥:
4
运行结果:
Ceshijieguo
"CAUser^Administratcir\D"b
请输入密文
Giulmnnikys
请编人密钿〔旷“)
明文是:
Ce£hiji^guo
明也可查看m>n9uen-txt
按酱ntei*键返回壬菜单
5.明文统计
'C:
\User5\Adminisirdto-r\C
6.密文统计
'C:
\User^XAdministratob
苕文中有4个单词。
安"饥丁建逍向主菜单
2.3程序源代码及注释
此处需要些出你的源程序代码,以及对主要代码的一些功能或作用说明。
#include
#include
#include
chara[]={"mingwen.txt"},b[]={"miwen.txt"};
//欢迎界面
welcome。
{
printf("\n\n\n\n\n\n\n\n\n\t\t****************************************、n\n")
printf("\t\t\t简朴寨加密解密欢迎您\n\n");
printf("\t\t****************************************\n")・
printf("\n\n\n\n\n\n\t\t\t\t\t\t\t电信101班陈仁波\n");
//退出界面
}
byebye()
{printf("\n\n\n\n\n\n\n\n\n\t\t**************************************\n")・printf("\t\t**************************************\n\n");
printf("\t\t\t\t欢迎使用\n\n");
printf("\t\t**************************************\n")・
printf("\t\t**************************************\n")・
}
//退出菜单
tuichu()
{chartc;
printf("\n\n\n\n\n\n\n\n\n\t\t********************************************\n\n");
printf("\t\t\t\t确定退出?
?
?
\n\n");
printf("\t\t\t确定请按丫,取消请按N\n\n");
printf("\t\t********************************************\n")・
tc=getchar();
tc=getchar();
if(tc=='n'||tc=='N')
{
system("cls");
caidan();
}
elseif(tc=='y'||tc=='Y')
{
system("cls");
byebye();
}
else
{system("cls");
tuichu();
}
}
char*space(char*a,char*b)//去空格
{
char*c=a;
intn=0;
while(*b!
='\0')
{
if(*b!
='')
{
*c=*b;
n++;
c++;
}
b++;
}
*c='\0';
}
transpen()//换位加密
{
FILE*mingwen,*miwen;
inti,j,n,m,k,z=0,hang;
charch;
charr[1000],h[100],zl[10][10],he[100];
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");exit(O);
}
printf("请输入密钥\n");
seanf("%d",&n);
printf("请输入明文\n");
ch=getchar();
gets(r);
k=strlen(r);
for(i=0;ifputc(r[i],mingwen);
fclose(mingwen);
if((mingwen=fopen(a,"r"))==NULL){printf("不能打开文件\n");exit(0);
}
space(h,r);
m=strlen(h);
if(m%n==0)
{
hang=m/n;
for(i=0;i{
for(j=0;j{
zl[i][j]=h[z];
z++;
}
}
}
else
{
hang=m/n+1;j=0;
for(i=m;i<(hang*n);i++)
{
h[i]='a'+j;
j++;
}
for(i=0;i{
for(j=0;j{
zl[i][j]=h[z];
z++;
}
}
}
z=0;
for(i=0;ifor(j=0;j{
he[z]=zl[j][i];
printf("%c",he[z]);
z++;
fputc(zl[j][i],miwen);
}
printf("\n");
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("密文请查看miwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();
system("cls");
caidan();
}
caesaren()//凯撒加密
{
FILE*mingwen,*miwen;
charch;
inti;
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0)
}
printf("请输入密文\n");
ch=getchar();
ch=getchar();
while(ch!
='\n')
{
fputc(ch,mingwen);
ch=getchar();
}
fclose(mingwen);
do
{
printf("请输入密钥(0~26)\n");
seanf("%d",&i);
}
while(!
(i>=0&&i<=26));
if((mingwen=fopen(a,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(mingwen);
while(ch!
=EOF)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
ch=ch+i;
if(ch>'Z'&&ch<='Z'+i||ch>'z')
ch=ch-26;
}
fputc(ch,miwen);
printf("%c",ch);
ch=fgetc(mingwen);
}
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("密文请查看miwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();ch=getchar();
system("cls");
caidan();
}
caesarde()//凯撒解密
{
FILE*mingwen,*miwen;
charch;
inti;
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
printf("请输入密文\n");
ch=getchar();
ch=getchar();
while(ch!
='\n')
{
fputc(ch,miwen);
ch=getchar();
}
fclose(miwen);
do
{
printf("请输入密钥(0~26)\n");
scanf("%d",&i);
}
while(!
(i>=0&&i<=26));
if((miwen=fopen(b,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(miwen);
while(ch!
=EOF)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
ch=ch-i;
if(ch<'a'&&ch>='a'-i||chv'A')
ch=ch+26;
}
fputc(ch,mingwen);
printf("%c",ch);
ch=fgetc(miwen);
}
fclose(mingwen);
fclose(miwen);
printf