密码学课程设计报告.doc_第1页
密码学课程设计报告.doc_第2页
密码学课程设计报告.doc_第3页
密码学课程设计报告.doc_第4页
密码学课程设计报告.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010-2011密码学课程设计报告密码学课程设计报告一古典密码算法31.1.实验内容31.2.实验目的31.3.需求分析31.4.程序流程图41.5.算法实现51.5.1 Playfair体制51.5.1.1算法描述51.5.1.2 核心代码解析51.5.1.3运行结果71.5.1.4 Playfair安全分析71.5.2 Vigenere体制81.5.2.1算法描述81.5.2.2核心代码解析81.5.2.3运行结果101.5.2.4 Vigenere安全分析101.5.3 Vernam体制111.5.3.1算法描述111.5.3.2核心代码解析121.5.3.3 运行结果131.5.3.4 Vernam安全分析13二分组密码算法DES142.1.实验内容142.2.实验目的142.3.需求分析142.4.DES算法描述152.5 DES算法流程172.6.DES核心代码分析172.7.DES运行结果202.8.DES安全分析20三大素数密码算法RSA223.1.实验内容223.2.实验目的223.3.需求分析223.4. 程序流程图233.5. 算法实现243.5.1 Miller-Rabin素性测试法243.5.1.1算法描述243.5.1.2核心代码分析253.5.1.3运行结果263.5.1.4 算法效率分析263.5.2 RSA算法实现273.5.2.1算法描述273.5.2.2 核心代码分析273.5.2.3运行结果293.5.2.4 RSA安全分析29四实验总结31一古典密码算法1.1.实验内容:用高级语言实现古典加密方法,多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,其中此实验本人运用了C+实现了Playfair体制、Vigenere体制、Vernam体制这三种多表古典加密方法。1.2.实验目的:掌握多表古典加密方法并分析多表古典加密方法各种体制的安全性。1.3.需求分析: 古典密码系统已经初步体现出近代密码系统的雏形,加密方法逐渐复杂,其变化较小。虽然从近代密码学的观点来看,许多古典密码是不安全的,即是极易破译的,但我们不应当忘掉古典密码在历史上发挥的巨大作用。古典密码的代表密码体制主要有:单表代替密码、多表代替密码及转轮密码。Caser密码就是一种典型的单表加密体制;多表代替密码有Vigenere密码、Playfair体制、Vernam体制;著名的Enigma密码就是第二次世界大战中使用的转轮密码。古典密码的代表密码体制主要有:单表代替密码、多表代替密码及转轮密码。古典密码的加密方法一般是文字置换,使用手工或机械变换的方式实现。单表代换密码,指一旦密钥被选定,则每个明文字母对应的数字都被加密变换成对应的惟一数字,即对每个明文字母都用一个固定的明文字母表到密文字母表的确定映射。这种简单的一一对应关系,很容易被破译者用频率分析法进行破解。针对这种缺陷,人们提出多表代换密码,用一系列(两个以上)代换表依次对明文消息的字母进行代换。古典加密算法中很多算法的保密性是基于算法本身保密的,这一点与现代加密算法不同。正是由于算法本身保密,所以并不利于密码学的发展,密码学在古典密码学阶段发展是非常缓慢的。古典密码大都比较简单,这些加密方法是根据字母的统计特性和语言学知识加密的,在可用计算机进行密码分析的今天,很容易被破译。虽然现在很少采用,但研究这些密码算法的原理,对于理解、构造和分析现代密码是十分有益的。古典密码在整个密码体系中起着基础的作用,因此理解并熟练运用是进入这一学科的关键,也有助于进一步学习近代密码学。1.4.程序流程图: 因为下面所实现的三种体制程序个模块之间的联系都一样,所以这里就简化只做了一个流程图: 开始 选择要进行的操作是否进行加密? NY输入明文输入密钥输出密文重新选择操作是否进行解密? N Y输入密文 输入与加密相同密钥 输出明文 结束 1.5.算法实现:1.5.1 Playfair体制:1.5.1.1算法描述:Playfair密码出现于1854年,是最著名的多字母加密密码。Playfair算法使用关键词构造一个55的矩阵,其构造规则是按行依次写下关键词的字母(去除重复字母),然后按照字母表的顺序依次写下其余的字母,其中I和J算作同一个字母。Playfair加密过程如下:首先,将明文按两个字母分组,假定一组中的明文字母分别为m1和m2,若m1与m2相同,则在重复的字母中间插入一个事先约定好的字母,若明文字母为奇数则在明文的末端添加一个实现事先约定好的字母。例如约定插入字母和补充字母均为X,则对明文CONNECTION的分组为CO NX NE CT IO NX。其次,按照如下规则对明文组进行加密: 当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算法使用关键词构造一个55的矩阵,所以在编写代码的时候首先应该根据输入的密钥来填充矩阵。/把密钥中的字母填入到矩阵中for(int k=0;kstrlen(ch1);k+) for(int t=0;t25;t+)if(ch1k=letterst&flagt=0)chij=letterst;flagt=1;if(j4)j+;else i+;j=0; for( k=0;k25;k+)/按字母表顺序把未用字母依次填入到矩阵中if(flagk=0)chij=lettersk;flagk=1;if(j4)j+;elsei+;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;kstrlen(ch2);k+=2)int m1,m2,n1,n2;for(m1=0;m1=4;m1+)for(n1=0;n1=4;n1+)if(ch2k=chm1n1)break;if(ch2k=chm1n1)break;for(m2=0;m2=4;m2+)for(n2=0;n24)n1=n1%5;m1=m1+1;if(n24)n2=n2%5;m2=m2+1;if(m1=m2)ch2k=chm1(n1+1)%5;ch2k+1=chm2(n2+1)%5;else if(n1=n2)ch2k=ch(m1+1)%5n1;ch2k+1=ch(m2+1)%5n2;elsech2k=chm1n2;ch2k+1=chm2n1;1.5.1.3运行结果:1.5.1.4 Playfair安全分析:Playfair密码相对于简单的单表密码是一个巨大的进步。首先,因为有26个字母,故有2626=676个字母对,因此对单个字母对进行判断要困难得多。而且,单个字母的相对频率比字母对的相对频率在统计规律上要好。这样利用频率分析字母对就更困难一些。因为这些原因,Playfair密码在很长一段时间内被认为是牢不可破的。第一次世界大战中英军就使用它作为陆军的战时加密体制,并且在第二次世界大战中,美军及其他一些盟国军队仍在大量使用。PlayFair是对明文的每两个字母进行加密,而英语中各种连字(即两个字母的组合)已经被制成表格,且常用的连字如th、he、an、in、re、es等,及其变换(如er等),可以对密文出现的频率高的连字进行猜测,便能破解密文。此外,PlayFair密码存在另一弱点,每个明文字母在密文中仅对应5种可能的字母,除非使用的密钥很长,否则矩阵的剩余行是可以预测出来的。注意到这些,甚至可以仅用一段密文就可以攻破它。尽管Playfair密码被认为是较安全的,它仍然是相对容易攻破的,因为它的密文仍然完好地保留了明文语言的大部分结构特征。 1.5.2 Vigenere体制:1.5.2.1算法描述:Vigenere体制是 1586年由法国密码学家Blaise de Vigenere发明的,Vigenere密码是一种典型的多表替代密码。其密码表密码表是以字母表移位为基础把26个英文字母进行循环移位,排列在一起,形成2626的方阵。当密钥的长度比明文短时,密钥可以周期性地重复使用,直至完成明文中每个字母的加密。利用26个英文字母构造Vigenere方阵,利用它可以方便地进行加密和解密,当用密钥字母对明文字母进行加密时,Vigenere方阵中的第行第列的字母就是相应的密文字母。算法规律:将AZ以025编号,那么加密过程就是,在代换表的第一行中找到消息字母,如“w”,然后向后移动d(即3)次,所得的字母就是密文了。如果数到末位,那么下一次移位就从头(即A)继续。也就是说,可以将AZ看成一个环,加密过程就是找定消息字母后,将指针往环的某个特定方向移位,次数就是密钥字母所代表的数字,这其实是一个模26的过程,所以在算法之中要将字母对应到数字。 Vigenere密码表Vigenere密码算法表示如下:设密钥K= k0k1k2kd,明文M= m0m1m2mn加密变换:ci=(mi+ki)mod26, i=0,1,2,n解密变换:mi=(ci-ki)mod26, i=0,1,2,n1.5.2.2核心代码解析:根据Vigenere密码是以字母表移位为基础把26个英文字母进行循环移位,排列在一起,形成2626的方阵。所以首先进行数字与字母对应。/把行号字母对应到数字Char vNN=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;int number(char x) char y=a; for(int i=0;iN;i+) if(x=(y+i) return i; 加密过程:给定一个密钥字母k和一个明文字母m,密文字母就是位于k所在的行与m所在的列的交叉点上的那个字母 .void encryption(string m,string k)/加密过程 coutm; coutk; int mlen,klen; mlen=m.length(); klen=k.length(); char *p,*q,*t;/明文,初始密钥,密钥串。把string换成char p=new charm.length()+1; strcpy(p,m.c_str(); q=new chark.length()+1; strcpy(q,k.c_str(); t=new charm.length()+1; int j=0; for(int i=0;imlen;i+) ti=qj; j+; j=j%klen; 解密过程:由密钥字母决定行,在该行中找到密文字母,密文字母所在列的列首对应的明文字母就是相应的明文 void disencryption(string c,string k)/解密过程 coutc; coutk; int clen,klen; clen=c.length(); klen=k.length(); char *p,*q,*t; /密文,初始密钥,密钥串。把string换成char p=new charc.length()+1; strcpy(p,c.c_str(); q=new chark.length()+1; strcpy(q,k.c_str(); t=new charc.length()+1; int j=0; for(int i=0;iclen;i+) ti=qj; j+; j=j%klen; 1.5.2.3运行结果:1.5.2.4 Vigenere安全分析:维吉尼亚密码采用26张替换表依次对明文消息的字母进行替换。由于此密码变换中,明文的每个字母是按照密钥字的指示,选用不同的加同余密码替换而成的,因此,同一个字母在明文中的位置不同,对应的密文字母就不同。它克服了单表替换密码中明密文字母一一对应的弱点,能比较好的抵抗频率攻击法。但多表替换中各个字母的概率只是被做了置换,它不能够抵抗已知明文等攻击方法。这种密码的强度在于每个明文字母对应着多个密文字母,且每个密文字母使用惟一的密钥字母,因此字母出现的频率信息被隐藏了,不过并非所有的明文结构信息都隐藏了。Vigenre提出用一个所谓的“密钥自动生成系统”来将密钥词和明文自身连接来生成不重复的密钥词。即使采用这个方案,它也是易受攻击的。因为密钥和明文具有相同频率的分布特征,所以我们可以应用统计学的方法。例如,用“e”加密“e”,由英文字母的相关概率分析图如 (图1)可以估计出其发生的概率为(0.127)20.016,而用“t”加密“t”发生的概率大概只有它的一半,等等。密码分析者利用这些规律能够成功地进行分析虽然破译Vigenre密码的技术并不复杂 。如果认为是用Vigenre密码加密的,破译能否取得进展将取决于能否判定密钥词的长度。洞察到这个事实很重要:如果两个相同的明文序列之间的距离是密钥词长度的整数倍,那么产生的密文序列也是相同的。图1语言的统计特性1.5.3 Vernam体制:1.5.3.1算法描述:序列 密 码 的思 想 起 源 于 20世 纪 20年 代 ,最早的二进 序 列密码 系 统是 Vernam密码 。Vernam密码将明文消息转化为二进制数字序列 ,密钥序列也为二进数字序列 ,加密是按明文序列和密钥序列逐位模 2相加进行 ,解密也是按 密文序列和密钥序列逐位模 2相加进行 。Vernam的算法实现一个简洁而又稳定的文件加密解密类。通过此类加密的数据是绝对无法在没有密钥的情况下被破解的。它的基本原理是,需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文:(明文) 组合 (密钥) = 加密后的密文。使用Vernam加密算法,经其处理的密钥可以拥有与待加密文件大小相同的密钥长度,而且输出文件的大小相比待加密文件无任何改变(精确到字节)。换言之,密钥文件越大,加密强度越高!Vernam密码算法: 1、 现代密码体制的萌芽是Vernam加密方法。 2、Vernam密码是美国电话电报公司的Gilbert Vernam在1917年为电报通信设计的一种非常方便的密码,它在近代计算机和通信系统设计中得到了广泛应用。 3、Vernam密码的明文、密钥和密文均用二元数字序列表示。这是一种使用异或方法进行加密解密的方法。 4、要编制Vernam密码,只需先把明文和密钥表示成二元序列,再把它们按位模2相加,就可得到密文。 5、而解密只需把密文和密钥的二元序列按位模2相加便可得到明文。 6、开始时使用一个定长的密钥序列,这样产生的密文能形成有规律的反复,易被破译;后来采用的密钥与明文同长,且密钥序列只用一次,称为“一次一密体制”。1.5.3.2核心代码解析:根据Vernam密码算法: Vernam密码的明文、密钥和密文均用二元数字序列表示,这就需要我们输入的字符要转换成二进制数字然后进行加解密计算。void change(string &plain, vector&number) /字母变数字for (unsigned int i=0;iplain.size();i+)number.push_back(plaini-97); /a为0要编制Vernam密码,只需先把明文和密钥表示成二元序列,再把它们按位模2相加,就可得到密文。 vector encrypt_compute(vector m,vector k) /加密计算vector sum;for(unsigned int i=0; im.size(); i+)sum.push_back(mi+ki)%26);return sum;解密只需把密文和密钥的二元序列按位模2相加便可得到明文。下面就是解密代码:vector discrypt_compute(vector c,vector k) /解密计算vector resum;int temp;for(unsigned int i=0; ic.size(); i+)temp = ci-ki;if(temp0) temp+=26;resum.push_back(temp);return resum;1.5.3.3 运行结果:1.5.3.4 Vernam安全分析:1917年工程师Gilbert Vernam首先引入了这种体制,其运算基于二进制数据而非字母。这种技术的本质在于构造密钥的方式。Vernam提出使用连续的磁带,其最终也将循环。所以事实上该体制是使用周期很大的循环密钥。尽管周期很长对于密码分析增添了相当大的难度,但是如果有足够的密文,使用已知或可能的明文序列,或者联合使用二者,该方案是可以被破解的。Vernam加密算法实际上是在(0,1)字母上运用Vigenere加密算法。这种方法的优点在于(mi + ki) mod 2运算非常容易实现。而且ci + kimi mod 2,这里的加法都是不进位的二进制加法 在同一密钥下,Vernam密码只要找到一组和密码对应的明文便可破译。之后,陆军情报军官Joseph Mauborgne提出了一种对Vernam密码的改进方案,从而达到了最完善的安全性。Mauborgne建议使用与消息一样长且无重复的随机密钥来加密消息,另外,密钥只对一个消息进行加解密,之后丢弃不用。每一条新消息都需要一个与其等长的新密钥。这就是著名的一次一密,它是不可攻破的。它产生的随机输出与明文没有任何统计关系。因为密文不包含明文的任何信息,所以无法可破。 因为给出任何长度与密文一样的明文,都存在着一个密钥产生这个明文。因此,如果你用穷举法搜索所有可能的密钥,就会得到大量可读、清楚的明文,但是没有办法确定哪一个才是真正所需的,因而这种密码是不可破的。 在实际中,一次一密提供完全的安全性存在两个基本难点:(1). 产生大规模随机密钥有实际困难。任何经常使用的系统都需要建立在某个规则基础上的数百万个随机字符,提供这样规模的真正随机字符是相当艰巨的任务。(2). 更令人担忧的是密钥的分配和保护。对每一条发送的消息,需要提供给发送方和接收方等长度的密钥。因此,存在庞大的密钥分配问题。因为上面这些困难,一次一密实际很少使用,主要用于安全性要求很高的低带宽信道。如能做到以下三点,则 Vernam密码是绝对不可破译的:(1) 密钥是随机序列;(2) 密钥的长度大于或等于明文的长度;(3) 一个密钥只用一次;二分组密码算法DES2.1.实验内容:用高级语言实现实现DES加密和解密算法,DES是由初始变换、乘积变换和逆初始变换构成,乘积变换是DES算法的核心。首先用代码实现这几个变换,然后组合成DES加密算法。由于DES解密算法与加密算法相同只是子密钥使用次序不同,因此可简单地由加密算法实现解密算法。2.2.实验目的:掌握分组加密算法的设计与实现方法并对DES的安全性进行分析。2.3.需求分析: 数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。美国国家标准局(NBS)于1973年向社会公开征集一种用于政府机构和商业部门的加密算法,经过评测,最终选择了IBM公司提出的一种加密算法。经过一段时间的试用,美国政府于1977年颁布DES。DES是分组密码的典型代表,也是第一个被公布出来的标准算法,曾被美国国家标准局(现为国家标准与技术研究所NIST)确定为联邦信息处理标准(FIPS PUB 46),使用广泛,特别使在金融领域,曾是对称密码体制事实上的世界标准。DES自从公布以来,已成为金融界及其他各种行业最广泛应用的对称密钥密码系统。DES是分组密码的典型代表,也是第一个被公布出来的标准算法。原来规定DES算法的使用期为10年,可能是DES尚未受到严重威胁,更主要是新的数据加密标准研制工作尚未完成,或意见尚未统一,所以当时的美国政府宣布延长它的使用期。因而DES超期服役到2000年。近三十年来,尽管计算机硬件及破解密码技术的发展日新月异,若撇开DES的密钥太短,易于被使用穷举密钥搜寻法找到密钥的攻击法不谈,直到进入20世纪90年代以后,以色列的密码学家Shamir等人提出一种“差分分析法”,以后日本人也提出了类似的方法,这才称得上对它有了攻击的方法。严格地说Shamir的“差分分析法”也只是理论上的价值。至少到目前为止是这样,比如后来的“线形逼迫法”,它是一种已知明文攻击,需要2434.3981012个明、密文对,在这样苛刻的要求下,还要付出很大的代价才能解出一个密钥。不管是差分攻击还是线性攻击法,对于DES的安全性也仅仅只做到了“质疑”的地步,并未从根本上破解DES。也就是说,若是能用类似Triple-DES或是DESX的方式加长密钥长度,仍不失为一个安全的密码系统。早在DES提出不久,就有人提出造一专用的装置来对付DES,其基本思想无非是借用硬件设备来实现对所有的密钥进行遍历搜索。由于电子技术的突飞猛进,专门设备的造价大大降低,速度有质的飞跃,对DES形成了实际的威胁。DES确实辉煌过,它的弱点在于专家们一开始就指出的,即密钥太短。美国政府已经征集评估和判定出了新的数据加密标准AES以取代DES对现代分组密码理论的发展和应用起了奠基性的作用,它的基本理论和设计思想仍有重要参考价值。安全性是分组密码最重要的设计原则,它要求即使攻击者知道分组密码的内部结构,仍不能破译该密码,这也意味着,不存在针对该密码的某种攻击方法,其工作量小于穷密钥搜索。但是随着密码分析技术的发展,使得对于具有更多轮的分组密码的破译成为可能。现如今,依靠Internet的分布式计算能力,用穷举密钥搜索攻击方法破译已成为可能。数据加密标准DES已经达到它的信任终点。但是作为一种Feistel加密算法的例子仍然有讨论的价值。2.4.DES算法描述: DES是一种分组密码,明文、密文和密钥的分组长度都是64位并且是面向二进制的密码算法。DES处理的明文分组长度为64位,密文分组长度也是64位,使用的密钥长度位56位(实际上函数要求一个64位的密钥作为输入,但其中用到的只有56位,另外8位可以用做奇偶校验位或者完全随意设置)。DES是对合运算,它的解密过程和加密相似,解密时使用与加密同样的算法,不过子密钥的使用次序要反过来。DES的整个体制时公开的,系统的安全性完全靠密钥的保密。DES在算法结构上采用置换、代替、模2加等基本密码运算构成轮加密函数,对轮加密函数进行16次迭代。DES算法是对合算法,工程上实现比较容易。DES算法中除了S盒是非线性变换外,其余变换都是线性变换,因此DES算法的安全关键在于S盒,其本质是数据压缩,把6位的数据压缩为4位数据。此外,S盒和置换P相互结合,具有较强的抗差分攻击和抗线性攻击能力。DES的子密钥产生和使用能确保原密钥的各位的使用次数基本相等,这也使得DES的保密性得到进一步的增强。DES算法的加密过程经过了三个阶段:首先,64位的明文在一个初始置换后,比特重排产生了经过置换的输入,明文组被分成右半部分和左半部分,每部分32位,以和表示。接下来的阶段是由对同一个函数进行16次循环组成的,16轮迭代称为乘积变换或函数。这个函数本身既包含换位又包含代替函数,将数据和密钥结合起来,最后1轮的输出由64位组成,其左边和右边两个部分经过交换后得到预输出。最后阶段,预输出通过一个逆初始置换算法就生成了64位的密文结果。DES的加密过程可简单描述为三个阶段:DES的解密算法与加密算法共用相同的算法过程,即使用相同的方法完成加密和解密,两者的不同之处仅在于解密时子密钥Ki的使用顺序与加密时相反。相对应的DES的解密过程由于DES的运算是对合运算,所以解密和加密可共用同一个运算,只是子密钥的使用的顺序不同。解密过程可用如下的数学公式表示:2.5 DES算法流程: 图(1) DES算法的整体结构图图(2) DES算法的迭代过程图2.6.DES核心代码分析: 下面根据具体情况确定要执行哪种置换,前面已经定义了所要用到的几种置换:IP变换,IP-1变换,f变换,扩展变换,P变换以及S盒结构。void keyfc(char *In) /获取密钥函数此函数的功能是由64比特的密钥产生16个子密钥ki。首先将密钥字节组key8转换为64比特的位组,然后进行密钥变换置换后得到56比特的密钥,把变换后的密钥等分成两部分,之后进行循环左移运算void DES(char Out8,char In8,bool MS)/加密核心程序,ms=0时加密,反之解密bool MW64,tmp32,PMW64;/注意指针bool kzmw48,keytem48,ss32;int hang,lie;ByteToBit(PMW,In,64);for(int j=0;j64;j+)MWj=PMWipj-1; /初始置换bool *Li=&MW0,*Ri=&MW32;for(int i=0;i48;i+)/右明文扩展置换kzmwi=Rieii-1;/注意指针/扩展置换表,作用是将32比特的输入扩展为48比特t static char ei = /扩展置换 32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1;/加密阶段的初始置换IPconst static char ip = /IP初始置换 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7; xor()此函数的功能是进行异或运算,异或运算是按位作不进位加法运算。void Xor(bool *InA,const bool *InB,int len) /按位异或for(int i=0;ilen;i+)InAi=InBi;ByteToBit()此函数的功能是将输入的字节组转换为位组。void ByteToBit(bool *Out,char *In,int bits)/字节到位的转换int i;for(i=0;i(i%8)&1;BitToByte()此函数的功能是将位组转换字节组。void BitToByte(char *Out,bool *In,int bits)/位到字节转换for(int i=0;ibits/8;i+)Outi=0;for(i=0;ibits;i+)Outi/8|=Ini(i%8);/|=组合了位操作符和赋值操作符的功能加密过程最后阶段预输出通过一个逆初始置换算法就生成了64位的密文结果。const static char fp = /IP逆初始置换 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25;此主函数贯穿整个函数。首先是初设密钥,然后调用密钥设置函数和DES算法的运行函数,最后得出密文以及解密后的文字。void main()char Ki8,jm8,final8;int i0;cout请输入密钥(8字节):endl;for(i0=0;i0Kii0;keyfc(Ki);cout请输入明文:endl;for(i0=0;i0jmi0;DES(final,jm,0);/加密for(i0=0;i08;i0+)coutfinali0; coutendl;DES(jm,final,1);/解密for(i0=0;i08;i0+) coutjmi0;coutendl;具体代码和注释在代码中都有详细介绍。2.7.DES运行结果:2.8.DES安全分析:DES算法具有极高安全性,最初,除了用穷举搜索法对DES算法进行攻击外,并没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。DES在总体上应该说是极其成功的,但在安全上也有其不足之处:(1)密钥太短:IBM原来的Lucifer算法的密钥长度是128位,而DES采用的是56位,这显然太短了。1998年7月17日美国EEF(Electronic Frontier Founation)宣布,他们用一台价值25万美元的改装计算机,只用了56个小时就穷举出一个DES密钥。1999年EFF将该穷举速度提高到24小时。(2)存在互补对称性:将密钥的每一位取反。用原来的密钥加密已知明文得到密文分组,那么用此密钥的补密钥加密此明文的补便可得到密文分组的补。这表明,对DES的选择明文攻击仅需要测试一半的密钥,从而穷举攻击的工作量也就减半。除了上述两点之外,DES的半公开性也是人们对DES颇有微辞的地方。在DES算法作为一个标准时,曾出现过许多的批评,其中之一就是针对S盒的。DES里的所有计算,除去S盒全是线性的,也就是说,计算两个输出的异或与先将两个对应输入异或再计算其输出是相同的。作为非线性部件,S盒针对密码体制的安全性至关重要。在算法提出时,就有人怀疑S盒隐藏了“陷门”。而美国国家安全局能够轻易的解密消息,同时还能宣称DES算法是“安全”的。当然无法否认这一猜测,然而到目前为止,并没有任何证据证明DES里的确存在陷门。事实上,后来表明DES里的S盒是被设计成能够防止某些类型的攻击的。在20世纪90年代初,Biham与Shamir发现差分分析时,美国国家安全局就已承认某些未公布的S盒设计原则正是为了使得差分密码分析变得不可行。事实上,差分密码分析在DES最初被研发时就已成为IBM的研究者所知,但这种方法却被保留了将近20年,直到Biham与Shamir又独立地发现了这种攻击。对DES算法最中肯的批评是,密钥太短。DES算法中只用到64位密钥中的其中56位,第8、16、24、.64位8个位并未参与DES运算,而是用作奇偶校验。在所有的密钥空间中有极少量的弱密钥,如全0和全F的密钥等,在选择时应尽量避免。这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,.64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,.64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,. .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。总之,DES密钥太短,超期服役的时间也太长。新的攻击手段不断出现,DES以面临实实在在的威胁。直接的威胁还是在于专用设备,由于芯片的速度越来越快,造价越来越便宜,导致专用设备的造价也大大的降低。DES算法除了差分密码分析另外两种最重要的密码攻击是穷尽密钥搜索和线性密码分析。对DES算法而言,线性攻击更有效。在1994年,一个实际的线性密码分析由其发明者Matsui提出。这是一个使用243对明文-密文,又用了40天来找到密钥。这个密码分析并未对DES的安全性产生实际影响,由于这个攻击需要数目极大的明-密文对,在现实世界中一个敌手很难积攒下用同一密钥加密的如此众多的明-密文对。 虽然DES加密算法已经过时,但它的基本理论和设计思想仍有重要参考价值。三大素数密码算法RSA3.1.实验内容:用高级语言实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法并且要求用代码实现RSA的加解密过程。3.2.实验目的: 进一步掌握大素数分解的一般原理和实现方法,并且对RSA加密算法的安全性进行分析了解。3.3.需求分析: 当前最著名、应用最广泛的公钥系统RSA是在1978年由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为获得数字签名和公开钥密码系统的方法的论文中提出的。RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。其名称来自于三个发明者的姓名首字母。 它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。素数问题是一个使很多数学家着迷的问题。素数就是一个除了l和它自身以外不能被其它数整除的数。素数的一个基本问题是如何有效地确定一个数是否是一个素数,即素性测试问题。素性测试问题不仅在数学上是一个有挑战性的问题,而且在实际应用中也是非常重要的。在现代密码系统中,大素数的判别和寻找对一些加密系统的建立起着关键作用。很多公钥密码算法都用到素数,特别是160位(二进制)以上的大素数。RSA的公共模数就是两个5 12位以上的大素数的乘积;由此可见对大数进行的素性判断的重要性。判定一个整数是否是素数,最为简单的想法是直接利用素数的定义,用比要判断的整数小的素数去一一试除,如果能整除被检测的数的话,那就能确定无疑为合数了但是对于大素数来说,由于计算量太大,根本无法实现以用于具体应用。所以科学家们根据素数判断的理论发明了许多新的算法,提高了判断一个大数是否是一个大素数的效率。由于素数在正整数序列中分布不规则,无法用公式直接计算出一个指定长度的大素数,所以当前采用的方法是随机产生一个大整数,再对其做素性检测.常见的素性检测法有 MillerRabin 检测、 Solovay - Strassen 检测法和 Lehman 检测法.目前,提高素数生成速度的方法是用 100 以内的小素数首先进行筛选这是因为判断大整数能否被小素数整除的时间要比各种概率测试法短得多,一般说来,这种筛选可以排除大整数不是素数 769毛的可能性;之后再进行 5 次 MillerRabin 检测,那么这个大数不是素数的概率就会降到1/1 000 以下,这样就加快了大素数生成的速度.RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。虽然自1978年提出以来,RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击,至今(2006年)未被完全攻破。随着越来越多的商业应用和标准化工作,RSA已经成为最具代表性的公钥加密技术。VISA、MasterCard、IBM、Microsoft等公司协力制定的安全电子交易标准(Secure Electronic Transactions,SET)就采用了标准RSA算法,这使得RSA在我们的生活中几乎无处不在。网上交易加密连接、网上银行身份验证、各种信用卡使用的数字证书、智能移动电话和存储卡的验证功能芯片等,大多数使用RSA技术。3.4. 程序流程图: Rabin Miller素数检验算法流程图 RSA的加密流程图3.5. 算法实现:3.5.1 Miller-Rabin素性测试法3.5.1.1算法描述: Miller-Rabin算法是基于Gary Miller的部分象法,由Michael Rabin发展。更多的人叫它“测试”,因为通过Miller-Rabin测试的并不一定就是素数,非素数通过测试的概率是1/4。Rabin Miller算法是一个概率算法,一轮 Rabin Miller 算法的最坏情况时间复杂度为(1+O(1)log2 (n)(以模n 乘 法为基本操作)。如果以单精度乘法操作作为时间复杂度的衡量,则一轮优化的 Rabin Miller算法的最

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论