下载此文档

古典密码实验报告.docx


文档分类:建筑/环境 | 页数:约25页 举报非法文档有奖
1/25
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/25 下载此文档
文档列表 文档介绍
该【古典密码实验报告 】是由【guoxiachuanyue007】上传分享,文档一共【25】页,该文档可以免费在线阅读,需要了解更多关于【古典密码实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。实验报告
、实验室名称:
SimpleSPC信息安全云实验系统
二、实验项目名称:
古典密码——置换密码
三、实验学时:
1学时
四、实验原理:
1)算法原理
a)置换密码算法是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
置换密码(PermutationCipher),又称换位密码。算法实施时,明文的字母保持相同,但顺序会被打乱。置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。
设n为一固定整数,P、C和K分别为明文空间、密文空间和密钥空间。明/密文是长度为n的字符序列,分别记为X(x1,x2,…,xn)属于P和Y(y1,y2,…,yn)属于C,K是定义在{1,2,…,n}的所有置换组成的集合。对任何一个密钥(即一个置换),定义置换如下:
加密置换为:
丁心……—⑴丿
解密置换为:
上式中,是的逆置换,密钥空间K的大小为n!
2)算法参数
置换密码算法主要有c、m、k、n四个参数。c为密文,m是明文,k为密钥,n为模数。
3)算法流程
五、实验目的:
学****置换密码的原理
学****置换密码的算法实现
六、实验内容:
1•,根据提示输入明文和密钥,同时检查输出的解密后的结果是否与明文一致。
学****掌握置换密码的原理,并根据明文和密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
看懂实验程序代码,如有需要可在其上进行优化。
;..
七、实验器材(设备、虚拟机名称):
Windows7
工具:C:\tools、密码学课程\01密码学算法\02古典密码\01置换密码
八、实验步骤:
1、查看置换密码算法运行结果并学****其核心算法
【】选择对明文【asdfgh】使用密钥【qwerty】进行加密,程序运行结果。如下图所示
请鎮1人明文:.asdfgh
请输入密钥,要求是&位字母:呻曲讪加密后的结果为二sgadfh解密后的结果为:二asdfgh
CR¥PT_OK
:Jressanv)<eytocontinue
但是在实验中发现,当密钥中包含相同字符时,加密和解密结果会出现问题,如下图所示:
数母U11-倍字•JI文文继文为矍明键明度密的的功意
loueijalialiuji
在观察程序代码后,发现应该是加密表生成出现问题,因此在实验中我重新修改了程序中计算加密表部分的代码,利用双层循环,对于每一个字符,计算比其小的字符或者和它一样但是出现在其左侧的字符个数,得到的序列便是加密表的内容,将程序按照上述思路修改后测试运行正确。

