密码学课程设计报告.docx
《密码学课程设计报告.docx》由会员分享,可在线阅读,更多相关《密码学课程设计报告.docx(41页珍藏版)》请在冰豆网上搜索。
密码学课程设计报告
密码学
课程设计报告
一.古典密码算法
1.1.实验内容:
用高级语言实现古典加密方法,多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,其中此实验本人运用了C++实现了Playfair体制、Vigenere体制、Vernam体制这三种多表古典加密方法。
1.2.实验目的:
掌握多表古典加密方法并分析多表古典加密方法各种体制的安全性。
1.3.需求分析:
古典密码系统已经初步体现出近代密码系统的雏形,加密方法逐渐复杂,其变化较小。
虽然从近代密码学的观点来看,许多古典密码是不安全的,即是极易破译的,但我们不应当忘掉古典密码在历史上发挥的巨大作用。
古典密码的代表密码体制主要有:
单表代替密码、多表代替密码及转轮密码。
Caser密码就是一种典型的单表加密体制;多表代替密码有Vigenere密码、Playfair体制、Vernam体制;著名的Enigma密码就是第二次世界大战中使用的转轮密码。
古典密码的代表密码体制主要有:
单表代替密码、多表代替密码及转轮密码。
古典密码的加密方法一般是文字置换,使用手工或机械变换的方式实现。
单表代换密码,指一旦密钥被选定,则每个明文字母对应的数字都被加密变换成对应的惟一数字,即对每个明文字母都用一个固定的明文字母表到密文字母表的确定映射。
这种简单的一一对应关系,很容易被破译者用频率分析法进行破解。
针对这种缺陷,人们提出多表代换密码,用一系列(两个以上)代换表依次对明文消息的字母进行代换。
古典加密算法中很多算法的保密性是基于算法本身保密的,这一点与现代加密算法不同。
正是由于算法本身保密,所以并不利于密码学的发展,密码学在古典密码学阶段发展是非常缓慢的。
古典密码大都比较简单,这些加密方法是根据字母的统计特性和语言学知识加密的,在可用计算机进行密码分析的今天,很容易被破译。
虽然现在很少采用,但研究这些密码算法的原理,对于理解、构造和分析现代密码是十分有益的。
古典密码在整个密码体系中起着基础的作用,因此理解并熟练运用是进入这一学科的关键,也有助于进一步学习近代密码学。
1.4.程序流程图:
因为下面所实现的三种体制程序个模块之间的联系都一样,所以这里就简化只做了一个流程图:
N
Y
N
Y
1.5.算法实现:
1.5.1Playfair体制:
1.5.1.1算法描述:
Playfair密码出现于1854年,是最著名的多字母加密密码。
Playfair算法使用关键词构造一个5×5的矩阵,其构造规则是按行依次写下关键词的字母(去除重复字母),然后按照字母表的顺序依次写下其余的字母,其中I和J算作同一个字母。
Playfair加密过程如下:
首先,将明文按两个字母分组,假定一组中的明文字母分别为m1和m2,若m1与m2相同,则在重复的字母中间插入一个事先约定好的字母,若明文字母为奇数则在明文的末端添加一个实现事先约定好的字母。
例如约定插入字母和补充字母均为X,则对明文CONNECTION的分组为CONXNECTIONX。
其次,按照如下规则对明文组进行加密:
当m1、m2在同一行时,对应的密文c1、c2分别是紧靠m1、m2右边的字母。
其中行的最后一个字母的密文是行的第一个字母。
(解密时相反)
当m1、m2在同一列时,对应的密文c1、c2分别是紧靠m1、m2下方的字母。
其中列的最后一个字母的密文是列的第一个字母。
(解密时相反)
当m1、m2不在同一行也不在同一列时,对应的密文c1、c2分别是与m1同行且与m2同列的字母及与m2同行且与m1同列的字母。
(解密时相同)
最后,将成生的密文组按次序排列即为最终的密文字母序列。
1.5.1.2核心代码解析:
因为Playfair算法使用关键词构造一个5×5的矩阵,所以在编写代码的时候首先应该根据输入的密钥来填充矩阵。
//把密钥中的字母填入到矩阵中
for(intk=0;k{
for(intt=0;t<25;t++)
{
if(ch1[k]==letters[t]&&flag[t]==0)
{
ch[i][j]=letters[t];
flag[t]=1;
if(j<4)j++;
else{i++;j=0;}
}
}
}
for(k=0;k<25;k++)//按字母表顺序把未用字母依次填入到矩阵中
{
if(flag[k]==0)
{
ch[i][j]=letters[k];
flag[k]=1;
if(j<4)j++;
else{i++;j=0;}
}
}
/*根据Playfair算法规则加密的重要部分当m1、m2在同一行时,对应的密文c1、c2分别是紧靠m1、m2右边的字母。
其中行的最后一个字母的密文是行的第一个字母。
(解密时相反)当m1、m2在同一列时,对应的密文c1、c2分别是紧靠m1、m2下方的字母。
其中列的最后一个字母的密文是列的第一个字母。
(解密时相反)当m1、m2不在同一行也不在同一列时,对应的密文c1、c2分别是与m1同行且与m2同列的字母及与m2同行且与m1同列的字母。
(解密时相同)*/
for(k=0;k{
intm1,m2,n1,n2;
for(m1=0;m1<=4;m1++)
{for(n1=0;n1<=4;n1++)
{
if(ch2[k]==ch[m1][n1])break;
}
if(ch2[k]==ch[m1][n1])break;
}
for(m2=0;m2<=4;m2++)
{
for(n2=0;n2<=4;n2++)
{
if(ch2[k+1]==ch[m2][n2])break;
}
if(ch2[k+1]==ch[m2][n2])break;
}
m1=m1%5;
m2=m2%5;
if(n1>4){n1=n1%5;m1=m1+1;}
if(n2>4){n2=n2%5;m2=m2+1;}
if(m1==m2)
{
ch2[k]=ch[m1][(n1+1)%5];
ch2[k+1]=ch[m2][(n2+1)%5];
}
else
{
if(n1==n2)
{
ch2[k]=ch[(m1+1)%5][n1];
ch2[k+1]=ch[(m2+1)%5][n2];
}
else
{ch2[k]=ch[m1][n2];
ch2[k+1]=ch[m2][n1];
}
}
}
1.5.1.3运行结果:
1.5.1.4Playfair安全分析:
Playfair密码相对于简单的单表密码是一个巨大的进步。
首先,因为有26个字母,故有26×26=676个字母对,因此对单个字母对进行判断要困难得多。
而且,单个字母的相对频率比字母对的相对频率在统计规律上要好。
这样利用频率分析字母对就更困难一些。
因为这些原因,Playfair密码在很长一段时间内被认为是牢不可破的。
第一次世界大战中英军就使用它作为陆军的战时加密体制,并且在第二次世界大战中,美军及其他一些盟国军队仍在大量使用。
PlayFair是对明文的每两个字母进行加密,而英语中各种连字(即两个字母的组合)已经被制成表格,且常用的连字如th、he、an、in、re、es等,及其变换(如er等),可以对密文出现的频率高的连字进行猜测,便能破解密文。
此外,PlayFair密码存在另一弱点,每个明文字母在密文中仅对应5种可能的字母,除非使用的密钥很长,否则矩阵的剩余行是可以预测出来的。
注意到这些,甚至可以仅用一段密文就可以攻破它。
尽管Playfair密码被认为是较安全的,它仍然是相对容易攻破的,因为它的密文仍然完好地保留了明文语言的大部分结构特征。
1.5.2Vigenere体制:
1.5.2.1算法描述:
Vigenere体制是1586年由法国密码学家BlaisedeVigenere发明的,Vigenere密码是一种典型的多表替代密码。
其密码表密码表是以字母表移位为基础把26个英文字母进行循环移位,排列在一起,形成26×26的方阵。
当密钥的长度比明文短时,密钥可以周期性地重复使用,直至完成明文中每个字母的加密。
利用26个英文字母构造Vigenere方阵,利用它可以方便地进行加密和解密,当用密钥字母对明文字母进行加密时,Vigenere方阵中的第行第列的字母就是相应的密文字母。
算法规律:
将A~Z以0~25编号,那么加密过程就是,在代换表的第一行中找到消息字母,如“w”,然后向后移动d(即3)次,所得的字母就是密文了。
如果数到末位,那么下一次移位就从头(即A)继续。
也就是说,可以将A~Z看成一个环,加密过程就是找定消息字母后,将指针往环的某个特定方向移位,次数就是密钥字母所代表的数字,这其实是一个模26的过程,所以在算法之中要将字母对应到数字。
Vigenere密码表
Vigenere密码算法表示如下:
设密钥K=k0k1k2…kd,明文M=m0m1m2…mn
加密变换:
ci=(mi+ki)mod26,i=0,1,2,,n
解密变换:
mi=(ci-ki)mod26,i=0,1,2,,n
1.5.2.2核心代码解析:
根据Vigenere密码是以字母表移位为基础把26个英文字母进行循环移位,排列在一起,形成26×26的方阵。
所以首先进行数字与字母对应。
//把行号字母对应到数字
Charv[N][N]={{'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'}};
intnumber(charx){
chary='a';
for(inti=0;i{
if(x==(y+i))returni;
}
}
加密过程:
给定一个密钥字母k和一个明文字母m,密文字母就是位于k所在的行与m所在的列的交叉点上的那个字母.
voidencryption(stringm,stringk)//加密过程
{
cout<<"明文:
";
cin>>m;
cout<<"密钥:
";
cin>>k;
intmlen,klen;
mlen=m.length();
klen=k.length();
char*p,*q,*t;//明文,初始密钥,密钥串。
把string换成char
p=newchar[m.length()+1];
strcpy(p,m.c_str());
q=newchar[k.length()+1];
strcpy(q,k.c_str());
t=newchar[m.length()+1];
intj=0;
for(inti=0;i{
t[i]=q[j];
j++;
j=j%klen;
}
解密过程:
由密钥字母决定行,在该行中找到密文字母,密文字母所在列的列首对应的明文字母就是相应的明文
voiddisencryption(stringc,stringk)//解密过程
{
cout<<"密文:
";
cin>>c;
cout<<"密钥:
";
cin>>k;
intclen,klen;
clen=c.length();
klen=k.length();
char*p,*q,*t;//密文,初始密钥,密钥串。
把string换成char
p=newchar[c.length()+1];
strcpy(p,c.c_str());
q=newchar[k.length()+1];
strcpy(q,k.c_str());
t=newchar[c.length()+1];
intj=0;
for(inti=0;i{
t[i]=q[j];
j++;
j=j%klen;
}
1.5.2.3运行结果:
1.5.2.4Vigenere安全分析:
维吉尼亚密码采用26张替换表依次对明文消息的字母进行替换。
由于此密码变换中,明文的每个字母是按照密钥字的指示,选用不同的加同余密码替换而成的,因此,同一个字母在明文中的位置不同,对应的密文字母就不同。
它克服了单表替换密码中明密文字母一一对应的弱点,能比较好的抵抗频率攻击法。
但多表替换中各个字母的概率只是被做了置换,它不能够抵抗已知明文等攻击方法。
这种密码的强度在于每个明文字母对应着多个密文字母,且每个密文字母使用惟一的密钥字母,因此字母出现的频率信息被隐藏了,不过并非所有的明文结构信息都隐藏了。
Vigenère提出用一个所谓的“密钥自动生成系统”来将密钥词和明文自身连接来生成不重复的密钥词。
即使采用这个方案,它也是易受攻击的。
因为密钥和明文具有相同频率的分布特征,所以我们可以应用统计学的方法。
例如,用“e”加密“e”,由英文字母的相关概率分析图如(图1)可以估计出其发生的概率为(0.127)2≈0.016,而用“t”加密“t”发生的概率大概只有它的一半,等等。
密码分析者利用这些规律能够成功地进行分析虽然破译Vigenère密码的技术并不复杂。
如果认为是用Vigenère密码加密的,破译能否取得进展将取决于能否判定密钥词的长度。
洞察到这个事实很重要:
如果两个相同的明文序列之间的距离是密钥词长度的整数倍,那么产生的密文序列也是相同的。
图1语言的统计特性
1.5.3Vernam体制:
1.5.3.1算法描述:
序列密码的思想起源于20世纪20年代,最早的二进序列密码系统是Vernam密码。
Vernam密码将明文消息转化为二进制数字序列,密钥序列也为二进数字序列,加密是按明文序列和密钥序列逐位模2相加进行,解密也是按密文序列和密钥序列逐位模2相加进行。
Vernam的算法实现一个简洁而又稳定的文件加密解密类。
通过此类加密的数据是绝对无法在没有密钥的情况下被破解的。
它的基本原理是,需要有一个需要加密的明文和一个随机生成的解密钥匙文件。
然后使用这两个文件组合起来生成密文:
(明文)组合(密钥)=加密后的密文。
使用Vernam加密算法,经其处理的密钥可以拥有与待加密文件大小相同的密钥长度,而且输出文件的大小相比待加密文件无任何改变(精确到字节)。
换言之,密钥文件越大,加密强度越高!
Vernam密码算法:
1、现代密码体制的萌芽是Vernam加密方法。
2、Vernam密码是美国电话电报公司的GilbertVernam在1917年为电报通信设计的一种非常方便的密码,它在近代计算机和通信系统设计中得到了广泛应用。
3、Vernam密码的明文、密钥和密文均用二元数字序列表示。
这是一种使用异或方法进行加密解密的方法。
4、要编制Vernam密码,只需先把明文和密钥表示成二元序列,再把它们按位模2相加,就可得到密文。
5、而解密只需把密文和密钥的二元序列按位模2相加便可得到明文。
6、开始时使用一个定长的密钥序列,这样产生的密文能形成有规律的反复,易被破译;后来采用的密钥与明文同长,且密钥序列只用一次,称为“一次一密体制”。
1.5.3.2核心代码解析:
根据Vernam密码算法:
Vernam密码的明文、密钥和密文均用二元数字序列表示,这就需要我们输入的字符要转换成二进制数字然后进行加解密计算。
voidchange(string&plain,vector&number)//字母变数字
{
for(unsignedinti=0;i{
number.push_back(plain[i]-97);//a为0
}
}
要编制Vernam密码,只需先把明文和密钥表示成二元序列,再把它们按位模2相加,就可得到密文。
vectorencrypt_compute(vectorm,vectork)//加密计算
{
vectorsum;
for(unsignedinti=0;i{
sum.push_back((m[i]+k[i])%26);
}
returnsum;
}
解密只需把密文和密钥的二元序列按位模2相加便可得到明文。
下面就是解密代码:
vectordiscrypt_compute(vectorc,vectork)//解密计算
{
vectorresum;
inttemp;
for(unsignedinti=0;i{
temp=c[i]-k[i];
if(temp<0)temp+=26;
resum.push_back(temp);
}
returnresum;
}
1.5.3.3运行结果:
1.5.3.4Vernam安全分析:
1917年工程师GilbertVernam首先引入了这种体制,其运算基于二进制数据而非字母。
这种技术的本质在于构造密钥的方式。
Vernam提出使用连续的磁带,其最终也将循环。
所以事实上该体制是使用周期很大的循环密钥。
尽管周期很长对于密码分析增添了相当大的难度,但是如果有足够的密文,使用已知或可能的明文序列,或者联合使用二者,该方案是可以被破解的。
Vernam加密算法实际上是在(0,1)字母上运用Vigenere加密算法。
这种方法的优点在于(mi+ki)mod2运算非常容易实现。
而且ci+ki≡mimod2,这里的加法都是不进位的二进制加法在同一密钥下,Vernam密码只要找到一组和密码对应的明文便可破译。
之后,陆军情报军官JosephMauborgne提出了一种对Vernam密码的改进方案,从而达到了最完善的安全性。
Mauborgne建议使用与消息一样长且无重复的随机密钥来加密消息,另外,密钥只对一个消息进行加解密,之后丢弃不用。
每一条新消息都需要一个与其等长的新密钥。
这就是著名的一次一密,它是不可攻破的。
它产生的随机输出与明文没有任何统计关系。
因为密文不包含明文的任何信息,所以无法可破。
因为给出任何长度与密文一样的明文,都存在着一个密钥产生这个明文。
因此,如果你用穷举法搜索所有可能的密钥,就会得到大量可读、清楚的明文,但是没有办法确定哪一个才是真正所需的,因而这种密码是不可破的。
在实际中,一次一密提供完全的安全性存在两个基本难点:
(1).产生大规模随机密钥有实际困难。
任何经常使用的系统都需要建立在某个规则基础上的数百万个随机字符,提供这样规模的真正随机字符是相当艰巨的任务。
(2).更令人担忧的是密钥的分配和保护。
对每一条发送的消息,需要提供给发送方和接收方等长度的密钥。
因此,存在庞大的密钥分配问题。
因为上面这些困难,一次一密实际很少使用,主要用于安全性要求很高的低带宽信道。
如能做到以下三点,则Vernam密码是绝对不可破译的:
(1)密钥是随机序列;
(2)密钥的长度大于或等于明文的长度;
(3)一个密钥只用一次;
二.分组密码算法DES
2.1.实验内容:
用高级语言实现实现DES加密和解密算法,DES是由初始变换、乘积变换和逆初始变换构成,乘积变换是DES算法的核心。
首先用代码实现这几个变换,然后组合成DES加密算法。
由于DES解密算法与加密算法相同只是子密钥使用次序不同,因此可简单地由加密算法实现解密算法。
2.2.实验目的:
掌握分组加密算法的设计与实现方法并对DES的安全性进行分析。
2.3.需求分析:
数据加密标准(DES,DataEncryptionStandard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。
美国国家标准局(NBS)于1973年向社会公开征集一种用于政府机构和商业部门的加密算法,经过评测,最终选择了IBM公司提出的一种加密算法。
经过一段时间的试用,美国政府于1977年颁布DES。
DES是分组密码的典型代表,也是第一个被公布出来的标准算法,曾被美国国家标准局(现为国家标准与技术研究所NIST)确定为联邦信息处理标准(FIPSPUB46),使用广泛,特别使在金融领域,曾是对称密码体制事实上的世界标准。
DES自从公布以来,已成为金融界及其他各种行业最广泛应用的对称密钥密码系统。
DES是分组密码的典型代表,也是第一个被公布出来的标准算法。
原来规定DES算法的使用期为10年,可能是DES尚未受到严重威胁,更主要是新的数据加密标准研制工作尚未完成,或意见尚未统一,所以当时的美国政府宣布延长它的使用期。
因而DES超期服役到2000年。
近三十年来,尽管计算机硬件及破解密码技术的发展日新月异,若撇开DES的密钥太短,易于被使用穷举密钥搜寻法找到密钥的攻击法不谈,直到进入20世纪90年代以后,以色列的密码学家Shamir等人提出一种“差分分析法”,以后日本人也提出了类似的方法,这才称得上对它有了攻击的方法。
严格地说Shamir的“差分分析法”也只是理论上的价值。
至少到目前为止是这样,比如后来的“线形逼迫法”,它是一种已知明文攻击,需要243≈4.398×1012个明、密文对,在这样苛刻的要求下,还要付出很大的代价才能解出一个密钥。
不管是差分攻击还是线性攻击法,对于DES的安全性也仅仅只做到了“质疑”的地步,并未从根本上破解DES。
也就是说,若是能用类似Triple-DES或是DESX的方式加长密钥长度,仍不失为一个安全的密码系统。
早在DES提出不久,就有人提出造一专用的装置来对付DES,其基本思想无非是借用硬件设备来实现对所有的密钥进行遍历搜索。
由于电子技术的突飞猛进,专门设备的造价大大降低,速度有质的飞跃,对DES形成了实际的威胁。
DES确实辉煌过,它的弱点在于专家们一开始就指出的,即密钥太短。
美国政府已经征集评估和判定出了新的数据加密标准AES以取代DES对现代分组密码理论的发展和应用起了奠基性的作用,它的基本理论和设计思想仍有重要参考价值。
安全性是分组密码最重要的设计原则,它要求即使攻击者知道分组密码的内部结构,仍不能破译该密码,这也意味着,不存在针对该密码的某种攻击方法,其工作量小于穷密钥搜索。
但是随着密码分析技术的发展,使得对于具有更多轮的分组密码的破译成为可能。
现如今,依靠Internet的分布式计算能力,用穷举密钥搜索攻击方法破译已成为可能。
数据加密标准DES已经达到它的信任终点。
但是作为一种Feistel加密算法的例子仍然有讨论的价值。
2.4.DES算法描述:
DES是一种分组密码,明文、密文和密钥