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

下载本文档

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

文档简介

密码学课程设计报告班级:信安09-2班姓名:李明月学号:08093755目录1古典密码算法—凯撒密码41.1凯撒密码概述41.2算法原理及设计思想41.3主要算法分析41.4程序运行结果41.5密码安全性分析52序列密码—RC452.1RC4算法概述52.2算法原理及设计思想52.3程序主要算法分析62.4程序运行结果72.5算法分析73分组密码算法83.1DES加解密算法的实现83.1.1DES算法概述83.1.2算法原理及设计思想83.1.3程序主要算法分析113.1.4程序运行结果133.1.5安全性分析143.2AES加解密算法的实现143.2.1AES算法概述153.2.2算法原理及设计思想153.2.3程序主要算法分析173.2.4程序运行结果223.2.5安全性分析224HASH函数—MD5算法234.1算法概述234.2算法原理及设计思想234.3程序主要算法分析264.4程序运行结果284.5安全性分析281.5密码安全性分析凯撒密码是没有密钥的,即使没有密钥也能将它破解出来,因为凯撒移位密码只有25种密钥,最多就是将这25种可能性挨个检测一下可以了,这就是我们所说的暴力破解法。也可在用软件破解,不过我提倡用人工的。推理的方法:1、对于有空格的凯撒移位,单字母A和I是突破口,这无异相当于告诉了移动的位数,这样很容易就被破解了。所以,如果我们要用凯撒密码的话一定要去掉空格加大破解难。2、差数法有空格时,而又没有单字母A和I时,这种方法很,如果我们令A=1,B=2,C=3就是每个字母是字母的第几个,经过移位后的单词,每两相邻的字母之间的差值不变的。如the的差值为12,3(在这里我是用后面的一个字母减前面的一个字母,当然你也可以用后面的一个字母减前面的一个字母),移动后两个相邻字母的差值也将会是1,2,3。对于没有空格的恺撒破解起来就比有空格的难一些,对于没有空格的我们还要对密文进行分析,找出重复出现的字母串,然后对字母串进行猜测,例,如果有3个字母串,出现的次数比较高,我们就可以假设它为the因为3个字母串出现次最多的就是the,当然这不是一成不变的,这时应该就被破解了。序列密码—RC42.1RC4算法概述RC4加密算法是大名鼎鼎的RSA三人组中的头号人物RonRivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。RC4算法是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权(缴纳相应费用)的用户才能享受该服务。RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。2.2算法原理及设计思想RC4流密码是一种可变密钥长度、面向字节操作流密码。以随机置换为基础。广泛的用于SSL/TLS标准当中。RC4算法可以分为两个部分,第一是依据种子密钥,利用密钥调度算法对数据表S进行重新排列,第二部分是利用伪随机数生成算法,从已重新排列的数据表S中取出一个字节。每取出一个字节,数据表S将发生变化。RC4描述起来也很简单:用从1到256个字节(8-2048比特)的可变长度密钥初始化一个256字节的状态向量S,S的元素标记为S[0],S[1],…,S[255],从始至终置换后的S包含从0-255的所有8比特数。对于加密和解密,字节K由S中255个元素按照一定的方式选出一个元素生成。每生成一个K值,S中元素的个体就被重新置换一次。2.3程序主要算法分析初始化S开始时,S中的值被置为按升序0-255,即S[0]=0,S[1]=1,…,S[255]=255。同时建立一个临时变量T。如果密钥K的长度为256字节,则将K赋给T。否则若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素被赋值。然后用T产生的S初始置换,从S[0]到S[255],对每个S[i],根据T[i]确定的方案,将S[i]置换为S中的另一字节。因为对S的操作仅仅为交换,所以唯一的改变就是置换。S仍然包含所有值0-255的元素。voidrc4_setup(structrc4_state*s,unsignedchar*key,intlength)

