




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
經(jīng)典word整理文檔,僅參考,雙擊此處可刪除頁(yè)眉頁(yè)腳。本資料屬于網(wǎng)絡(luò)整理,如有侵權(quán),請(qǐng)聯(lián)系刪除,謝謝!密碼學(xué)課程設(shè)計(jì)目錄解密解密解密解密密碼學(xué)課程設(shè)計(jì)一.實(shí)驗(yàn)?zāi)康睦?;培養(yǎng)學(xué)生將密碼理論和技術(shù)應(yīng)用于實(shí)際的能力,使學(xué)生具備實(shí)施數(shù)據(jù)加/脫密和基本的密碼分析的能力。二.實(shí)驗(yàn)內(nèi)容及基本要求2.1、分組密碼SPN的編程實(shí)現(xiàn)①加密:輸入初始加密密鑰和一串有意義的字符串,顯示相應(yīng)的加密結(jié)果;②線性分析:通過(guò)對(duì)明密文對(duì)的線性分析,破解出初始加密密鑰;③差分分析:通過(guò)對(duì)明密文對(duì)的差分分析,破解出初始加密密鑰;以及密文顯示欄;2.2、RSA的加解密及快速加解密①編制或網(wǎng)上下載大素?cái)?shù)生成算法,產(chǎn)生二個(gè)大素?cái)?shù)p和q;②編寫(xiě)RSA的加/解密過(guò)程和快速加/解密過(guò)程;③通過(guò)調(diào)用時(shí)鐘對(duì)二種加/解密方法的時(shí)間開(kāi)銷(xiāo)進(jìn)行測(cè)試;④/解密方式選擇,快速方式與一般方式的選擇及時(shí)間開(kāi)銷(xiāo)顯示。2.3、隨機(jī)性檢測(cè)密文的隨機(jī)性反映了密碼的強(qiáng)度,通過(guò)設(shè)計(jì)隨機(jī)性測(cè)試算法或運(yùn)用工具對(duì)SPN生成的密文進(jìn)行隨機(jī)性檢測(cè),來(lái)測(cè)試SPN的密碼強(qiáng)度。三.實(shí)驗(yàn)原理3.1、分組密碼SPN迭代密碼的核心是一個(gè)密鑰編排方案和一個(gè)輪函數(shù)1密碼學(xué)課程設(shè)計(jì)密鑰編排方案對(duì)密鑰k進(jìn)行變換,生成Nr個(gè)子密鑰(也叫輪密鑰),記為k1,k2,...,kNr輪函數(shù)g是一個(gè)狀態(tài)加密函數(shù),以ki為密鑰對(duì)當(dāng)前狀態(tài)w進(jìn)行變換,輸r-1出新的狀態(tài)值w,即g(w,k)=w;輪函數(shù)是單射函數(shù),存在一個(gè)逆變換g,有rr-1ir-1g(w,k)=w-1rir-1迭代密碼的加密為將密鑰k編排成Nr個(gè)輪密鑰k,k,...,k,將明文x定義12Nr為初始狀態(tài)w,經(jīng)過(guò)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定義為初始狀態(tài)w,經(jīng)過(guò)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)代替置換網(wǎng)絡(luò)(Substitution-PermutationNetwork)代替置換網(wǎng)絡(luò)(Substitution-PermutationNetwork)理的明文單元和狀態(tài)值長(zhǎng)度為l×m,輪函數(shù)g包括兩個(gè)核心變換——代替和置換,分別記為πs和πp,有πs:{0,1}l→{0,1}lπp:{1,2,...,lm}→{1,2,...,lm}在進(jìn)行輪函數(shù)變換前,先用輪密鑰和狀態(tài)值進(jìn)行異或稱為白化)(3)SPN密碼體制設(shè)計(jì)設(shè)l,m,Nr是正整數(shù),P=C={0,1}lmK({0,1}lm)Nr+1是由初始密鑰k用密鑰編排算法生成的所有可能的密鑰編排方案集合,一個(gè)密鑰編排方案記為(k1,k2,...,kNr+1)狀態(tài)值w長(zhǎng)度為l×m,記為w1,w2,...,wlm;w可以看成m個(gè)長(zhǎng)度為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加密過(guò)程使用如下算法描述: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密碼學(xué)課程設(shè)計(jì)y=v⊕k//白化NrNr+1returny具體加密過(guò)程如圖3.1所示:圖(4)線性密碼分析SSx和,確定k或k的部分比特。其中,S盒的選擇對(duì)SPN的安全性影響巨大,假設(shè)一個(gè)S盒按如下規(guī)則設(shè)計(jì),見(jiàn)圖3.2圖S可以發(fā)現(xiàn)其實(shí)是將輸入進(jìn)行了循環(huán)左移,如圖3.3圖3密碼學(xué)課程設(shè)計(jì)采用已知明文攻擊方法,如果掌握了足夠多的明-密文對(duì),即可求出輪密鑰ki,進(jìn)而根據(jù)輪密鑰編排方案反向推導(dǎo)出加密密鑰k。線性密碼分析思路為找到足夠多的明文-密文對(duì),對(duì)可能的密鑰進(jìn)行窮舉,計(jì)算相關(guān)隨機(jī)變量的偏差,正確的密鑰作用下,偏差的絕對(duì)值最大窮舉,這些密鑰比特稱為候選子密鑰具體算法如下:線性攻擊(T,T,π)-1sfor(L,L)=(0,0)to(F,F){//L,L表示候選子密鑰k和k551212<2><4>Count[L,L]=0//每個(gè)候選子密鑰分配一個(gè)計(jì)數(shù)器并初始化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//計(jì)算隨機(jī)變量值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)差分密碼分析通過(guò)分析明文對(duì)的差值對(duì)密文對(duì)差值的影響來(lái)恢復(fù)某些密鑰比特的分析方對(duì),每對(duì)明文的異或結(jié)果相同,觀察相應(yīng)的密文異或結(jié)果。線性分析。仍以“循環(huán)左移”S盒為例假設(shè)兩個(gè)輸入分別是x=1010和x*=1101則相應(yīng)的輸出是y=0101和y*=1011輸入的異或?yàn)閤’x*=0111輸出的異或?yàn)椤抷*=11104密碼學(xué)課程設(shè)計(jì)可以發(fā)現(xiàn)不論x和x*如何變化,只要它們的異或是0111,相應(yīng)輸出的異或都是1110,(x’’被稱為一個(gè)差分如果S盒是線性的,整個(gè)SPN也會(huì)是線性的,明文和密文的差分也會(huì)是線性的差分分析的優(yōu)勢(shì)在于,分析過(guò)程基本可以忽略密鑰的干擾作用。差分密碼分析思路找到足夠多的四元組,其中x’⊕x*固定不變。對(duì)可能的密鑰進(jìn)行窮舉,計(jì)算相關(guān)差分的擴(kuò)散率,正確的密鑰作用下,擴(kuò)散率應(yīng)最大行窮舉即可。具體算法如下:差分攻擊(T,T,πs-1)for(L,L)=(0,0)to(F,F){//L1,L2表示候選子密鑰和k5<4>12Count[L,L]=0//每個(gè)候選子密鑰分配一個(gè)計(jì)數(shù)器并初始化為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密碼學(xué)課程設(shè)計(jì)3.2、RSA的加解密及快速加解密密的密鑰,它是可以公開(kāi)的,稱為公鑰;另一個(gè)是用于解密的密鑰,是保密的,信息發(fā)送人的身份進(jìn)行驗(yàn)證手段,是現(xiàn)代密碼學(xué)最重要的發(fā)明。RSA1977年由Rivest、Shamir和Adleman提出的第一個(gè)比較完善的非對(duì)稱密碼算法。它的安全性是建全性還未能得到理論證明,但經(jīng)過(guò)20多年的密碼分析和攻擊,迄今仍然被實(shí)踐證明是安全的。RSA算法描述如下:(1)公鑰選擇兩個(gè)互異的大素?cái)?shù)p和q,n是二者的乘積,即n=pq,使Φ(n)=(p-1)(q-1)為歐拉函數(shù)。隨機(jī)選取正整數(shù),使其滿足gcd(e,Φ(n)),即e和Φ(n)互質(zhì),則將作為公鑰。(2)私鑰求出正數(shù)d,使其滿足×d=1(modΦ(n)),則將(n,d)作為私鑰。(3)加密算法對(duì)于明文M,由C=M(modn),得到密文C。e(4)解密算法對(duì)于密文C,由M=C(mod,得到明文M。d如果竊密者獲得了n、e和密文C,為了破解密文必須計(jì)算出私鑰d,為此需要先分解n。為了提高破解難度,達(dá)到更高的安全性,一般商業(yè)應(yīng)用要求n的長(zhǎng)度不小于1024位,更重要的場(chǎng)合不小于2048位。3.3、隨機(jī)性檢測(cè)隨機(jī)性測(cè)試方法對(duì)于一個(gè)用DES加密產(chǎn)生的密文序列,分別以下面三種情況設(shè)計(jì)測(cè)試隨機(jī)性工具(1)0和1在密文中所占比例(2)00、01、10、11在密文中所占比例(3)000、001、010、、100、101、、111在密文中所占比例6密碼學(xué)課程設(shè)計(jì)四.實(shí)驗(yàn)過(guò)程5.1、分組密碼SPN5.1.1SPN加密該部分首先確定選用數(shù)據(jù)結(jié)構(gòu),我選用C#中的List類(lèi)型來(lái)存儲(chǔ)切分后的明文單元與加密后的密文單元以及用于顯示的stringList這種數(shù)據(jù)結(jié)構(gòu)在添加元素的時(shí)候類(lèi)似于C語(yǔ)言中的鏈表,動(dòng)態(tài)存儲(chǔ),這樣就適應(yīng)了明文大小不確定的特點(diǎn),避免了申請(qǐng)固定存儲(chǔ)空間大小帶來(lái)的麻煩。對(duì)于S盒與P盒,我采用一維數(shù)組的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)相關(guān)信息。具體聲明如下: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>();//放密文(二)具體代碼實(shí)施該部分主要依照SPN加密的原理來(lái)進(jìn)行對(duì)明文的加密,并將密文轉(zhuǎn)碼之后轉(zhuǎn)成字符串顯示出來(lái)。主要按照以下幾個(gè)步驟完成:(1)根據(jù)初始密鑰,生成輪密鑰。string從一個(gè)32比特的密鑰開(kāi)始,對(duì)輪數(shù)1=<r<=5,定義K是由K開(kāi)始的16個(gè)連續(xù)的比特組成。具體實(shí)現(xiàn)代碼如下:將初始密鑰字符串轉(zhuǎn)成二進(jìn)制: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);}生成輪密鑰://獲取輪函數(shù)7密碼學(xué)課程設(shè)計(jì)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)切分明文,并進(jìn)行加密string文切分。string轉(zhuǎn)成byte數(shù)組,再將兩個(gè)數(shù)組單元拼接成一個(gè)16比特位的單元,若數(shù)組元素個(gè)數(shù)為基數(shù),則在最后一個(gè)單元補(bǔ)上8個(gè)0,湊成一個(gè)16比特位的單元。具體代碼如下:整體函數(shù)(包括切分)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數(shù)進(jìn)行加密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密碼學(xué)課程設(shè)計(jì)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);}置換函數(shù)://置換函數(shù)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;}代換函數(shù):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);}加密函數(shù):publicstaticUInt16decipher(UInt16current_y,UInt32K){intr;List<UInt16>mylist=newList<ushort>();mylist=Cycle(K);for(r=0;r<3;r++){//生成輪函數(shù)current_y=(UInt16)(current_y^mylist[r]);//異或current_y=Substitute(current_y);//置換9密碼學(xué)課程設(shè)計(jì)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)將密文轉(zhuǎn)成字符串顯示出來(lái)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個(gè)計(jì)數(shù)器賦初值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密碼學(xué)課程設(shè)計(jì)((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密碼學(xué)課程設(shè)計(jì)}}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;//隨機(jī)數(shù)生成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密碼學(xué)課程設(shè)計(jì)r_i=decipher(r_i,Class1.K);Class1.code.Add(r_i);}//計(jì)數(shù)器初始化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密碼學(xué)課程設(shè)計(jì)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密碼學(xué)課程設(shè)計(jì)UInt16D;D=(UInt16)(X^c);returnD;}5.2、RSA的加解密及快速加解密該部分RSA的加解密原理比較容易理解,難點(diǎn)在于大數(shù)的模冪運(yùn)算,若采用普題:5.1.1生成大素?cái)?shù)的一個(gè)素?cái)?shù),其中涉及到了大數(shù)的生成,素?cái)?shù)的判斷等算法,具體步驟如下:(1)的字符串,然后將該字符串轉(zhuǎn)成大數(shù),具體代碼實(shí)現(xiàn)如下:隨機(jī)生成字符串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();}字符串轉(zhuǎn)成大數(shù)stringsr=Randomstring(len);//隨機(jī)生成字符串BigIntegera=BigInteger.Parse(sr);(2)尋找比n大的最近的素?cái)?shù),其中涉及miller-rabin算法來(lái)進(jìn)行素性檢測(cè),具體代碼如下:NextPrime:生成比n大的素?cái)?shù),len指定長(zhǎng)度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密碼學(xué)課程設(shè)計(jì)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密碼學(xué)課程設(shè)計(jì)}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算法素性檢測(cè)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)寫(xiě)成m*2^k的形式,要求kn-1的二進(jìn)制右邊有多少個(gè)0就是q了BigIntegern=number1-1;while(n!=0){result=n&number2;if(result==0)k++;elsebreak;n=n>>1;17密碼學(xué)課程設(shè)計(jì)}BigIntegerm=((number1-1)/(BigInteger.Pow(2,k)));Randomr=newRandom();intlen=r.Next(1,length);stringsr=Randomstring(len);//隨機(jī)生成字符串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運(yùn)用模重復(fù)平方的RSA加解密模重復(fù)平方的思想是將指數(shù)n寫(xiě)成二進(jìn)制形式n=n+n*2+?+n*2,令a=1k-101k-11)若n,則計(jì)算a=a*b(mod否則取a,即計(jì)算a=a*b(modm),再計(jì)算n00000b=b(modm).212)若n,則計(jì)算a=a*b(modm),否則取a=aa=ab(mod,再n111011010*1計(jì)算b=b(modm)。221??(k-1)若n=1,則計(jì)算a=a*b(modm),否則取a=a,即計(jì)算k-2nk-2k-2k-3k-2k-2k-3a=a*b(mod,再計(jì)算b=b(mod。2k-2k-2k-3k-2k-1(k)若n=1,則計(jì)算a=a*b(modm),否則取a=a,即計(jì)算k-1nk-1k-1k-2k-1k-1k-2a=a*b(mod,最后,a就是b(modm)nk-1k-2k-1k-1具體加密解密實(shí)現(xiàn)代碼如下:模重復(fù)平方算法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密碼學(xué)課程設(shè)計(jì)returna;}模重復(fù)平方加密解密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("請(qǐng)輸入明文或密文!");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);//計(jì)時(shí)開(kāi)始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);}//計(jì)時(shí)結(jié)束DateTimenow2=DateTime.UtcNow;longtime2=now2.Ticks-now.Ticks;inttime=(int)(time2/10000);foreach(BigIntegercinClass1.code){T_decipher.Text+=c.ToString();19密碼學(xué)課程設(shè)計(jì)}T_time.Text=string.Empty;T_time.Text=time2.ToString();}if(done==2){Class1.X.Clear();Class1.zifuchuan.Clear();//計(jì)時(shí)開(kāi)始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());}//計(jì)時(shí)結(jié)束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運(yùn)用蒙哥馬利的RSA快速加解密蒙哥馬利算法流程圖如下圖5.1所示:20密碼學(xué)課程設(shè)計(jì)圖根據(jù)上述流程圖,寫(xiě)出相應(yīng)代碼,具體代碼如下:蒙哥馬利算法相關(guān)代碼://蒙哥馬利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密碼學(xué)課程設(shè)計(jì)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("請(qǐng)輸入明文或密文!");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);//計(jì)時(shí)開(kāi)始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);}//計(jì)時(shí)結(jié)束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密碼學(xué)課程設(shè)計(jì)//計(jì)時(shí)開(kāi)始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);}//計(jì)時(shí)結(jié)束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運(yùn)用中國(guó)剩余定理的RSA解密分別算出模p與模qn=p*q解密出明文,具體代碼如下圖:中國(guó)剩余定理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密碼學(xué)課程設(shè)計(jì)用中國(guó)剩余定理求逆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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)品數(shù)字化交易平臺(tái)開(kāi)發(fā)協(xié)議
- 年度企業(yè)文化建設(shè)與員工關(guān)懷計(jì)劃設(shè)計(jì)方案
- 聲聲慢:高中語(yǔ)文詩(shī)詞教學(xué)教案
- 水泥電桿銷(xiāo)售合同
- 語(yǔ)言之美:修辭手法與表達(dá)技巧
- 工業(yè)園區(qū)生產(chǎn)流水線供應(yīng)合同
- 季度銷(xiāo)售工作總結(jié)與業(yè)績(jī)分析報(bào)告
- 新零售行業(yè)線下實(shí)體店運(yùn)營(yíng)策略設(shè)計(jì)
- 企業(yè)危機(jī)公關(guān)事件處理預(yù)案
- 倉(cāng)儲(chǔ)物流系統(tǒng)運(yùn)營(yíng)合作協(xié)議
- 醫(yī)學(xué)教程 常見(jiàn)動(dòng)物咬蟄傷應(yīng)急救護(hù)課件
- 中學(xué)校園廣播聽(tīng)力系統(tǒng)管理制度
- 組合型浮式防波堤水動(dòng)力響應(yīng)與消浪性能研究
- 商業(yè)綜合體應(yīng)急預(yù)案編制與演練效果評(píng)估考核試卷
- GB/T 44679-2024叉車(chē)禁用與報(bào)廢技術(shù)規(guī)范
- 智鼎在線測(cè)評(píng)的題
- 2-3《書(shū)的歷史》(教學(xué)設(shè)計(jì))二年級(jí)科學(xué)上冊(cè) 教科版
- 廣告學(xué)概論課件
- 可上傳班級(jí)管理(一到三章)李學(xué)農(nóng)主編
- 醫(yī)院環(huán)境衛(wèi)生學(xué)監(jiān)測(cè)和院感控制課件
- 春天古詩(shī)模板
評(píng)論
0/150
提交評(píng)論