#include〈iostream〉
#include〈algorithm>
usingnamespacestd;
chara[20][6],b[20][6],c[20][6],m[102],key[6],ky[6],mw[102],bb[102];
intzh[6],zh1[6];
intj,len,length,e,f;
void
ISD_zhihuan_zhihuan(intle)
{
;..
inti,s=0;
if(le%6==0)
//明文长度是6的倍数时
{
for(j=0;j<(le/6);j++)for(i=0;i<6;i++,s++)
{
a[j][i]=m[s];
}
}
else
//明文长度不是6的倍数时
{
for(j=0;j<((le-le%6)/6);j++)for(i=0;i<6;i++,s++)
{
a[j][i]=m[s];
}
j++;
intw=0;
for(intl=le-le%6;l<le;l++,w++)
{
a[j][w]=m[l];
}
for(intll=le%6;ll<6;ll++)
{
a[j][ll]='X';
//数组后补x使数组长度为6的倍数
}
}
length=6*j;
}
int
ISD_zhihuan_encrypt()
{
cout<<endl<<"请输入密钥,要求是6位字母:";cin>>key;
for(intp=0;p<6;p++)
{
ky[p]=key[p];
}
//生成置换表
for(inti=0;i<6;i++){zh[i]=1;
for(intj=0;j<6;j++){
if(key[j]<key[i]||(j<i&&key[j]==key[i])){zh[i]++;
}
}
;..
}
cout<<endl<<"加密后的结果为:";
intq=0;
for(intg=0;g<=j;g++)
for(inth=0;h<6;h++,q++){
b[g][h]=a[g][zh[h]—1];
//明文进行置换
bb[q]=b[g][h];cout〈〈bb[q];
}
return0;
}
intISD_zhihuan_decrypt()
{
intss[6]={1,2,3,4,5,6};
for(intw=0;w<6;w++)
{
for(intp=0;p<6;p++)
{
if(ss[w]==zh[p])zh1[w]=p+1;
//计算逆置换表
}
}
cout<<endl<〈"解密后的结果为:";
int
t=0;
for(intg=0;g<=j;g++)
for(inth=0;h<6;h++,t++)
{
c[g][h]=b[g][zh1[h]—1];
//明文进行逆置换mw[t]=c[g][h];
}
return0;
}
void
main()cout<<endl;
cout<<"请输入明文:";
intk=0;
cin>>m;
while(m[k]!='\0')
//计算明文长度
k++;
len=k;
cout<<"明文长度len="<<len<<endl;ISD_zhihuan_zhihuan(len);
ISD_zhihuan_encrypt();
;..
ISD_zhihuan_decrypt();
for(intd=0;d<len+6;d++)
cout〈〈mw[d];
//输出解密后的明文inty,yy;
for(yy=0;yy<len;yy++)
{
if(mw[yy]==m[yy])
y=1;
else
y=0;
}
if(y=1)
cout〈〈endl<<"CRYPT_0K"<<endl;
if(y=0)
cout<<endl<<"CRYPT_ERROR"<<endl;
}
九、实验结果及分析:
测试修改后的程序,结果正确,如下图所示
*青输入密钥,要求是6位字母:miduh
:evlyao:loveya
为为续rn-TTrn-L--^K-l557T£r结结键的的OK意IT任密密肝按加解CR请
面对结果进行分析:
对于输入的密钥miaooh
计算每个字符的加密置换表值为431562因此可获得加密结果为evlyao验证输出结果正确计算每个字符的解密置换表值为362145因此可获得解密结果为loveya
十、实验结论:
置换密码作为传统古典密码的一种,思想比较简单,即将明文按照密钥的长度一行一行地写成一个矩阵,然后每一行按密钥的顺序将明文读出获得的即为加密文。但是由于置换密码只是将明文简单地作顺序改变,字符并没有变化,因此破译起来比较容易,安全性较低。
十一、总结及心得体会:
作为第一个实验,熟悉了实验的操作环境,并学会了置换密码的原理,尝试对明文进行加密并将其解密。通过查看程序源码对加密方法了解更加透彻,在将源码进行修改后解决了密钥中包含相同字符结果出错的问题,收获很大,为以后其他加密算法的学****作准备。
实验报告
学生姓名
李昕宜
学号
201500130052
指导老师
实验地点
N3
实验时间
2018/3/19
班级
一班
一、实验室名称:
SimpleSPC信息安全云实验系统
二、实验项目名称:
古典密码Vigenere密码
三、实验学时:
1学时
四、实验原理:
1)算法原理
Vigenere密码是由法国密码学家BlaisedeVigenere于1858年提出的一种代换密码,它是多表代换密码的典型代表。
定义:设m为某一固定的正整数,P、C和K分别为明文空间、密文空间和密钥空间,并且P=K=C=(Z26)m,对一个密钥k=(k1,k2,…,km),定义维吉尼亚密码的加解密算法如下:
Vigenere密码加密算法:ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)
Vigenere密码解密算法:dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。
其中k=(k1,k2,…,km)是一个长为m的密钥字,密钥空间的大小为26m,所以对一个相对小的m,穷举密钥也需要很长的时间。如m=7,则密钥空间大小超过8X109,所以手工搜索非常困难。当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。
2)算法参数
Vigenere密码算法主要有c、m、k三个个参数。c为密文,m是明文,k为密钥。
3)算法流程
算法流程如下。如图所示
五、实验目的:
1)学****维吉尼亚算法的原理
2)学****维吉尼亚算法的实现
六、实验内容:
,根据提示输入明文和密钥,同时检查输出的解密后的结果是否与明文一致。
学****掌握维吉尼亚算法的原理,并根据明文和密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
看懂实验程序代码,如有需要可在其上进行优化。
七、实验器材(设备、虚拟机名称):
Windows7工具:C:\tools\密码学课程\01密码学算法\02古典密码\03vigenere密码算法
八、实验步骤:
一、查看维吉尼亚密码算法运行结果并学****其核心算法
【】,输入指令【V】,输入明文【xipuyangguang】,即可得到密钥和密文和明文,如图1所示
鲁输人指令
青输以待加密明文
Uigenere密码算袪演不
xipupangguang
:best
:^mhnzefzhpsgh
2弓文为:.***.
输蓉辭密,痕出趕序?
图1

根据实验中已给代码进行分析了解了维吉尼亚密码的实现步骤,将主程序中没有
用到的生命变量去掉,加入一些交互语句得到如下代码:
#include〈〉
#include〈〉
#include〈〉#include〈〉
#include<iostream〉usingnamespacestd;
voidISD_Vigenere_crypt(charm[],chark[],charr[])
{
inti,j,s=0;
j=strlen(k);
for(i=0;m[i];i++)
m[i]=tolower(m[i]);
for(i=0;k[i];i++)
k[i]=tolower(k[i]);
for(i=0;m[i];i++)
if(isalpha(m[i]))
{
r[i]=(m[i]-'a'+k[s%j]-'a')%26+'a';
;..
s++;
/*S用来跳过明文中的空格字符*/
}
else
r[i]=m[i];
r[i]=0;

古典密码实验报告 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息