古典密码实验报告.docx
《古典密码实验报告.docx》由会员分享,可在线阅读,更多相关《古典密码实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
古典密码实验报告
实验报告
一、实验室名称:
SimpleSPC信息安全云实验系统
二、实验项目名称:
古典密码——置换密码
三、实验学时:
1学时
四、实验原理:
1)算法原理
a)置换密码算法就是不改变明文字符,而就是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。
将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
其解密过程就是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
b)置换密码(PermutationCipher),又称换位密码。
算法实施时,明文的字母保持相同,但顺序会被打乱。
置换只不过就是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。
每个置换都有一个与之对应的逆置换Dk。
置换密码的特点就是仅有一个发送方与接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。
它就是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。
c)设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)学习置换密码的原理
2)学习置换密码的算法实现
六、实验内容:
1、在虚拟机上运行置换密码、exe可执行文件,根据提示输入明文与密钥,同时检查输出的解密后的结果就是否与明文一致。
2、学习掌握置换密码的原理,并根据明文与密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
3、瞧懂实验程序代码,如有需要可在其上进行优化。
七、实验器材(设备、虚拟机名称):
Windows7
工具:
C:
\tools\密码学课程\01密码学算法\02古典密码\01置换密码
八、实验步骤:
1、查瞧置换密码算法运行结果并学习其核心算法
1、1 点击【置换密码、exe】,选择对明文【asdfgh】使用密钥【qwerty】进行加密,程序运行结果。
如下图所示
但就是在实验中发现,当密钥中包含相同字符时,加密与解密结果会出现问题,如下图所示:
在观察程序代码后,发现应该就是加密表生成出现问题,因此在实验中我重新修改了程序中计算加密表部分的代码,利用双层循环,对于每一个字符,计算比其小的字符或者与它一样但就是出现在其左侧的字符个数,得到的序列便就是加密表的内容,将程序按照上述思路修改后测试运行正确。
1、2 更新后的置换密码的核心算法如下所示。
#include
#include
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{
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<";
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]zh[i]++;
}
}
}
cout<";
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<}
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<";
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<cout<<"请输入明文:
";
intk=0;
cin>>m;
while(m[k]!
='\0')
//计算明文长度
k++;
len=k;
cout<<"明文长度len="<ISD_zhihuan_zhihuan(len);
ISD_zhihuan_encrypt();
ISD_zhihuan_decrypt();
for(intd=0;dcout<//输出解密后的明文
inty,yy;
for(yy=0;yy{
if(mw[yy]==m[yy])
y=1;
else
y=0;
}
if(y=1)
cout<if(y=0)
cout<}
九、实验结果及分析:
测试修改后的程序,结果正确,如下图所示:
下面对结果进行分析:
对于输入的密钥miaooh
计算每个字符的加密置换表值为431562
因此可获得加密结果为evlyao验证输出结果正确
计算每个字符的解密置换表值为362145
因此可获得解密结果为loveya
一十、实验结论:
置换密码作为传统古典密码的一种,思想比较简单,即将明文按照密钥的长度一行一行地写成一个矩阵,然后每一行按密钥的顺序将明文读出获得的即为加密文。
但就是由于置换密码只就是将明文简单地作顺序改变,字符并没有变化,因此破译起来比较容易,安全性较低。
一十一、总结及心得体会:
作为第一个实验,熟悉了实验的操作环境,并学会了置换密码的原理,尝试对明文进行加密并将其解密。
通过查瞧程序源码对加密方法了解更加透彻,在将源码进行修改后解决了密钥中包含相同字符结果出错的问题,收获很大,为以后其她加密算法的学习作准备。
实验报告
学生姓名
李昕宜
学号
2
指导老师
实验地点
N3
实验时间
2018/3/19
班级
一班
一十二、实验室名称:
SimpleSPC信息安全云实验系统
一十三、实验项目名称:
古典密码——Vigenere密码
一十四、实验学时:
1学时
一十五、实验原理:
1)算法原理
a)Vigenere密码就是由法国密码学家BlaisedeVigenere于1858年提出的一种代换密码,它就是多表代换密码的典型代表。
b)定义:
设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,则密钥空间大小超过8×109,所以手工搜索非常困难。
当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。
2)算法参数
Vigenere密码算法主要有c、m、k三个个参数。
c为密文,m就是明文,k为密钥。
3)算法流程
算法流程如下。
如图所示
一十六、实验目的:
1)学习维吉尼亚算法的原理
2)学习维吉尼亚算法的实现
一十七、实验内容:
1、在虚拟机上运行Vigenere、exe可执行文件,根据提示输入明文与密钥,同时检查输出的解密后的结果就是否与明文一致。
2、学习掌握维吉尼亚算法的原理,并根据明文与密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
3、瞧懂实验程序代码,如有需要可在其上进行优化。
一十八、实验器材(设备、虚拟机名称):
Windows7
工具:
C:
\tools\密码学课程\01密码学算法\02古典密码\03vigenere密码算法
一十九、实验步骤:
一、查瞧维吉尼亚密码算法运行结果并学习其核心算法
1、1 点击文件【Vigenere、exe】,输入指令【v】,输入明文【xipuyangguang】,即可得到密钥与密文与明文,如图1所示
图1
1、2 维吉尼亚密码的核心算法如下所示。
根据实验中已给代码进行分析了解了维吉尼亚密码的实现步骤,将主程序中没有用到的生命变量去掉,加入一些交互语句得到如下代码:
#include
#include
#include
#include
#include
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;
/*密文字符串结束符*/
}
void
ISD_Vigenere_decrypt(charc[],chark[],charm[])
{
inti,j,s=0;
j=strlen(k);
for(i=0;c[i];i++)
c[i]=tolower(c[i]);
for(i=0;k[i];i++)
k[i]=tolower(k[i]);
for(i=0;c[i];i++)
if(isalpha(c[i]))
{
m[i]=(c[i]-k[s%j]+26)%26+'a';
s++;
}
else
m[i]=c[i];
m[i]=0;
}
voidmain(intargc,char*argv[])
{
charm[1024];
printf("古典密码算法演示程序");
charcommand;
printf("\n");
cout<<"输入v:
维吉尼亚加密!
\n";
cout<<"输入h:
获得帮助!
\n";
cout<<"输入e:
退出程序!
\n";
cout<<"请输入指令:
";
loop:
cin>>command;
switch
(command)
{
case'v':
{
chark[]="best";
cout<<"\ninputplaintext:
";
cin>>m;
charc[80];
chard[80];
ISD_Vigenere_crypt(m,k,c);
ISD_Vigenere_decrypt(c,k,d);
cout<<"明文:
";
puts(m);
cout<<"密钥:
";
puts(k);
cout<<"加密结果:
";
puts(c);
cout<<"解密结果:
";
puts(d);
gotoloop;
}
case'e':
{
return;
}
case'h':
;
{
cout<<"输入v:
维吉尼亚加密!
\n";
cout<<"输入h:
获得帮助!
\n";
cout<<"输入e:
退出程序!
\n";
gotoloop;
}
default:
gotoloop;
}
}
二十、实验结果及分析:
测试程序,结果正确,如下图所示:
明文nomorecountingdollars
密钥bestbestbestbestbestb
加密osehsiuhvrlbokvhmpskt
解密nomorecountingdollars
验证结果与输出一致,正确
二十一、实验结论:
维吉尼亚密码加密方法就是根据密钥内容,对输入的明文的字母进行替换,在密钥长度大于1的情况下,通常来说相同的字母也会由于对应的密钥字符不同而被不同的字符所替换,因此在一定程度上来说保证了加密技术的安全性,但就是若已知密钥的长度且有足够多样本的情况下,同样也可以做词频分析从而破译密码。
二十二、总结及心得体会:
维吉尼亚密码作为古典密码中的一种,加密原理简单易懂,程序实现也没有太大的困难,并且在密钥长度较长时加密安全性也可以有一定保证,较难破译,但用频率分析法可以破译已知密钥长度的密文,因此对于现代技术来说容易破译,但通过学习维吉尼亚密码学到了其加密的原理与基于统计破译密码的思想,收获很大。
实验报告
学生姓名
李昕宜
学号
2
指导老师
实验地点
N3
实验时间
2018/3/20
班级
一班
一、实验室名称:
SimpleSPC信息安全云实验系统
二、实验项目名称:
古典密码——代换密码
三、实验学时:
1学时
四、实验原理:
1)单表代换密码
a)加法密码
A与B就是有n个字母的字母表。
定义一个由A到B的映射:
f:
A→B
f(ai)=bi=aj
j=i+kmodn
加法密码就是用明文字母在字母表中后面第k个字母来代替。
K=3时就是著名的凯撒密码。
恺撒密码——历史上第一个密码技术
“恺撒密码”就是古罗马恺撒大帝在营救西塞罗战役时用来保护重要军情的加密系统(《高卢战记》)。
b)乘法密码
A与B就是有n个字母的字母表。
?
定义一个由A到B的映射:
f:
A→Bf(ai)=bi=ajj=ikmodn其中,(n,k)=1。
注意:
只有(n,k)=1,才能正确解密。
c)密钥词组代替密码
随机选一个词语,去掉其中的重复字母,写到矩阵的第一行,从明文字母表中去掉这第一行的字母,其余字母顺序写入矩阵。
然后按列取出字母构成密文字母表
2)多表代换密码
单表代替密码的安全性不高,一个原因就是一个明文字母只由一个密文字母代替。
可以利用频率分析来破译。
故产生了更为安全的多表代换密码,即构造多个密文字母表,在密钥的控制下用以一系列代换表依次对明文消息的字母序列进行代换。
著名的多表代替密码有Vigenere密码等。
a)Vernam密码
明文、密文、密钥都表示为二进制位:
M=m1,m2,…,mnK=k1,k2,…,knC=c1,c2,…,cn
b)Playfair密码
用密钥控制生成矩阵,然后每两个字母为单位进行代换。
c)Hill密码(乘积密码)
建立在矩阵相乘的基础上,但不能抵抗已知明文攻击。
五、实验目的:
2)学习代换密码的原理
2)学习代换密码的算法实现
六、实验内容:
1、在虚拟机上运行代换密码、exe可执行文件,根据提示输入明文与密钥,同时输入之前得到的密文与密钥检查输出的解密后的结果就是否与明文一致。
2、学习掌握代换密码的基本思想,了解其分类与不同代换密码之间的区别与共同点,并根据明文与密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
3、瞧懂实验程序代码,如有需要可在其上进行优化。
七、实验器材(设备、虚拟机名称):
Window7
工具:
C:
\tools\密码学课程\01密码学算法\02古典密码\04代换密码
八、实验步骤:
一、查瞧代换密码算法运行结果并学习核心算法
1、1 运行可执行程序,结果如下(注意:
这里输入的字符串位数最多不超过5个)。
如图1所示
图1
1、2源码阅读
在实验中发现提供的源码与代换密码、exe文件无法对应,因此我根据可执行文件进行试验观察发现,程序就是将待加密明文中的每一个字符的ASCII码与密钥的值相加,加密结果就就是ASCII码与对应的字符,根据这个思路写的程序如下所示:
#include
#include
usingnamespacestd;
intmain()
{
cout<<"请输入待加密的明文:
"<stringm;
charc[10]="";
intk;
cin>>m;
cout<<"请输入密钥:
"<cin>>k;
inti=0;
for(;ic[i]=m[i]+k;
}
c[i]='\n';
cout<<"密文为:
"<"<stringcom;
cin>>com;
cout<<"请输入密钥:
"<cin>>k;
cout<<"解密后的明文为:
"<charming[10]="";
i=0;
for(;iming[i]=c[i]-k;
}
ming[i]='\n';
cout<return0;
}
九、实验结果及分析:
测试修改后的程序,结果正确,如下图所示:
‘d’+20=’x’
‘b’+20=’v’
‘c’+20=’w’
‘a’+20=’u’
一十、实验结论:
在本次实验中了解到代换密码分为单表代换密码与多表代换密码,其中多表代换密码中由于用多个代换表进行加密,因此安全性要比单表代换密码更强。
代换密码的思想就是要首先建立一个代换表(即密钥),加密时需要将加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后生成密文,需要注意的就是将代换密码与置换密码进行区分,置换密码只就是更换明文中字符的顺序,只就是进行位置的置换。
而之前学到的维吉尼亚密码就是代换密码的一种。
一十一、总结及心得体会:
本次实验中接触到的代换密码我们已经很熟悉了,因为维吉尼亚密码就是多表代换中重要的一种,同时我们还需要将其与之前学到的置换密码区分开,实验中发现,若将多表代换密码的技术与置换密码的技术结合起来得到的加密技术的安全性应该有很高的保证。
实验报告
学生姓名
李昕宜
学号
2
指导老师
实验地点
N3
实验时间
2018/3/20
班级
一班
一、实验室名称:
SimpleSPC信息安全云实验系统
二、实验项目名称:
古典密码——移位密码
三、实验学时:
1学时
四、实验原理:
1)算法原理
a)移位密码就就是对26个字母进行移位操作,可以移动任意位数,这样就实现了对明文的加密,移位操作简单易行,因此,加密解密比较简单。
b)移位密码的基本思想:
移