《MIS系统软件》实验报告操作系统Word下载.docx
《《MIS系统软件》实验报告操作系统Word下载.docx》由会员分享,可在线阅读,更多相关《《MIS系统软件》实验报告操作系统Word下载.docx(47页珍藏版)》请在冰豆网上搜索。
密钥k=k1k2k3…kn,对应密文c=c1c2c3…cn,密文为:
ci=(mi+ki)mod26,26个字母的序号依次为0~25,ci,mi,,ki是分别是密文明文密钥中第i个字母的序号。
④转换加密方法
通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。
或者通过给出一个密钥字符串,将明文按密钥字符串长度按顺序分为若干组字符串,再按照密钥字符串各个字符的顺序形成密文,并分析给出解密的方法。
3、主要仪器设备及耗材
实验室提供计算机和上网条件,C语言上机环境。
4、实验方案与技术路线(综合性、设计性实验)
第二部分:
实验过程记录
实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)
1.单表置换:
先选定一个单词,例如BEIJINGTSINGHUA,然后将它排列在密码对照表(两行26列第一行存a到z的字母,第二行存对照的密码)下方,重复出现的字母以第一次现时对应的明文字母为准;
后面以该单词中未出现的字母按顺序排列备齐,生成一个密码,然后可以用此密码本进行加密或解密。
加密过程:
首先输入加密明文如important,然后输入密钥如BEIJINGTSINGHUA。
再然后建立临时密码表如下:
(上一行是字母,下一行是密码)
之后,将important对照第一行的相应密匙如i对应H,依次输出。
结果应为HDLKOQBFQ;
解密过程:
首先输入密文如HDLKOQBFQ,然后输入密匙BEIJINGTSINGHUA。
同理加密过程,可以对照密码表依次找到密文中对应的原文。
结果应为important。
2.凯撒密码:
把英文字母按字母表的顺序编号作为明文,将密钥定为m,加密算法为将明文加上密钥m,得到密码表,通过相反的过程由密文得到明文。
首先输入明文为Thisisasecret,然后输入密钥9,之后同样会形成两行对应的同1方法一样的密码表:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
之后,将自动输出加密后的密文,结果为:
cqrb!
rb!
j!
bnlanc;
输入需要解密的密文如:
bnlanc,然后输入密钥9(为简便起见,同加密过程使用同样的密钥),则得到加密过程中的同样密码表,然后依次对应输出原文,结果为Thisisasecret。
3.轮转法:
通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。
首先输入明文itcanallowstudentstogetcloseupviews,然后输入密匙5,之后输入的明文会按照每行3个字符的形式进行排列,如此例中形成如下的排列:
之后,输出加密后的密文则使用先列后行的方法,此例结果为:
iasngovtlttesiclusteeaodtcuwnweolps;
解密过程:
首先输入密文icteccnrbouicumsanb,然后输入密匙5,之后同样会将输入的密文按照每行3个字符的形式排列,形成如下排列:
icbca
ccoun
tnumb
eris
之后,输出解密后的明文使用先列后行的方法,此例结果为icbcaccountnumberis。
4.维吉利亚密码:
假设明文m=m1m2m3…mn;
ci=(mi+ki)mod26,26个字母的序号依次为0~25,ci,mi,,ki是分别是密文明文密钥中第i个字母的序号。
(如下图)
加密过程:
首先输入明文如information,然后输入密匙如star,第一个字符的密文可以求得c1=(w+i)mod26=4,,此时对应编号4的字母为E,则明文W对应的密文为E,依次类推,可以将所有明文加密得到密文:
AGFFJFAKAHN;
首先输入密文esioqgm,然后输入与密文字符数相等的密匙如iloveyu,将加密过程的原理反过来运用,如第一个密文字符为E,则对应的编号为4,然后求的明文为W,依次类推,求得明文为:
whutmis。
第三部分结果与讨论(可加页)
实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)
程序设计类实验:
包括原程序、输入数据、运行结果、实验过程发现的问题及解决方法等;
分析与设计、软件工程类实验:
编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。
系统实施部分要求记录核心处理的方法、技巧或程序段;
其它实验:
记录实验输入数据、处理模型、输出数据及结果分析
运行结果分析:
在vc++6.0的编译环境下,点击运行后出现加密算法选择的界面:
(1)凯撒密码
选择1后回车,阅读完介绍性文字后,再接着选择1进行对输入字符串进行加密(例如输入字符串"
******'
sbirthdayis"
,接着输入密钥7):
得到密文:
govbephv(z!
ipyaokhf!
pz!
此时我为了对一段字符串进行凯撒解密"
"
,同时输入密钥7,同样会得到加密前的明文:
(2)单表置换密码
按照提示,回车后又进入加密算法选择主界面,此时选择2.单表置换密码,加密下面一句话todayisapril1,2012,namelyAprilfool'
sday:
得到密文pjuzvenzkmed1,2012,gzfxdvAkmedijjd'
nuzv,(没有处理空格及标点符号等特殊字符,但加密效果已有)。
为了证明对应的解密是否正确,现进行解密环节,把刚才密文解密,从截图中可以看到当时加密使用的密钥时zhouxiaoyeah
解密后的字符串跟之前原明文完全一样。
(3)维吉利亚密码
维吉利亚密码由于需要产生一个维吉利亚字母代换表,此处为了学习方便,在程序运行过程中特意将该表也打印到了屏幕:
输入明文:
guoqingjiekuaile,密钥:
whutms(此例为课件上一例子)
选择解密过程,帮刚才的密文重新翻译成明文:
(4)轮换算法
主要函数介绍
凯撒密码:
voidkaisa_de();
//解密
voidkaisa_en();
//加密
void_kaisa();
调用上面两个子函数
单表置换加密:
voiddbzh_alphabeta();
//产生代换字符表
voiddbzh_en();
//产生密文,即加密
voiddbzh_de();
//产生明文,即解密
void_danbiaozhihuan();
被main()调用,运行时根据选择调用上面的三个函数
维吉利亚密码:
voidwjly_en();
维吉利亚加密函数
voidwjly_de();
解密函数
int_weijiliya();
调用加密解密函数
轮换法加密:
voidlunhuan_en();
voidlunhuan_de();
void_lunhuan();
实验中的问题
(1)各个加密函数之间的基本上完全独立,内部定义了太多的自己变量,从空间上看运行起来占用空间较大。
可以尝试定义几个全局变量,让他们共用。
如输入的密文,密钥,产生的明文等等。
(2)操作不够人性化。
由于时间的原因,没有在程序的界面上话太多工夫,比如运行完加密或者解密过程后,该转到第一个主界面(四个加密算法的选择界面)还是仍然留在当前密码方法的界面,退出时时直接退出控制台程序还是退出到开始界面。
此外,程序的容错处理还不完善,一下非法输入还不能很友好的处理。
操纵的人性化
四种加密算法源代码:
#include<
iostream>
string>
ctype.h>
conio.h>
stdlib.h>
usingnamespacestd;
#defineMING_WEN1000//设明文长度最大为1000
charmingwen[MING_WEN];
//存放明文
charmiwen[MING_WEN];
//存放密文
charmiyuejvzi[100];
//密钥句子
charalphabeta[27];
//代换字母表
stringstr="
abcdefghijklmnopqrstuvwxyz"
;
//产生密文
voidCreate_miyuejvzi(char);
voidmain()
{
intchoice;
printf("
\n"
);
//起始输出界面
-----------------------------------------\n"
信息管理与信息系统**班\n\n"
**学号:
0120903490**\n"
while
(1)/*循环测试*/
{
printf("
\n"
*****************************************\n"
|加密解密方法\n"
|1、凯撒密码\n"
|2、单表置换\n"
|3、维吉利亚密码\n"
|4、轮换法\n"
|5、退出\n"
----------------------------------------\n"
请输入1--5进行选择:
scanf("
%d"
&
choice);
while(choice>
5||choice<
=0)//如果输入数字不符要求,重新输入,直至正确为止
{
printf("
\n请输入选项前面的编号:
scanf("
}
switch(choice)//调用不同的解密加密算法
case1:
_kaisa();
break;
//凯撒密码
case2:
_danbiaozhihuan();
//单表置换密码
case3:
_weijiliya();
//维吉利亚密码
case4:
_lunhuan();
//轮换法
case5:
exit(0);
//退出程序
system("
pause"
/*暂停*/
cls"
/*清屏*/
}
}
//凯撒密码
void_kaisa()
do
CLS"
\t\t凯撒加密\n\t\t\t请选择操作:
\t\t\t1.加密\n\t\t\t2.解密\n\t\t\t3.退出\n"
____________________________________________________________________\n"
%15c"
'
'
注:
----恺撒密码按c=(m+9)%%26加密----\n"
%19c"
----除字母其他字符均按c=(m+1)%%26加密----\n"
----当其他其它字符+1为字母时+26跳过字母加密----\n"
----当其他其它字符+1超出ASCII码表示范围时-128循环表示----\n"
getchar();
if(choice==1)
kaisa_en();
break;
elseif(choice==2)
{
kaisa_de();
elseif(choice==3)
\n%33c"
3:
退出\n"
exit(0);
else
输入错误,按任意键继续:
getchar();
system("
}while(choice!
=1||choice!
=2);
//凯撒加密
voidkaisa_en()//加密
intleng,i,miyue;
charchc[MING_WEN],chp[MING_WEN];
请输入你要加密的明文:
%28c"
gets(chc);
请输入密钥(如数字9):
scanf("
miyue);
leng=strlen(chc);
密文:
for(i=0;
i<
leng;
i++)
if(isupper(chc[i]))
if(chc[i]+miyue>
'
Z'
)
{
chp[i]=chc[i]+miyue-26;
printf("
%c"
chp[i]);
}
else
chp[i]=chc[i]+miyue;
elseif(islower(chc[i]))
z'
chp[i]=chc[i]+1;
if(chp[i]=='
A'
||chp[i]=='
a'
)//遇到+1为字母时的处理
chp[i]+=26;
elseif(chp[i]>
127)//遇到+1超出ASCII码表示范围时
chp[i]=char(chp[i]-128);
//凯撒解密
voidkaisa_de()//解密
请输入你要解密的密文:
明文:
if(chc[i]-miyue<
chp[i]=chc[i]-miyue+26;
chp[i]=chc[i]-miyue;
chp[i]=chc[i]-1;
)//遇到-1为字母时的处理
chp[i]-=26;
elseif(chp<
0)//遇到-1超出ASCII码表示范围时
chp[i]=char(chp[i]+128);
/////单表置换加密
void_danbiaozhihuan()
{
system("
\t\t单表置换加密\n\t\t\t请选择操作:
if(choice==1)
请输入你想加密的字符串(请不要超出%d个字符,不能输入中文):
MING_WEN);
gets(mingwen);
你输入的明文是:
%s\n"
mingwen);
intmingwen_length=strlen(mingwen);
//明文长度
dbzh_alphabeta();
dbzh_en();
if(choice==2)
请输入你想解密的字符串:
gets(miwen);
你输入的密文是:
miwen);
intmiwen_length=strlen(miwen);
//密文长度
dbzh_de();
//单表置换产生代换字符表
voiddbzh_alphabeta()
inti,j;
请输入密钥句子,至少为1个字符,最多100个字符,且第一个字符必须是小写字母:
gets(miyuejvzi);
//输入的密钥句子,至少为1个字符,最多100个字符,且第一个必须为字母
%s"
miyuejvzi);
intlength=strlen(miyuejvzi);
intpos=0;
//指示填充位置
inttag=1;
//
alphabeta[0]=miyuejvzi[0];
//填充第0个位置
for(i=1;
length;
if(isalpha(miyuejvzi[i])!
=0)//是字母
tag=1;
for(j=0;
j<
=pos;
j++)
if(alphabeta[j]==miyuejvzi[i])//alphabet表中已经存在字母miyuejvzi[i]
{
tag=0;
break;
}
if(tag==1)
alphabeta[++pos]=miyuejvzi[i];
26;
i++)//把英文字母表中还没有出现在代换字母表中的字母存入代换字母表
{
tag=1;
for(j=0;
if(alphabeta[j]==str[i])//alphabet表中已经存在英文字母表中的第i个字母
tag=0;
break;
if(tag==1)
alphabeta[++pos]=str[i];
cout<
<
原始字母表为"
str<
endl;
代换密码表为"
alphabeta<
//单表置换加密
voiddbzh_en()//产