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

下载本文档

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

文档简介

经典word整理文档,仅参考,双击此处可删除页眉页脚。本资料属于网络整理,如有侵权,请联系删除,谢谢!密码学课程设计目录解密解密解密解密密码学课程设计一.实验目的理;培养学生将密码理论和技术应用于实际的能力,使学生具备实施数据加/脱密和基本的密码分析的能力。二.实验内容及基本要求2.1、分组密码SPN的编程实现①加密:输入初始加密密钥和一串有意义的字符串,显示相应的加密结果;②线性分析:通过对明密文对的线性分析,破解出初始加密密钥;③差分分析:通过对明密文对的差分分析,破解出初始加密密钥;以及密文显示栏;2.2、RSA的加解密及快速加解密①编制或网上下载大素数生成算法,产生二个大素数p和q;②编写RSA的加/解密过程和快速加/解密过程;③通过调用时钟对二种加/解密方法的时间开销进行测试;④/解密方式选择,快速方式与一般方式的选择及时间开销显示。2.3、随机性检测密文的随机性反映了密码的强度,通过设计随机性测试算法或运用工具对SPN生成的密文进行随机性检测,来测试SPN的密码强度。三.实验原理3.1、分组密码SPN迭代密码的核心是一个密钥编排方案和一个轮函数1密码学课程设计密钥编排方案对密钥k进行变换,生成Nr个子密钥(也叫轮密钥),记为k1,k2,...,kNr轮函数g是一个状态加密函数,以ki为密钥对当前状态w进行变换,输r-1出新的状态值w,即g(w,k)=w;轮函数是单射函数,存在一个逆变换g,有rr-1ir-1g(w,k)=w-1rir-1迭代密码的加密为将密钥k编排成Nr个轮密钥k,k,...,k,将明文x定义12Nr为初始状态w,经过Nr轮变换得到w为密文,即0Nrw=x,w=g(w,k),w=g(w,k),...0101212w=g(w,k),w=g(w,k)Nr-1Nr-2Nr-1NrNr-1NrNr迭代密码的解密为将密文y定义为初始状态w,经过Nr轮逆变换得到wNr0为明文x,即y=w,w=g(w,k,w=g(w,k)NrNr-1-1NrNrNr-2-1Nr-1Nr-1...w=g(w,k),w=g(w,k),1-1220-111x=w0(2)代替置换网络(Substitution-PermutationNetwork)代替置换网络(Substitution-PermutationNetwork)理的明文单元和状态值长度为l×m,轮函数g包括两个核心变换——代替和置换,分别记为πs和πp,有πs:{0,1}l→{0,1}lπp:{1,2,...,lm}→{1,2,...,lm}在进行轮函数变换前,先用轮密钥和状态值进行异或称为白化)(3)SPN密码体制设计设l,m,Nr是正整数,P=C={0,1}lmK({0,1}lm)Nr+1是由初始密钥k用密钥编排算法生成的所有可能的密钥编排方案集合,一个密钥编排方案记为(k1,k2,...,kNr+1)状态值w长度为l×m,记为w1,w2,...,wlm;w可以看成m个长度为l的子串连接而成,记为w=w<1>,w<2>,...,w<m>,其中w<i>=w(i-1)l+1,w(i-1)l+2,...,w(i-1)l+l加密过程使用如下算法描述:w=x0forr=1toNr-1{u=w⊕k//白化rr-1rfori=1tom{vπ(u)//代替rr<i>s<i>}w=(v,vrp(2),...,vπp(lm))//置换rrπp(1)π}u=w⊕kNrNr-1Nrfori=1tom{vπs(u)//代替NrNr<i><i>}2密码学课程设计y=v⊕k//白化NrNr+1returny具体加密过程如图3.1所示:图(4)线性密码分析SSx和,确定k或k的部分比特。其中,S盒的选择对SPN的安全性影响巨大,假设一个S盒按如下规则设计,见图3.2图S可以发现其实是将输入进行了循环左移,如图3.3图3密码学课程设计采用已知明文攻击方法,如果掌握了足够多的明-密文对,即可求出轮密钥ki,进而根据轮密钥编排方案反向推导出加密密钥k。线性密码分析思路为找到足够多的明文-密文对,对可能的密钥进行穷举,计算相关随机变量的偏差,正确的密钥作用下,偏差的绝对值最大穷举,这些密钥比特称为候选子密钥具体算法如下:线性攻击(T,T,π)-1sfor(L,L)=(0,0)to(F,F){//L,L表示候选子密钥k和k551212<2><4>Count[L,L]=0//每个候选子密钥分配一个计数器并初始化12为0}foreach(x,y)∈T{for(L,L)=(0,0)to(F,F){12v4=L⊕yv4=L⊕y<2>1<2><4><4>2u=π(v)4-1s4<2><2>u4=π(v)-1s4<4><4>z=xxx⊕u⊕u⊕u⊕u//计算随机变量值4484144165786ifz=0{Count[L,L]++;12}}max=-1for(L,L)=(0,0)to(F,F){12Count[L,L]=|Count[L,L]-T/2|1212ifCount[L,L]>max{12max=Count[L,L]maxkey=(L,L)1212}//maxkey即为所求子密钥(4)差分密码分析通过分析明文对的差值对密文对差值的影响来恢复某些密钥比特的分析方对,每对明文的异或结果相同,观察相应的密文异或结果。线性分析。仍以“循环左移”S盒为例假设两个输入分别是x=1010和x*=1101则相应的输出是y=0101和y*=1011输入的异或为x’x*=0111输出的异或为’⊕y*=11104密码学课程设计可以发现不论x和x*如何变化,只要它们的异或是0111,相应输出的异或都是1110,(x’’被称为一个差分如果S盒是线性的,整个SPN也会是线性的,明文和密文的差分也会是线性的差分分析的优势在于,分析过程基本可以忽略密钥的干扰作用。差分密码分析思路找到足够多的四元组,其中x’⊕x*固定不变。对可能的密钥进行穷举,计算相关差分的扩散率,正确的密钥作用下,扩散率应最大行穷举即可。具体算法如下:差分攻击(T,T,πs-1)for(L,L)=(0,0)to(F,F){//L1,L2表示候选子密钥和k5<4>12Count[L,L]=0//每个候选子密钥分配一个计数器并初始化为012}foreach(x,x*,y,y*)∈T{if(y<1>=y*<1>andy<3>=y*<3>){//只考虑<1>和<3>=0for(L,L)=(0,0)to(F,F){12v=L⊕y4<2>1<2>v4=L⊕yu4=π(v)u4=π(v)<4>2<4>-14<2>s<2>-14<4>s<4>(v)*=L⊕(y)*4<2>1<2>(v)*=L⊕(y)*4<4>2<4>(u)*=π((v)*)4-1s4<2><2>(u)*=π((v)*)4-1s4<4><4>(u’=u⊕(u)*444<2><2><2>(u’=u⊕(u)*444<4><4><4>if(u)’=0110and(u)’=0110{44<2><4>Count[L,L]++;12}}}}max=-1for(L,L)=(0,0)to(F,F){12ifCount[L,L]>max{12max=Count[L,L]12maxkey=(L,L)}12}//maxkey即为所求子密钥5密码学课程设计3.2、RSA的加解密及快速加解密密的密钥,它是可以公开的,称为公钥;另一个是用于解密的密钥,是保密的,信息发送人的身份进行验证手段,是现代密码学最重要的发明。RSA1977年由Rivest、Shamir和Adleman提出的第一个比较完善的非对称密码算法。它的安全性是建全性还未能得到理论证明,但经过20多年的密码分析和攻击,迄今仍然被实践证明是安全的。RSA算法描述如下:(1)公钥选择两个互异的大素数p和q,n是二者的乘积,即n=pq,使Φ(n)=(p-1)(q-1)为欧拉函数。随机选取正整数,使其满足gcd(e,Φ(n)),即e和Φ(n)互质,则将作为公钥。(2)私钥求出正数d,使其满足×d=1(modΦ(n)),则将(n,d)作为私钥。(3)加密算法对于明文M,由C=M(modn),得到密文C。e(4)解密算法对于密文C,由M=C(mod,得到明文M。d如果窃密者获得了n、e和密文C,为了破解密文必须计算出私钥d,为此需要先分解n。为了提高破解难度,达到更高的安全性,一般商业应用要求n的长度不小于1024位,更重要的场合不小于2048位。3.3、随机性检测随机性测试方法对于一个用DES加密产生的密文序列,分别以下面三种情况设计测试随机性工具(1)0和1在密文中所占比例(2)00、01、10、11在密文中所占比例(3)000、001、010、、100、101、、111在密文中所占比例6密码学课程设计四.实验过程5.1、分组密码SPN5.1.1SPN加密该部分首先确定选用数据结构,我选用C#中的List类型来存储切分后的明文单元与加密后的密文单元以及用于显示的stringList这种数据结构在添加元素的时候类似于C语言中的链表,动态存储,这样就适应了明文大小不确定的特点,避免了申请固定存储空间大小带来的麻烦。对于S盒与P盒,我采用一维数组的数据结构来存储相关信息。具体声明如下:staticpublicUInt16[]S=newUInt16[16]{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};//S盒staticpublicUInt16[]S_ni=newUInt16[16]{14,3,4,8,1,12,10,15,7,13,9,6,11,2,0,5};//S盒逆置换staticpublicint[]P=newint[16]{1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16};//P盒staticpublicUInt32K;staticpublicUInt32ceshi;staticpublicList<UInt16>X=newList<ushort>();//放明文staticpublicList<UInt16>code=newList<ushort>();staticpublicList<string>miwen=newList<string>();//放密文(二)具体代码实施该部分主要依照SPN加密的原理来进行对明文的加密,并将密文转码之后转成字符串显示出来。主要按照以下几个步骤完成:(1)根据初始密钥,生成轮密钥。string从一个32比特的密钥开始,对轮数1=<r<=5,定义K是由K开始的16个连续的比特组成。具体实现代码如下:将初始密钥字符串转成二进制:r4r-3stringstr=key.Text;byte[]kk=Encoding.Default.GetBytes(str);for(i=0;i<kk.Length;i++)kk[i]=(byte)((uint)kk[i]-48);for(i=kk.Length-1;i>=0;i--){p=(UInt32)(kk[i]<<(kk.Length-i-1));number=(UInt32)(number|p);}生成轮密钥://获取轮函数7密码学课程设计publicstaticList<UInt16>Cycle(UInt32K){List<UInt16>mylist=newList<ushort>();UInt32T;inti;for(i=0;i<5;i++){T=K&0XFFFF0000;T=T>>16;mylist.Add((UInt16)T);K=K<<4;}returnmylist;}(2)切分明文,并进行加密string文切分。string转成byte数组,再将两个数组单元拼接成一个16比特位的单元,若数组元素个数为基数,则在最后一个单元补上8个0,凑成一个16比特位的单元。具体代码如下:整体函数(包括切分)strings=T1.Text;byte[]b=Encoding.Default.GetBytes(s);UInt16current_x=0,current_y=0;for(i=0;i<b.Length-1;i+=2){//拼接成16bit数进行加密current_x=(UInt16)((b[i]<<8)|(b[i+1]));Class1.X.Add(current_x);current_y=current_x;current_y=decipher(current_y,Class1.K);Class1.code.Add(current_y);rr[0]=(byte)(((((current_y&0xff00))>>8)%48)+48);stringr=Encoding.Default.GetString(rr);Class1.miwen.Add(r);rr[0]=(byte)(((((current_y&0x00ff))>>8)%48)+48);r=Encoding.Default.GetString(rr);Class1.miwen.Add(r);}if(i==b.Length-1){current_x=(UInt16)b[i];Class1.X.Add(current_x);current_y=current_x;8密码学课程设计current_y=decipher(current_y,Class1.K);Class1.code.Add(current_y);rr[0]=(byte)((((current_y&0x00ff))%48)+48);stringr=Encoding.Default.GetString(rr);Class1.miwen.Add(r);}置换函数://置换函数publicstaticUInt16Substitute(UInt16u){intn,i;UInt16m,v=0;for(i=0;i<4;i++){m=(UInt16)(u&0X000F);n=Class1.S[m];n=(UInt16)(n<<4*i);v=(UInt16)(v|n);u=(UInt16)(u>>4);}returnv;}代换函数:publicstaticUInt16Pjiami(UInt16v){BitArrayarray1=UInt16toBitArray(v);BitArrayarray2=UInt16toBitArray(v);inti;for(i=0;i<16;i++){array2[(Class1.P[i])-1]=array1[15-i];}returnBitArraytoUInt16(array2);}加密函数:publicstaticUInt16decipher(UInt16current_y,UInt32K){intr;List<UInt16>mylist=newList<ushort>();mylist=Cycle(K);for(r=0;r<3;r++){//生成轮函数current_y=(UInt16)(current_y^mylist[r]);//异或current_y=Substitute(current_y);//置换9密码学课程设计current_y=Pjiami(current_y);//代换}current_y=(UInt16)(current_y^mylist[3]);current_y=Substitute(current_y);current_y=(UInt16)(current_y^mylist[4]);returncurrent_y;//异或//置换//异或}(3)将密文转成字符串显示出来foreach(stringcinClass1.miwen){MI.Text+=c;}5.1.2线性密码分析下:privatevoidButton_Click_1(objectsender,RoutedEventArgse){UInt16L=0,L1=0,L2=0,V2,V4,U2,U4,Z,max_key=0,r_i;inti,max;int[]count=newint[256];Class1.X.Clear();Class1.code.Clear();Randomr=newRandom();for(i=0;i<20000;i++){r_i=(UInt16)(r.Next(0,65535));Class1.X.Add(r_i);r_i=decipher(r_i,Class1.K);Class1.code.Add(r_i);}for(L=0;L<256;L++)count[L]=0;//为256个计数器赋初值for(i=0;i<Class1.X.Count;i++){for(L=0;L<256;L++){L1=(UInt16)(L>>4);L2=(UInt16)(L&0x000f);V2=(UInt16)(((Class1.code[i]&0x0f00)>>8)^L1);V4=(UInt16)((Class1.code[i]&0x000f)^L2);U2=Class1.S_ni[V2];U4=Class1.S_ni[V4];//S的逆置换Z=(UInt16)(((Class1.X[i]>>11)&0x0001)^10密码学课程设计((Class1.X[i]>>9)&0x0001)^((Class1.X[i]>>8)&0x0001)^((U2>>2)&0x0001)^(U2&0x0001)^((U4>>2)&0x0001)^(U4&0x0001));if(Z==0)count[L]++;}}max=-1;for(L=0;L<256;L++){count[L]=Math.Abs(count[L]-10000);if(count[L]>max){max=count[L];max_key=L;//得出L1,L2}}//暴力破解UInt32M,N=0;UInt32M1,M2,M3,M4,M5,M6,M7,M8,M9,gg;List<string>hhh=newList<string>();for(M=0;M<16777215;M++){if(M==16777214)gg=0;M1=(UInt32)((M&0x00f00000)>>20);M2=(UInt32)((M&0x00f0000)>>16);M3=(UInt32)((M&0x000f000)>>12);M4=(UInt32)((M&0x0000f00)>>8);M5=(UInt32)((M&0x00000f0)>>4);M6=(UInt32)((max_key&0xf0)>>4);M7=(UInt32)((M&0x00000f));M8=(UInt32)(max_key&0xf);N=(UInt32)((M1<<28)|(M2<<24)|(M3<<20)|(M4<<16)|(M5<<12)|(M6<<8)|(M7<<4)|M8);Class1.ceshi=N;boolresult=true;for(i=0;i<Class1.X.Count;i++){if(result==true){if(decipher(Class1.X[i],Class1.ceshi)!=Class1.code[i]){result=false;break;11密码学课程设计}}if(result==false)break;}if(result==true)break;}while(N!=0){M9=(UInt16)((N&0x80000000)>>31);hhh.Add(M9.ToString());N=N<<1;}jieguo.Text=string.Empty;foreach(stringcinhhh){jieguo.Text+=c;}}5.1.3差分密码分析下:privatevoidButton_Click_2(objectsender,RoutedEventArgse){inti,max;UInt16r_i,L,L1,L2,V2,V4,U2,U4,V2_B;UInt16U2_B,V4_B,U4_B,U2_L,U4_L,max_key=0;//随机数生成Class1.X.Clear();Class1.code.Clear();Class1.X_b.Clear();Class1.code_b.Clear();int[]count=newint[256];Randomr=newRandom();for(i=0;i<400;i++){r_i=(UInt16)(r.Next(0,65535));Class1.X.Add(r_i);//r_i=xClass1.X_b.Add(company(r_i));//r_i=xUInt16xx=company(r_i);Class1.code_b.Add(decipher(xx,Class1.K));12密码学课程设计r_i=decipher(r_i,Class1.K);Class1.code.Add(r_i);}//计数器初始化for(L=0;L<256;L++)count[L]=0;for(i=0;i<Class1.X.Count;i++){if(((Class1.code[i]&0xf000)==(Class1.code_b[i]&0xf000))&&((Class1.code[i]&0x00f0)==(Class1.code_b[i]&0x00f0))){for(L=0;L<256;L++){L1=(UInt16)(L>>4);L2=(UInt16)(L&0x000f);V2=(UInt16)(L1^((Class1.code[i]&0x0f00)>>8));V4=(UInt16)(L2^(Class1.code[i]&0x000f));U2=Class1.S_ni[V2];U4=Class1.S_ni[V4];V2_B=(UInt16)(L1^(((Class1.code_b[i])&0x0f00)>>8));V4_B=(UInt16)(L2^((Class1.code_b[i])&0x000f));U2_B=Class1.S_ni[V2_B];U4_B=Class1.S_ni[V4_B];U2_L=(UInt16)(U2^U2_B);U4_L=(UInt16)(U4^U4_B);if((U2_L==0x6)&&(U4_L==0x6))count[L]++;}}}max=-1;for(L=0;L<256;L++){if(count[L]>max){max=count[L];max_key=L;}}//暴力破解UInt32M,N=0;UInt32M1,M2,M3,M4,M5,M6,M7,M8,M9,gg;List<string>hhh=newList<string>();for(M=0;M<16777215;M++){13密码学课程设计if(M==16777214)gg=0;M1=(UInt32)((M&0x00f00000)>>20);M2=(UInt32)((M&0x00f0000)>>16);M3=(UInt32)((M&0x000f000)>>12);M4=(UInt32)((M&0x0000f00)>>8);M5=(UInt32)((M&0x00000f0)>>4);M6=(UInt32)((max_key&0xf0)>>4);M7=(UInt32)((M&0x00000f));M8=(UInt32)(max_key&0xf);N=(UInt32)((M1<<28)|(M2<<24)|(M3<<20)|(M4<<16)|(M5<<12)|(M6<<8)|(M7<<4)|M8);Class1.ceshi=N;boolresult=true;for(i=0;i<Class1.X.Count;i++){if(result==true){if(decipher(Class1.X[i],Class1.ceshi)!=Class1.code[i]){result=false;break;}}if(result==false)break;}if(result==true)break;}while(N!=0){M9=(UInt16)((N&0x80000000)>>31);hhh.Add(M9.ToString());N=N<<1;}jieguo.Text=string.Empty;foreach(stringcinhhh){jieguo.Text+=c;}}staticpublicUInt16company(UInt16X)//求伴随{UInt16c=0x0B00;14密码学课程设计UInt16D;D=(UInt16)(X^c);returnD;}5.2、RSA的加解密及快速加解密该部分RSA的加解密原理比较容易理解,难点在于大数的模幂运算,若采用普题:5.1.1生成大素数的一个素数,其中涉及到了大数的生成,素数的判断等算法,具体步骤如下:(1)的字符串,然后将该字符串转成大数,具体代码实现如下:随机生成字符串privatestringRandomstring(inta){stringPASSWORD_CHARS_LCASE="1234567890";intlength=PASSWORD_CHARS_LCASE.Length;intpasswordlen=a;StringBuildersb=newStringBuilder(passwordlen);for(inti=0;i<passwordlen;i++){intn=RandomNumber(0,length);sb.Append(PASSWORD_CHARS_LCASE[n]);}returnsb.ToString();}字符串转成大数stringsr=Randomstring(len);//随机生成字符串BigIntegera=BigInteger.Parse(sr);(2)寻找比n大的最近的素数,其中涉及miller-rabin算法来进行素性检测,具体代码如下:NextPrime:生成比n大的素数,len指定长度privateBigIntegerNextPrime(intlen){BigInteger[]primegap=newBigInteger[167]{2,2,4,2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6,6,4,6,6,2,10,2,4,2,12,12,4,2,4,6,2,10,6,6,6,2,6,4,2,10,14,4,2,15密码学课程设计4,14,6,10,2,4,6,8,6,6,4,6,8,4,8,10,2,10,2,6,4,6,8,4,2,4,12,8,4,8,4,6,12,2,18,6,10,6,6,2,6,10,6,6,2,6,6,4,2,12,10,2,4,6,6,2,12,4,6,8,10,8,10,8,6,6,4,8,6,4,8,4,14,10,12,2,10,2,4,2,10,14,4,2,4,14,4,2,4,20,4,8,10,8,4,6,6,14,4,6,6,8,6,12};L:BigIntegern=BigInteger.Parse(Randomstring(len));if(n<2)return2;BigIntegerp=n+1;if(p.IsEven)p++;if(p<=7)return7;BigIntegerprime_limit=167;BigIntegerprime;BigInteger[]moduli=newBigInteger[167];inti;for(;;){prime=3;for(i=0;i<167;i++){moduli[i]=prime%p;prime+=primegap[i];}BigIntegerdifference=0,incr=0;for(;incr<0x10000;difference+=2){prime=3;for(i=0;i<167;i++){BigIntegerr;r=(moduli[i]+incr)%prime;prime+=primegap[i];if(r==0)gotonext;}p=p+difference;difference=0;if(p.ToString().Length>len)gotoL;if(panduan(p,25))gotodone;next:;incr+=2;16密码学课程设计}BigIntegermp=p+difference;difference=0;}done:;returnp;}privatevoidButton_Click_2(objectsender,RoutedEventArgse){inti=int.Parse(T_enum.Text);BigIntegern=0;do{strings=Randomstring(i);n=BigInteger.Parse(s);}while((BigInteger.GreatestCommonDivisor(n,BigInteger.Parse(n_1.Text))!=1)||(n%BigInteger.Parse(n_1.Text)==1));T_e.Text=(n%BigInteger.Parse(n_1.Text)).ToString();BigIntegerd=Ni(n%BigInteger.Parse(n_1.Text),BigInteger.Parse(n_1.Text),refClass1.NX,refClass1.NY);while(Class1.NX<0)Class1.NX+=BigInteger.Parse(n_1.Text);T_d.Text=Class1.NX.ToString();}Miller-Rabin算法素性检测privateboolpanduan(BigIntegernumber1,intlength){BigIntegernumber2=1;BigIntegerresult=number1&number2;intk=0;if((number1==0)||(number1==1))returnfalse;if(number1==2)returntrue;if((result==0)&&(number1!=2))returnfalse;//Miller-Rabin算法//将(number1-1)写成m*2^k的形式,要求kn-1的二进制右边有多少个0就是q了BigIntegern=number1-1;while(n!=0){result=n&number2;if(result==0)k++;elsebreak;n=n>>1;17密码学课程设计}BigIntegerm=((number1-1)/(BigInteger.Pow(2,k)));Randomr=newRandom();intlen=r.Next(1,length);stringsr=Randomstring(len);//随机生成字符串BigIntegera=BigInteger.Parse(sr);BigIntegerb=Montgomerie(a,m,number1);if(b==1)returntrue;for(inti=0;i<k;i++){if((b%number1)==(number1-1))returntrue;elseb=(b*b)%number1;}returnfalse;}5.1.2运用模重复平方的RSA加解密模重复平方的思想是将指数n写成二进制形式n=n+n*2+„+n*2,令a=1k-101k-11)若n,则计算a=a*b(mod否则取a,即计算a=a*b(modm),再计算n00000b=b(modm).212)若n,则计算a=a*b(modm),否则取a=aa=ab(mod,再n111011010*1计算b=b(modm)。221„„(k-1)若n=1,则计算a=a*b(modm),否则取a=a,即计算k-2nk-2k-2k-3k-2k-2k-3a=a*b(mod,再计算b=b(mod。2k-2k-2k-3k-2k-1(k)若n=1,则计算a=a*b(modm),否则取a=a,即计算k-1nk-1k-1k-2k-1k-1k-2a=a*b(mod,最后,a就是b(modm)nk-1k-2k-1k-1具体加密解密实现代码如下:模重复平方算法privateBigIntegerMo(BigIntegerb,BigIntegerk,BigIntegern){BigIntegerbb=b;BigIntegerkk=k;BigIntegernn=n;intresult;BigIntegera=1;while(k!=0){result=(int)(k&1);if(result==1)a=(a*b)%n;b=(b*b)%n;k=k/2;}18密码学课程设计returna;}模重复平方加密解密privatevoidButton_Click_4(objectsender,RoutedEventArgse){BigIntegerkey_e=BigInteger.Parse(T_e.Text);BigIntegerkey_d=BigInteger.Parse(T_d.Text);BigIntegern=BigInteger.Parse(T_n.Text);BigIntegery1;intdone;UInt16current_x;byte[]b=null;strings=string.Empty;if((T_plain.Text==string.Empty)&&(T_decipher.Text==string.Empty)){MessageBox.Show("请输入明文或密文!");return;}if(T_decipher.Text==string.Empty){s=T_plain.Text;done=1;}//加密done置1else{s=T_decipher.Text;done=2;}//解密done置2inti=0;if(done==1){Class1.code.Clear();b=Encoding.Default.GetBytes(s);//计时开始DateTimebegin=newDateTime(1970,1,1);DateTimenow=DateTime.UtcNow;for(i=0;i<b.Length;i++){current_x=(UInt16)(b[i]-48);Class1.X.Add(current_x);y1=Mo(current_x,key_e,n);Class1.code.Add(y1);}//计时结束DateTimenow2=DateTime.UtcNow;longtime2=now2.Ticks-now.Ticks;inttime=(int)(time2/10000);foreach(BigIntegercinClass1.code){T_decipher.Text+=c.ToString();19密码学课程设计}T_time.Text=string.Empty;T_time.Text=time2.ToString();}if(done==2){Class1.X.Clear();Class1.zifuchuan.Clear();//计时开始DateTimebegin=newDateTime(1970,1,1);DateTimenow=DateTime.UtcNow;for(i=0;i<Class1.code.Count;i++){current_x=(UInt16)Mo(Class1.code[i],key_d,n);Class1.zifuchuan.Add(current_x.ToString());}//计时结束DateTimenow2=DateTime.UtcNow;longtime2=now2.Ticks-now.Ticks;inttime=(int)(time2/10000);foreach(stringcinClass1.zifuchuan){T_plain.Text+=c;}T_time.Text=string.Empty;T_time.Text=time2.ToString();}}5.1.3运用蒙哥马利的RSA快速加解密蒙哥马利算法流程图如下图5.1所示:20密码学课程设计图根据上述流程图,写出相应代码,具体代码如下:蒙哥马利算法相关代码://蒙哥马利privateBigIntegerMontgomerie(BigIntegera,BigIntegerb,BigIntegern){BigIntegerd=1;while(b>0){if(b%2==0){a=(a*a)%n;b=b/2;}else{d=(d*a)%n;b=b-1;}}returnd;}蒙哥马利加解密privatevoidButton_Click_3(objectsender,RoutedEventArgse){BigIntegerkey_e=BigInteger.Parse(T_e.Text);BigIntegerkey_d=BigInteger.Parse(T_d.Text);21密码学课程设计BigIntegern=BigInteger.Parse(T_n.Text);BigIntegery1;intdone;UInt16current_x;byte[]b=null;strings=string.Empty,str;if((T_plain.Text==string.Empty)&&(T_decipher.Text==string.Empty)){MessageBox.Show("请输入明文或密文!");return;}if(T_decipher.Text==string.Empty){s=T_plain.Text;done=1;}//加密done置1else{s=T_decipher.Text;done=2;}//解密done置2inti=0;if(done==1){Class1.code.Clear();b=Encoding.Default.GetBytes(s);//计时开始DateTimebegin=newDateTime(1970,1,1);DateTimenow=DateTime.UtcNow;for(i=0;i<b.Length-1;i++){current_x=(UInt16)(b[i]-48);Class1.X.Add(current_x);y1=Montgomerie(current_x,key_e,n);Class1.code.Add(y1);}//计时结束DateTimenow2=DateTime.UtcNow;longtime2=now2.Ticks-now.Ticks;inttime=(int)(time2/10000);foreach(BigIntegercinClass1.code){T_decipher.Text+=c.ToString();}T_time.Text=string.Empty;T_time.Text=time2.ToString();}if(done==2){Class1.X.Clear();Class1.zifuchuan.Clear();22密码学课程设计//计时开始DateTimebegin=newDateTime(1970,1,1);DateTimenow=DateTime.UtcNow;for(i=0;i<Class1.code.Count;i++){current_x=(UInt16)Montgomerie(Class1.code[i],key_d,n);str=current_x.ToString();Class1.zifuchuan.Add(str);}//计时结束DateTimenow2=DateTime.UtcNow;longtime2=now2.Ticks-now.Ticks;inttime=(int)(time2/10000);foreach(stringcinClass1.zifuchuan){T_plain.Text+=c;}T_time.Text=string.Empty;T_time.Text=time2.ToString();}}5.1.4运用中国剩余定理的RSA解密分别算出模p与模qn=p*q解密出明文,具体代码如下图:中国剩余定理privateUInt16Chinese(BigIntegerx,BigIntegerkey,BigIntegerp,BigIntegerq){BigIntegern=BigInteger.Parse(T_n.Text);BigIntegerM1=q;BigIntegerM2=p;BigIntegert1=Ni(M1,p,refClass1.NX,refClass1.NY);t1=Class1.NX;while(t1<0)t1+=p;BigIntegert2=Ni(M2,q,refClass1.NX,refClass1.NY);t2=Class1.NX;while(t2<0)t2+=q;BigIntegery1=Mo(x,key,p);BigIntegery2=Mo(x,key,q);BigIntegerhh=(M1*y1*t1+M2*y2*t2)%n;UInt16y=(UInt16)((M1*y1*t1+M2*y2*t2)%n);returny;}23密码学课程设计用中国剩余定理求逆privateBigIntegerNi(BigIntegerm,BigIntegern,refBigIntegerx,refBigIntegery){BigIntegerx1,y1,x0,y0;x0=1;y0=0;x1=0;y1=1;x=0;y=1;BigIntegerr=m%n;BigIntegerq=(m-r)/n;while(r!=0){x=x0-q*x1;y=y0-q*y1;x0=x1;y0=y1;x1=x;y1=y;m=n;n=r;r=m%n;q=(m-r)/n;}returnn

温馨提示

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

评论

0/150

提交评论