{

inti,j,k,*m,a;s->x=0;

s->y=0;

m=s->m;for(i=0;i<256;i++)

{

m[i]=i;

}j=k=0;for(i=0;i<256;i++)

{

a=m[i];

j=(unsignedchar)(j+a+key[k]);

m[i]=m[j];m[j]=a;

if(++k>=length)k=0;

}

}密钥流的生成向量S一旦初始化完成,输入密钥就不再被使用。密钥流的生成是从S[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换。当S[255]完成置换后,操作继续重复从S[0]开始。加密中,将k的值与下一明文字节异或;解密中,将k的值与下一密文字节异或。voidrc4_crypt(structrc4_state*s,unsignedchar*data,intlength)

{

inti,x,y,*m,a,b;x=s->x;

y=s->y;

m=s->m;for(i=0;i<length;i++)

{

x=(unsignedchar)(x+1);a=m[x];

y=(unsignedchar)(y+a);

m[x]=b=m[y];

m[y]=a;

data[i]^=m[(unsignedchar)(a+b)];

}s->x=x;

s->y=y;

}2.4程序运行结果2.5算法分析RC4算法的优点是:算法简单、高效,特别适合软件实现,RC4是目前应用最广的商密级序列密码,目前被用于SSL/TLS标准中。由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。那么,RC4算法生成的子密钥序列是否会出现重复呢?经过我的测试,存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。但在2001年就有以色列科学家指出RC4加密算法存在着漏洞,这可能对无线通信网络的安全构成威胁。以色列魏茨曼研究所和美国思科公司的研究者发现,在使用“有线等效保密规则”(WEP)的无线网络中,在特定情况下,人们可以逆转RC4算法的加密过程,获取密钥,从而将己加密的信息解密。实现这一过程并不复杂,只需要使用一台个人电脑对加密的数据进行分析,经过几个小时的时间就可以破译出信息的全部内容。专家说,这并不表示所有使用RC4算法的软件都容易泄密,但它意味着RC4算法并不像人们原先认为的那样安全。这一发现可能促使人们重新设计无线通信网络,并且使用新的加密算法。分组密码DES加解密算法的实现DES加解密算法概述1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DESDataEncryptionStandard)。DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES是一个分组密码算法,它使用56位的密钥,以64位为单位对数据分组进行加密解密(密文和明文的分组长度相同,均为64位),DES加密与解密使用同一密钥,DES的保密性依赖于密钥。DES的加密过程可简单描述为三个阶段:3.1.2算法原理及设计思想DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:58,50,12,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,即将输入的第58位换到第一位,第50位换到第2位,……,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D550……D8;R0=D57D49...D7。经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示: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,5826,33,1,41,9,49,17,57,25,放大换位表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,单纯换位表16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25,在f(Ri,Ki)算法描述图中,S1,S2...S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,28)的功能表:选择函数SiS1:14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,S2:15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,S3:10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,S4:7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,S5:2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,S6:12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,S7:4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,S8:13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,加密流程图如下所示:密钥生成过程1、子密钥Ki(48bit)的生成算法初始Key值为64位,但DES算法规定,其中第8、16、64位是奇偶校验位,不参与DES运算。故Key实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key的位数由64位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:循环左移位数1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、……,最后一次用K0,算法本身并没有任何变化。密钥生成过程流程图如下所示:3.1.3程序主要算法分析(1)S盒功能通过下列函数来实现,将48位的输入转换成32位的输出如下所示:voidS_func(boolOut[32],constboolIn[48])//将48位转换成32位{intj,m,n;//膨胀后的比特串分为8组,每组6比特。for(j=0;j<8;j++,In+=6,Out+=4){m=(In[0]*2)+In[5];n=(In[1]*8)+(In[2]*4)+(In[3]*2)+In[4];ByteToBit(Out,&SBox[j][m][n],4);}}(2)函数F包括扩展置换,与子密钥异或,S盒变换及P盒变换,输入为32位,产生48位的中间结果,并最终产生32比特的输出voidF_func(boolIn[32],constboolKi[48]){staticboolMR[48];Transform(MR,In,EC,48);Xor(MR,Ki,48);//膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特,合并后又成为32比特。S_func(In,MR);//该32比特经过P变换后,输出的比特串才是32比特的f(Ri-1,Ki)Transform(In,In,PP,32);}(3)下面为子密钥生成函数,输入的种子密钥首先经过PC-1置换,将奇偶校验位删除,且剩余的56位密钥打乱重排然后再生成子密钥,具体过程如下所示:voidSetKey(charkey[8])//生成子密钥{inti;staticboolK[64],*KL=&K[0],*KR=&K[28];ByteToBit(K,key,64);//转换为二进制Transform(K,K,EP1,56);//64比特的密钥K,经过EP1后,生成56比特的串。//生成16个子密钥for(i=0;i<16;i++){//循环左移,合并RotateL(KL,28,LOOP[i]);RotateL(KR,28,LOOP[i]);Transform(SubKey[i],K,EP2,48);}}(4)下面为加密函数:voidCDES::Encryption(charout[8],charIn[8])//加密函数{ByteToBit(M,In,64);//转换为二进制Transform(M,M,IP,64); for(inti=0;i<16;i++){memcpy(tmp,Ri,32);F_func(Ri,SubKey[i]);Xor(Ri,Li,32);//将所得结果与明文的左32位进行异或memcpy(Li,tmp,32);//将明文的左右32位交换} Transform(M,M,LP,64);BitToByte(out,M,64);//return(out);}(5)下面为解密函数,实际上是加密的一个逆运算:voidCDES::Decryption(charout[8],charIn[8])//解密函数(加密的逆过程){ByteToBit(M,In,64);//转换为二进制Transform(M,M,IP,64); for(inti=15;i>=0;i--){memcpy(tmp,Li,32);F_func(Li,SubKey[i]);Xor(Li,Ri,32);memcpy(Ri,tmp,32);} Transform(M,M,LP,64);BitToByte(out,M,64);//return(out);}3.1.4程序的运行结果为:程序总的流程图如下所示:3.1.5安全性分析对DES安全性的主要争论:(1)、对DES的S盒、迭代次数、密钥长度等设计准则的争议(2)、DES存在着一些弱密钥和半弱密钥(3)、DES的56位密钥无法抵抗穷举工具对于DES算法可以利用互补性、弱密钥和半弱密钥、密钥搜索、差分分析和线性分析等方式进行攻击。对于DES密码也可使用穷举密钥攻击,n=256≈7×106,即使使用每秒种可以计算一百万个密钥的大型计算机,也需要算106天才能求得所使用的密钥,因此看来是很安全的。但是密码专家Diffie和Hellman指出,如果设计一种一微秒可以核算一个密钥的超大规模集成片,那么它在一天内可以核算8.64×1010个密钥。如果由一个百万个这样的集成片构成专用机,他们当时估计:这种专用机的造价约为两千万美元。在五年内分期偿还,平均每天约需付一万美元。由于用穷举法破译平均只需要计算半个密钥空间,因此获得解的平均时间为半天。为保证DES的安全性,又出现了2DES,三重DES等。AES加解密算法的实现AES算法概述AES加密算法即密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPSPUB197,并在2002年5月26日成为有效的标准。AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,AES加密数据块大小最大是256bit,但是密钥大小在理论上没有上限。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(InitialRound),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(FinalRound),最终轮没有MixColumns。3.2.2算法原理及设计思想AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES使用几种不同的方法来执行排列和置换运算。

AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。(1)首先将明文以字节为单位进行处理,以128位分组、128位的密钥为例。先将明文按字节分成列组,将明文的前四字节组成一列,接下来的4个字节组成第二列,后面的字节依次组成第三列和第四列,则组成了一个4乘4的矩阵。(2)AES也是由基本的变换单位“轮”多次迭代而成的。AES的轮变换由四个不同的变换组成:字节代替变换非线性的字节替代,单独处理每个字节:求该字节在有限域GF(28)上的乘法逆,"0"被映射为自身,即对于α∈GF(28),求β∈GF(28),使得α·β=β·α=1mod(x8+x4+x2+x+1)。对上一步求得的乘法逆作仿射变换yi=xi+x(i+4)mod8+x(i+6)mod8+x(i+7)mod8+ci(其中ci是6310即011000112的第i位)2)行移位变换行移位变换完成基于行的循环位移操作,变换方法:

即行移位变换作用于行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。列混合变换(最后一轮中没有)逐列混合,方法:b(x)=(03·x3+01·x2+01·x+02)·a(x)mod(x4+1)矩阵表示形式:与子密钥异或只是简单的将密钥按位异或到一个状态上。每轮加密密钥按顺序取自扩展密钥,扩展密钥是由初始密钥扩展而成。密钥扩展AES密钥扩展算法输入值是4字(16字节),输出值是一个44字(176字节)的一维线性数组,为初始轮密钥加阶段和其他10轮中的每一轮提供4字的轮秘密钥,输入密钥直接被复制到扩展密钥数组的前四个字,然后每次用四个字填充扩展密钥数组余下的部分3.2.3程序主要算法分析(1)程序编写的过程中严格按照AES算法的执行过程,将用到的参数及函数封装在AES类中,再进行调用,如下所示:classAES{public: AES(unsignedchar*key); virtual~AES();unsignedchar*Cipher(unsignedchar*input);unsignedchar*InvCipher(unsignedchar*input);void*Cipher(void*input,intlength=0); void*InvCipher(void*input,intlength);private:unsignedcharSbox[256];unsignedcharInvSbox[256];unsignedcharw[11][4][4];voidKeyExpansion(unsignedchar*key,unsignedcharw[][4][4]);unsignedcharFFmul(unsignedchara,unsignedcharb); voidSubBytes(unsignedcharstate[][4]); voidShiftRows(unsignedcharstate[][4]); voidMixColumns(unsignedcharstate[][4]); voidAddRoundKey(unsignedcharstate[][4],unsignedchark[][4]);voidInvSubBytes(unsignedcharstate[][4]);voidInvShiftRows(unsignedcharstate[][4]);voidInvMixColumns(unsignedcharstate[][4]);};(2)先将输入的明文按列序组合成4*4的矩阵,直接与第0组密钥(即输入的密钥)相加(异或),作为轮加密的输入然后循环10次进行SubBytes、ShiftRows、MixColumns、AddRoundKey运算,最后恢复原序列(3)需要注意的是最后一轮并不进行MixColumns(列混淆变换)加密过程函数Cipher,它只有一个参数,为输入的明文,函数的返回值为加密之后的密文,解密过程与加密过程类似。unsignedchar*AES::Cipher(unsignedchar*input){ unsignedcharstate[4][4];inti,r,c;//将明文按字节分成列组 for(r=0;r<4;r++){for(c=0;c<4;c++){ state[r][c]=input[c*4+r]; } }AddRoundKey(state,w[0]); for(i=1;i<=10;i++) {SubBytes(state);//字节代替ShiftRows(state);//行移位 if(i!=10)MixColumns(state);//列混合(最后一轮除外) AddRoundKey(state,w[i]);//与子密钥异或 }for(r=0;r<4;r++){for(c=0;c<4;c++){ input[c*4+r]=state[r][c]; }} returninput;}(4)下面是每一轮变换中的四个小变换的实现函数如下://字节代替,通过SBox表来实现的;voidAES::SubBytes(unsignedcharstate[][4]){ intr,c; for(r=0;r<4;r++) { for(c=0;c<4;c++) { state[r][c]=Sbox[state[r][c]]; } }}//行移位作用于行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。voidAES::ShiftRows(unsignedcharstate[][4]){ unsignedchart[4]; intr,c; for(r=1;r<4;r++) { for(c=0;c<4;c++) { t[c]=state[r][(c+r)%4]; } for(c=0;c<4;c++) { state[r][c]=t[c]; } }}//列混合FFmul为有限域GF(28)上的乘法,标准算法应该是循环8次(b与a的每一位相乘,结果相加),但这里只用到最低2位,解密时用到的逆列混淆也只用了低4位,所以在这里高4位的运算是多余的,只计算低4位。voidAES::MixColumns(unsignedcharstate[][4]){ unsignedchart[4]; intr,c; for(c=0;c<4;c++) { for(r=0;r<4;r++) { t[r]=state[r][c]; } for(r=0;r<4;r++) { state[r][c]=FFmul(0x02,t[r]) ^FFmul(0x03,t[(r+1)%4]) ^FFmul(0x01,t[(r+2)%4]) ^FFmul(0x01,t[(r+3)%4]); } }}//与子密钥异或voidAES::AddRoundKey(unsignedcharstate[][4],unsignedchark[][4]){ intr,c; for(c=0;c<4;c++) { for(r=0;r<4;r++) { state[r][c]^=k[r][c];//异或运算 } }}//密钥扩展//将前一列即第n-1组第三列的四个字节循环左移1个字节,并对每个字节进行字节代替变换SubBytes,将第一行(即第一个字节)与轮常量rc[n]相加,最后再与前一组该列相加voidAES::KeyExpansion(unsignedchar*key,unsignedcharw[][4][4]){ Inti,j,r,c; unsignedcharrc[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36}; for(r=0;r<4;r++) { for(c=0;c<4;c++) { w[0][r][c]=key[r+c*4]; } } for(i=1;i<=10;i++) { for(j=0;j<4;j++) { unsignedchart[4]; for(r=0;r<4;r++) { t[r]=j?w[i][r][j-1]:w[i-1][r][3]; } if(j==0) { unsignedchartemp=t[0]; for(r=0;r<3;r++) { t[r]=Sbox[t[(r+1)%4]]; } t[3]=Sbox[temp]; t[0]^=rc[i-1]; } for(r=0;r<4;r++) { w[i][r][j]=w[i-1][r][j]^t[r]; } } }}3.2.4程序运行结果输入为数字3.2.5安全性分析暴力攻击单就密钥长度来看,AES里面最少128位的密钥绝对比DES的56位密钥要安全的多统计攻击已经有很多的测试都无法对AES所产生的密文进行统计攻击差分攻击与线性攻击AES系统目前仍然没有任何已知的差分攻击或者线性攻击存在。HASH函数—MD5算法4.1算法概述MessageDigestAlgorithmMD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。4.2算法原理及设计思想MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(BitsLength)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。MD5中有四个32位被称作链接变量(ChainingVariable)的整数参数,他们分别为:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。以下是每次操作中用到的四个非线性函数(每轮一个)。F(X,Y,Z)=(X&Y)|((~X)&Z)G(X,Y,Z)=(X&Z)|(Y&(~Z))H(X,Y,Z)=X^Y^ZI(X,Y,Z)=Y^(X|(~Z))(&是与,|是或,~是非,^是异或)这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。假设Mj表示消息的第j个子分组(从0到15),常数ti是4294967296*abs(sin(i))的整数部分,i取值从1到64,单位是弧度。(4294967296等于2的32次方)FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<s)GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<s)HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<s)II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<s)这四轮(64步)是:第一轮FF(a,b,c,d,M0,7,0xd76aa478)FF(d,a,b,c,M1,12,0xe8c7b756)FF(c,d,a,b,M2,17,0x242070db)FF(b,c,d,a,M3,22,0xc1bdceee)FF(a,b,c,d,M4,7,0xf57c0faf)FF(d,a,b,c,M5,12,0x4787c62a)FF(c,d,a,b,M6,17,0xa8304613)FF(b,c,d,a,M7,22,0xfd469501)FF(a,b,c,d,M8,7,0x698098d8)FF(d,a,b,c,M9,12,0x8b44f7af)FF(c,d,a,b,M10,17,0xffff5bb1)FF(b,c,d,a,M11,22,0x895cd7be)FF(a,b,c,d,M12,7,0x6b901122)FF(d,a,b,c,M13,12,0xfd987193)FF(c,d,a,b,M14,17,0xa679438e)FF(b,c,d,a,M15,22,0x49b40821)第二轮GG(a,b,c,d,M1,5,0xf61e2562)GG(d,a,b,c,M6,9,0xc040b340)GG(c,d,a,b,M11,14,0x265e5a51)GG(b,c,d,a,M0,20,0xe9b6c7aa)GG(a,b,c,d,M5,5,0xd62f105d)GG(d,a,b,c,M10,9,0x02441453)GG(c,d,a,b,M15,14,0xd8a1e681)GG(b,c,d,a,M4,20,0xe7d3fbc8)GG(a,b,c,d,M9,5,0x21e1cde6)GG(d,a,b,c,M14,9,0xc33707d6)GG(c,d,a,b,M3,14,0xf4d50d87)GG(b,c,d,a,M8,20,0x455a14ed)GG(a,b,c,d,M13,5,0xa9e3e905)GG(d,a,b,c,M2,9,0xfcefa3f8)GG(c,d,a,b,M7,14,0x676f02d9)GG(b,c,d,a,M12,20,0x8d2a4c8a)第三轮HH(a,b,c,d,M5,4,0xfffa3942)HH(d,a,b,c,M8,11,0x8771f681)HH(c,d,a,b,M11,16,0x6d9d6122)HH(b,c,d,a,M14,23,0xfde5380c)HH(a,b,c,d,M1,4,0xa4beea44)HH(d,a,b,c,M4,11,0x4bdecfa9)HH(c,d,a,b,M7,16,0xf6bb4b60)HH(b,c,d,a,M10,23,0xbebfbc70)HH(a,b,c,d,M13,4,0x289b7ec6)HH(d,a,b,c,M0,11,0xeaa127fa)HH(c,d,a,b,M3,16,0xd4ef3085)HH(b,c,d,a,M6,23,0x04881d05)HH(a,b,c,d,M9,4,0xd9d4d039)HH(d,a,b,c,M12,11,0xe6db99e5)HH(c,d,a,b,M15,16,0x1fa27cf8)HH(b,c,d,a,M2,23,0xc4ac5665)第四轮II(a,b,c,d,M0,6,0xf4292244)II(d,a,b,c,M7,10,0x432aff97)II(c,d,a,b,M14,15,0xab9423a7)II(b,c,d,a,M5,21,0xfc93a039)II(a,b,c,d,M12,6,0x655b59c3)II(d,a,b,c,M3,10,0x8f0ccc92)II(c,d,a,b,M10,15,0xffeff47d)II(b,c,d,a,M1,21,0x85845dd1)II(a,b,c,d,M8,6,0x6fa87e4f)II(d,a,b,c,M15,10,0xfe2ce6e0)II(c,d,a,b,M6,15,0xa3014314)II(b,c,d,a,M13,21,0x4e0811a1)II(a,b,c,d,M4,6,0xf7537e82)II(d,a,b,c,M11,10,0xbd3af235)II(c,d,a,b,M2,15,0x2ad7d2bb)II(b,c,d,a,M9,21,0xeb86d391)所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。主要过程如下所示:程序主要算法分析(1)MD5压缩函数要经过四轮处理过程,四轮处理过程中使用的基本逻辑函数在程序的开始做出声明,每个函数的输入是三个32位的字,输出是一个32位的字。#defineF(x,y,z)(((x)&(y))|((~x)&(z)))#defineG(x,y,z)(((x)&(z))|((y)&(~z)))#defineH(x,y,z)((x)^(y)^(z))#defineI(x,y,z)((y)^((x)|(~z)))(2)对应于四轮的基本操作即移位操作函数如下:#defineFF(a,b,c,d,x,s,ac){ (a)+=F((b),(c),(d))+(x)+ac; (a)=ROTATE_LEFT((a),(s)); (a)+=(b);}#defineGG(a,b,c,d,x,s,ac){ (a)+=G((b),(c),(d))+(x)+ac; (a)=ROTATE_LEFT((a),(s)); (a)+=(b);}#defineHH(a,b,c,d,x,s,ac){ (a)+=H((b),(c),(d))+(x)+ac; (a)=ROTATE_LEFT((a),(s)); (a)+=(b);}#defineII(a,b,c,d,x,s,ac){ (a)+=I((b),(c),(d))+(x)+ac; (a)=ROTATE_LEFT((a),(s)); (a)+=(b);}(3)更新输入,即消息的填充和添加消息长度:voidMD5::update(constbyte*input,size_tlength){ uint32i,index,partLen; _finished=false; index=(uint32)((_count[0]>>3)&0x3f); if((_count[0]+=((uint32)length<<3))<((uint32)length<<3){ ++_count[1]; } _count[1]+=((uint32)length>>29); partLen=64-index;//计算已有的消息的bits长度的字节数的模//用于判断已有消息加上当前传过来的消息总长度能不能达到512bits,如果能够达到则对凑够的512bits进行一次处理 if(length>=partLen){ memcpy(&_buffer[index],input,partLen); transform(_buffer);//对当前输入的剩余字节做转换 for(i=partLen;i+63<length;i+=64){ transform(&input[i]); } index=0; }else{ i=0; } memcpy(&_buffer[index],&input[i],length-i);}(4)获取加密的最终结果:voidMD5::final(){ bytebits[8]; uint32oldState[4]; uint32oldCount[2]; uint32index,padLen; //保存当前状态 memcpy(oldState,_state,16); memcpy(oldCount,_count,8);//将要被转换的信息的bits长度拷贝到bits中 encode(_count,bits,8);//计算所有的bits长度的字节数的模64 index=(uint32)((_count[0]>>3)&0x3f);//计算需要填充的字节数,padLen的取值范围在1-64之间 padLen=(index<56)?(56-index):(120-index);//这一次函数笤俑绝对不会再导致MD5Transform的被调用,因为这一次不会填满512bits update(PADDING,padLen); update(bits,8); //将结果保存到digest中 encode(_state,_digest,16); memcpy(_state,oldState,16); memcpy(_count,oldCount,8);}程序运行结果如下所示安全性分析MD5算法中,输出的每一位都是输入的每一位的函数,逻辑函数F、G、H、I的复杂迭代使得输出对输入的依赖非常小。但是,Berson已经证明,对单轮的MD5算法,利用差分密码分析,可以在合理时间内找出摘要相同的两条报文。MD5算法抗密码分析的能力较弱,对MD5的生日攻击所需代价是需要试验264个消息。2004年8月17日,在美国加州圣巴巴拉召开的美密会(Crypto2004)上,中国的王小云、冯登国、来学嘉、于红波4位学者宣布,只需1小时就可找出MD5的碰撞。(利用差分分析)公钥密码算法--RSA5.1算法概述MIT三位年青数学家R.L.Rivest,A.Shamir和L.Adleman在1978年发现了一种用数论构造双钥体制的方法,称作MIT体制,后来被广泛称之为RSA体制。它既可用于加密、又可用于数字签名。RSA算法的安全性基于数论中大整数分解的困难性。RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。算法原理及设计思想5.2.1算法描述-密钥产生KG():独立地选取两大素数p和q(各100~200位十进制数字)计算n=p×q,其欧拉函数值j(n)=(p-1)(q-1)随机选一整数e,1£e<j(n),gcd(j(n),e)=1(4)在模j(n)下,计算e的有逆元d=e-1modj(n)(5)以n,e为公钥。私钥为d。(p,q不再需要,可以销毁。)5.2.2算法描述-加密E()和解密D():(1)加密将明文分组,各组对应的十进制数小于nc=memodn(2)解密m=cdmodn5.2.3原理:RSA算法满足公开密钥加密的要求,必须符合下列条件(1)有可能找到e,d,n的值,使得对所有M<n有Medmodn=M(2)对于所有M<n的值,要计算Me和Cd是相对容易的(3)在给定e和n时,计算出d是不可行的(4)几个关系φ(n)=φ(pq)=φ(p)φ(q)=(p-1)(q-1),p,qareprimeedmodφ(n)=1,ed=kφ(n)+1,即ed≡1modφ(n),d≡e-1modφ(n)5.3程序主要算法分析//求b模a的乘法逆,扩展Euclidian算法longdoubleinverse(longdoublea,longdoubleb){longdoublea0,b0,t0,t,q,r;//用t返回要求的a的值a0=a;b0=b;t0=0;t=1;q=floor(a0/b0);//取整r=a0-q*b0;while(r>0){longdoubletemp;temp=fmod((t0-q*t),a);t0=t;t=temp;a0=b0;b0=r;q=floor(a0/b0);r=a0-q*b0;}//选择的b不满足if(b0!=1)cout<<"Failed!Pleasecheckbyouentered."<<endl;//gcd(mult_n,b)=1elsereturnt;}//处理用户输入的字符串,用RSA密码体制加解密voidenc_dec(doublett,doublenn){doublet=tt;//传递的a或bdoublen=nn;/

温馨提示

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

评论

0/150

提交评论