密碼學課設報告_第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

提交評論