密碼學課程設計報告_第1頁
密碼學課程設計報告_第2頁
密碼學課程設計報告_第3頁
密碼學課程設計報告_第4頁
密碼學課程設計報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

密碼學課程設計報告班級:信安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加解密算法的實現(xiàn)83.1.1DES算法概述83.1.2算法原理及設計思想83.1.3程序主要算法分析113.1.4程序運行結果133.1.5平安性分析143.2AES加解密算法的實現(xiàn)143.2.1AES算法概述153.2.2算法原理及設計思想153.2.3程序主要算法分析173.2.4程序運行結果223.2.5平安性分析224HASH函數(shù)—MD5算法234.1算法概述234.2算法原理及設計思想234.3程序主要算法分析264.4程序運行結果284.5平安性分析285公鑰密碼算法---RSA295.1算法概述295.2算法原理及設計思想295.2.1算法描述—密鑰生成295.2.2算法描述—加密、解密295.2.3原理295.3程序主要算法分析305.4程序運行結果315.5平安性分析316設計體會32古典密碼算法---凱撒密碼1.1凱撒密碼概述凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的根本思想是:通過把字母移動一定的位數(shù)來實現(xiàn)加密和解密。例如,如果密鑰是把明文字母的位數(shù)向后移動三位,那么明文字母B就變成了密文的E,依次類推,X將變成A,Y變成B,Z變成C,由此可見,位數(shù)就是凱撒密碼加密和解密的密鑰。它是一種代換密碼。據(jù)說凱撒是率先使用加密函的古代將領之一,因此這種加密方法被稱為凱撒密碼。在密碼學中凱撒密碼〔或稱凱撒加密、凱撒變換、變換加密〕是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向后〔或向前〕按照一個固定數(shù)目進行偏移后被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。這個加密方法是以凱撒的名字命名的,當年凱撒曾用此方法與其將軍們進行聯(lián)系。凱撒密碼通常被作為其他更復雜的加密方法中的一個步驟,例如維吉尼亞密碼。凱撒密碼還在現(xiàn)代的ROT13系統(tǒng)中被應用。但是和所有的利用字母表進行替換的加密技術一樣,凱撒密碼非常容易被破解,而且在實際應用中也無法保證通信平安。1.2算法原理及設計思想它是一種替代密碼,通過將字母按順序推后起3位起到加密作用,如將字母A換作字母D,將字母B換作字母E。因據(jù)說愷撒是率先使用加密函的古代將領之一,因此這種加密方法被稱為愷撒密碼。這是一種簡單的加密方法,這種密碼的密度是很低的,只需簡單地統(tǒng)計字頻就可以破譯?,F(xiàn)今又叫“移位密碼〞,只不過移動的為數(shù)不一定是3位而已。密碼術可以大致別分為兩種,即易位和替換,當然也有兩者結合的更復雜的方法。在易位中字母不變,位置改變;替換中字母改變,位置不變。凱撒密碼表就是用D代a,用E代b,……,用z代w,〔注意!〕用A帶x,用B代y,C代z。這些代替規(guī)那么也可用一張表格來表示〔所以叫“密表〞〕。1.3主要算法分析//密碼表的定義chara[26];for(inti=0;i<26;i++)a[i]=char(65+i);//明文轉化為凱撒密碼for(inth=0;h<strlen(s);h++)g[h]=int(s[h]);l=((g[h]-65)+key)%26;//凱撒密碼轉化為明文for(intv=0;v<strlen(q);v++)e[v]=int(q[v]);b=((e[v]-65)-key1+26)%26;1.4程序運行結果1.5密碼平安性分析凱撒密碼是沒有密鑰的,即使沒有密鑰也能將它破解出來,因為凱撒移位密碼只有25種密鑰,最多就是將這25種可能性挨個檢測一下可以了,這就是我們所說的暴力破解法。也可在用軟件破解,不過我提倡用人工的。推理的方法:1、對于有空格的凱撒移位,單字母A和I是突破口,這無異相當于告訴了移動的位數(shù),這樣很容易就被破解了。所以,如果我們要用凱撒密碼的話一定要去掉空格加大破解難。2、差數(shù)法有空格時,而又沒有單字母A和I時,這種方法很,如果我們令A=1,B=2,C=3......就是每個字母是字母的第幾個,經過移位后的單詞,每兩相鄰的字母之間的差值不變的。如the的差值為12,3〔在這里我是用后面的一個字母減前面的一個字母,當然你也可以用后面的一個字母減前面的一個字母〕,移動后兩個相鄰字母的差值也將會是1,2,3。對于沒有空格的愷撒破解起來就比有空格的難一些,對于沒有空格的我們還要對密文進行分析,找出重復出現(xiàn)的字母串,然后對字母串進行猜想,例,如果有3個字母串,出現(xiàn)的次數(shù)比擬高,我們就可以假設它為the因為3個字母串出現(xiàn)次最多的就是the,當然這不是一成不變的,這時應該就被破解了。序列密碼—RC42.1RC4算法概述RC4加密算法是大名鼎鼎的RSA三人組中的頭號人物RonRivest在1987年設計的密鑰長度可變的流加密算法簇。之所以稱其為簇,是由于其核心局部的S-box長度可為任意,但一般為256字節(jié)。該算法的速度可以到達DES加密的10倍左右。RC4算法是一種在電子信息領域加密的技術手段,用于無線通信網絡,是一種電子密碼,只有經過授權〔繳納相應費用〕的用戶才能享受該效勞。RC4算法的原理很簡單,包括初始化算法和偽隨機子密碼生成算法兩大局部。2.2算法原理及設計思想RC4流密碼是一種可變密鑰長度、面向字節(jié)操作流密碼。以隨機置換為根底。廣泛的用于SSL/TLS標準當中。RC4算法可以分為兩個局部,第一是依據(jù)種子密鑰,利用密鑰調度算法對數(shù)據(jù)表S進行重新排列,第二局部是利用偽隨機數(shù)生成算法,從已重新排列的數(shù)據(jù)表S中取出一個字節(jié)。每取出一個字節(jié),數(shù)據(jù)表S將發(fā)生變化。RC4描述起來也很簡單:用從1到256個字節(jié)(8-2048比特)的可變長度密鑰初始化一個256字節(jié)的狀態(tài)向量S,S的元素標記為S[0],S[1],…,S[255],從始至終置換后的S包含從0-255的所有8比特數(shù)。對于加密和解密,字節(jié)K由S中255個元素按照一定的方式選出一個元素生成。每生成一個K值,S中元素的個體就被重新置換一次。2.3程序主要算法分析初始化S開始時,S中的值被置為按升序0-255,即S[0]=0,S[1]=1,…,S[255]=255。同時建立一個臨時變量T。如果密鑰K的長度為256字節(jié),那么將K賦給T。否那么假設密鑰長度為keylen字節(jié),那么將K的值賦給T的前keylen個元素,并循環(huán)重復用K的值賦給T剩下的元素,直到T的所有元素被賦值。然后用T產生的S初始置換,從S[0]到S[255],對每個S[i],根據(jù)T[i]確定的方案,將S[i]置換為S中的另一字節(jié)。因為對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],根據(jù)當前S的值,將S[i]與S中的另一字節(jié)置換。當S[255]完成置換后,操作繼續(xù)重復從S[0]開始。加密中,將k的值與下一明文字節(jié)異或;解密中,將k的值與下一密文字節(jié)異或。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算法的優(yōu)點是:算法簡單、高效,特別適合軟件實現(xiàn),RC4是目前應用最廣的商密級序列密碼,目前被用于SSL/TLS標準中。由于RC4算法加密是采用的xor,所以,一旦子密鑰序列出現(xiàn)了重復,密文就有可能被破解。那么,RC4算法生成的子密鑰序列是否會出現(xiàn)重復呢?經過我的測試,存在局部弱密鑰,使得子密鑰序列在不到100萬字節(jié)內就發(fā)生了完全的重復,如果是局部重復,那么可能在不到10萬字節(jié)內就能發(fā)生重復,因此,推薦在使用RC4算法時,必須對加密密鑰進行測試,判斷其是否為弱密鑰。但在2001年就有以色列科學家指出RC4加密算法存在著漏洞,這可能對無線通信網絡的平安構成威脅。以色列魏茨曼研究所和美國思科公司的研究者發(fā)現(xiàn),在使用“有線等效保密規(guī)那么〞〔WEP〕的無線網絡中,在特定情況下,人們可以逆轉RC4算法的加密過程,獲取密鑰,從而將己加密的信息解密。實現(xiàn)這一過程并不復雜,只需要使用一臺個人電腦對加密的數(shù)據(jù)進行分析,經過幾個小時的時間就可以破譯出信息的全部內容。專家說,這并不表示所有使用RC4算法的軟件都容易泄密,但它意味著RC4算法并不像人們原先認為的那樣平安。這一發(fā)現(xiàn)可能促使人們重新設計無線通信網絡,并且使用新的加密算法。分組密碼DES加解密算法的實現(xiàn)DES加解密算法概述1977年1月,美國政府公布:采納IBM公司設計的方案作為非機密數(shù)據(jù)的正式數(shù)據(jù)加密標準〔DESDataEncryptionStandard〕。DES算法在POS、ATM、磁卡及智能卡〔IC卡〕、加油站、高速公路收費站等領域被廣泛應用,以此來實現(xiàn)關鍵數(shù)據(jù)的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數(shù)據(jù)包的MAC校驗等,均用到DES算法。DES算法的入口參數(shù)有三個:Key、Data、Mode。其中Key為8個字節(jié)共64位,是DES算法的工作密鑰;Data也為8個字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。DES是一個分組密碼算法,它使用56位的密鑰,以64位為單位對數(shù)據(jù)分組進行加密解密〔密文和明文的分組長度相同,均為64位〕,DES加密與解密使用同一密鑰,DES的保密性依賴于密鑰。DES的加密過程可簡單描述為三個階段:算法原理及設計思想DES算法把64位的明文輸入塊變?yōu)?4位的密文輸出塊,它所使用的密鑰也是64位,其功能是把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L0、R0兩局部,每局部各長32位,其置換規(guī)那么見下表: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位,其逆置換規(guī)那么如下表所示: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為選擇函數(shù),其功能是把6bit數(shù)據(jù)變?yōu)?bit數(shù)據(jù)。下面給出選擇函數(shù)Si(i=1,2......8)的功能表:選擇函數(shù)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算法規(guī)定,其中第8、16、......64位是奇偶校驗位,不參與DES運算。故Key實際可用位數(shù)便只有56位。即:經過縮小選擇換位表1的變換后,Key的位數(shù)由64位變成了56位,此56位分為C0、D0兩局部,各28位,然后分別進行第1次循環(huán)左移,得到C1、D1,將C1〔28位〕、D1〔28位〕合并得到56位,再經過縮小選擇換位2,從而便得到了密鑰K0〔48位〕。依此類推,便可得到K1、K2、......、K15,不過需要注意的是,16次循環(huán)左移對應的左移位數(shù)要依據(jù)下述規(guī)那么進行:循環(huán)左移位數(shù)1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1以上介紹了DES算法的加密過程。DES算法的解密過程是一樣的,區(qū)別僅僅在于第一次迭代時用子密鑰K15,第二次K14、……,最后一次用K0,算法本身并沒有任何變化。密鑰生成過程流程圖如下所示:3.1.3程序主要算法分析〔1〕S盒功能通過以下函數(shù)來實現(xiàn),將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〕函數(shù)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盒后,又變?yōu)?比特,合并后又成為32比特。S_func(In,MR);//該32比特經過P變換后,輸出的比特串才是32比特的f(Ri-1,Ki)Transform(In,In,PP,32);}〔3〕下面為子密鑰生成函數(shù),輸入的種子密鑰首先經過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++){//循環(huán)左移,合并RotateL(KL,28,LOOP[i]);RotateL(KR,28,LOOP[i]);Transform(SubKey[i],K,EP2,48);}}〔4〕下面為加密函數(shù):voidCDES::Encryption(charout[8],charIn[8])//加密函數(shù){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〕下面為解密函數(shù),實際上是加密的一個逆運算:voidCDES::Decryption(charout[8],charIn[8])//解密函數(shù)(加密的逆過程){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);}程序的運行結果為:程序總的流程圖如下所示:平安性分析對DES平安性的主要爭論:〔1〕、對DES的S盒、迭代次數(shù)、密鑰長度等設計準那么的爭議〔2〕、DES存在著一些弱密鑰和半弱密鑰〔3〕、DES的56位密鑰無法抵抗窮舉工具對于DES算法可以利用互補性、弱密鑰和半弱密鑰、密鑰搜索、差分分析和線性分析等方式進行攻擊。對于DES密碼也可使用窮舉密鑰攻擊,n=256≈7×106,即使使用每秒種可以計算一百萬個密鑰的大型計算機,也需要算106天才能求得所使用的密鑰,因此看來是很平安的。但是密碼專家Diffie和Hellman指出,如果設計一種一微秒可以核算一個密鑰的超大規(guī)模集成片,那么它在一天內可以核算8.64×1010個密鑰。如果由一個百萬個這樣的集成片構成專用機,他們當時估計:這種專用機的造價約為兩千萬美元。在五年內分期歸還,平均每天約需付一萬美元。由于用窮舉法破譯平均只需要計算半個密鑰空間,因此獲得解的平均時間為半天。為保證DES的平安性,又出現(xiàn)了2DES,三重DES等。AES加解密算法的實現(xiàn)AES算法概述AES加密算法即密碼學中的高級加密標準〔AdvancedEncryptionStandard,AES〕,又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院〔NIST〕于2001年11月26日發(fā)布于FIPSPUB197,并在2002年5月26日成為有效的標準。AES的根本要求是,采用對稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度128位,AES加密數(shù)據(jù)塊大小最大是256bit,但是密鑰大小在理論上沒有上限。AES加密有很多輪的重復和變換。大致步驟如下:1、密鑰擴展〔KeyExpansion〕,2、初始輪〔InitialRound〕,3、重復輪〔Rounds〕,每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最終輪〔FinalRound〕,最終輪沒有MixColumns。算法原理及設計思想AES算法基于排列和置換運算。排列是對數(shù)據(jù)重新進行安排,置換是將一個數(shù)據(jù)單元替換為另一個。AES使用幾種不同的方法來執(zhí)行排列和置換運算。

AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,并且用128位〔16字節(jié)〕分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個循環(huán)結構,在該循環(huán)中重復置換和替換輸入數(shù)據(jù)?!?〕首先將明文以字節(jié)為單位進行處理,以128位分組、128位的密鑰為例。先將明文按字節(jié)分成列組,將明文的前四字節(jié)組成一列,接下來的4個字節(jié)組成第二列,后面的字節(jié)依次組成第三列和第四列,那么組成了一個4乘4的矩陣?!?〕AES也是由根本的變換單位“輪〞屢次迭代而成的。AES的輪變換由四個不同的變換組成:字節(jié)代替變換非線性的字節(jié)替代,單獨處理每個字節(jié):求該字節(jié)在有限域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)行移位變換行移位變換完成基于行的循環(huán)位移操作,變換方法:

即行移位變換作用于行上,第0行不變,第1行循環(huán)左移1個字節(jié),第2行循環(huán)左移2個字節(jié),第3行循環(huán)左移3個字節(jié)。列混合變換〔最后一輪中沒有〕逐列混合,方法:b(x)=(03·x3+01·x2+01·x+02)·a(x)mod(x4+1)矩陣表示形式:與子密鑰異或只是簡單的將密鑰按位異或到一個狀態(tài)上。每輪加密密鑰按順序取自擴展密鑰,擴展密鑰是由初始密鑰擴展而成。密鑰擴展AES密鑰擴展算法輸入值是4字(16字節(jié)),輸出值是一個44字(176字節(jié))的一維線性數(shù)組,為初始輪密鑰加階段和其他10輪中的每一輪提供4字的輪秘密鑰,輸入密鑰直接被復制到擴展密鑰數(shù)組的前四個字,然后每次用四個字填充擴展密鑰數(shù)組余下的局部程序主要算法分析〔1〕程序編寫的過程中嚴格按照AES算法的執(zhí)行過程,將用到的參數(shù)及函數(shù)封裝在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組密鑰〔即輸入的密鑰〕相加〔異或〕,作為輪加密的輸入然后循環(huán)10次進行SubBytes、ShiftRows、MixColumns、AddRoundKey運算,最后恢復原序列〔3〕需要注意的是最后一輪并不進行MixColumns〔列混淆變換〕加密過程函數(shù)Cipher,它只有一個參數(shù),為輸入的明文,函數(shù)的返回值為加密之后的密文,解密過程與加密過程類似。unsignedchar*AES::Cipher(unsignedchar*input){unsignedcharstate[4][4];inti,r,c;//將明文按字節(jié)分成列組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);//字節(jié)代替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〕下面是每一輪變換中的四個小變換的實現(xiàn)函數(shù)如下://字節(jié)代替,通過SBox表來實現(xiàn)的;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行循環(huán)左移1個字節(jié),第2行循環(huán)左移2個字節(jié),第3行循環(huán)左移3個字節(jié)。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)上的乘法,標準算法應該是循環(huán)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組第三列的四個字節(jié)循環(huán)左移1個字節(jié),并對每個字節(jié)進行字節(jié)代替變換SubBytes,將第一行(即第一個字節(jié))與輪常量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程序運行結果輸入為數(shù)字3.2.5平安性分析暴力攻擊單就密鑰長度來看,AES里面最少128位的密鑰絕比照DES的56位密鑰要平安的多統(tǒng)計攻擊已經有很多的測試都無法對AES所產生的密文進行統(tǒng)計攻擊差分攻擊與線性攻擊AES系統(tǒng)目前仍然沒有任何的差分攻擊或者線性攻擊存在。HASH函數(shù)—MD5算法4.1算法概述MessageDigestAlgorithmMD5〔中文名為消息摘要算法第五版〕為計算機平安領域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護。是計算機廣泛使用的雜湊算法之一〔又譯摘要算法、哈希算法〕,將數(shù)據(jù)〔如漢字〕運算為另一固定長度值,是雜湊算法的根底原理,MD5的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式〔就是把一個任意長度的字節(jié)串變換成一定長的十六進制數(shù)字串〕。除了MD5以外,其中比擬有名的還有sha-1、RIPEMD以及Haval等。4.2算法原理及設計思想MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。在MD5算法中,首先需要對信息進行填充,使其位長對512求余的結果等于448。因此,信息的位長〔BitsLength〕將被擴展至N*512+448,N為一個非負整數(shù),N可以是零。填充的方法如下,在信息的后面填充一個1和無數(shù)個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在這個結果后面附加一個以64位二進制表示的填充前信息長度。經過這兩步的處理,現(xiàn)在的信息的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數(shù)倍。這樣做的原因是為滿足后面處理中對信息長度的要求。MD5中有四個32位被稱作鏈接變量〔ChainingVariable〕的整數(shù)參數(shù),他們分別為:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。當設置好這四個鏈接變量后,就開始進入算法的四輪循環(huán)運算。循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。將上面四個鏈接變量復制到另外四個變量中:A到a,B到b,C到c,D到d。主循環(huán)有四輪〔MD4只有三輪〕,每輪循環(huán)都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結果向左環(huán)移一個不定的數(shù),并加上a、b、c或d中之一。最后用該結果取代a、b、c或d中之一。以下是每次操作中用到的四個非線性函數(shù)〔每輪一個〕。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))〔&是與,|是或,~是非,^是異或〕這四個函數(shù)的說明:如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。F是一個逐位運算的函數(shù)。即,如果X,那么Y,否那么Z。函數(shù)H是逐位奇偶操作符。假設Mj表示消息的第j個子分組〔從0到15〕,常數(shù)ti是4294967296*abs(sin(i))的整數(shù)局部,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。然后用下一分組數(shù)據(jù)繼續(xù)運行算法,最后的輸出是A、B、C和D的級聯(lián)。主要過程如下所示:程序主要算法分析〔1〕MD5壓縮函數(shù)要經過四輪處理過程,四輪處理過程中使用的根本邏輯函數(shù)在程序的開始做出聲明,每個函數(shù)的輸入是三個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〕對應于四輪的根本操作即移位操作函數(shù)如下:#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長度的字節(jié)數(shù)的模//用于判斷已有消息加上當前傳過來的消息總長度能不能到達512bits,如果能夠到達那么對湊夠的512bits進行一次處理if(length>=partLen){memcpy(&_buffer[index],input,partLen);transform(_buffer);//對當前輸入的剩余字節(jié)做轉換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; //保存當前狀態(tài)memcpy(oldState,_state,16);memcpy(oldCount,_count,8);//將要被轉換的信息的bits長度拷貝到bits中encode(_count,bits,8);//計算所有的bits長度的字節(jié)數(shù)的模64index=(uint32)((_count[0]>>3)&0x3f);//計算需要填充的字節(jié)數(shù),padLen的取值范圍在1-64之間padLen=(index<56)?(56-index):(120-index);//這一次函數(shù)笤俑絕對不會再導致MD5Transform的被調用,因為這一次不會填滿512bitsupdate(PADDING,padLen);update(bits,8); //將結果保存到digest中encode(_state,_digest,16);memcpy(_state,oldState,16);memcpy(_count,oldCount,8);}程序運行結果如下所示平安性分析MD5算法中,輸出的每一位都是輸入的每一位的函數(shù),邏輯函數(shù)F、G、H、I的復雜迭代使得輸出對輸入的依賴非常小。但是,Berson已經證明,對單輪的MD5算法,利用差分密碼分析,可以在合理時間內找出摘要相同的兩條報文。MD5算法抗密碼分析的能力較弱,對MD5的生日攻擊所需代價是需要試驗264個消息。2004年8月17日,在美國加州圣巴巴拉召開的美密會〔Crypto2004〕上,中國的王小云、馮登國、來學嘉、于紅波4位學者宣布,只需1小時就可找出MD5的碰撞?!怖貌罘址治觥彻€密碼算法--RSA5.1算法概述MIT三位年青數(shù)學家,A.Shamir和L.Adleman在1978年發(fā)現(xiàn)了一種用數(shù)論構造雙鑰體制的方法,稱作MIT體制,后來被廣泛稱之為RSA體制。它既可用于加密、又可用于數(shù)字簽名。RSA算法的平安性基于數(shù)論中大整數(shù)分解的困難性。RSA算法,它通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在網絡效勞器中注冊。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常采用傳統(tǒng)加密方法與公開密鑰加密方法相結合的方式,即信息采用改良的DES或IDEA對話密鑰加密,然后使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息后,用不同的密鑰解密并可核對信息摘要。RSA算法是第一個能同時用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在的三十多年里,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優(yōu)秀的公鑰方案之一。算法原理及設計思想算法描述-密鑰產生KG():獨立地選取兩大素數(shù)p和q(各100~200位十進制數(shù)字)計算n=p×q,其歐拉函數(shù)值(n)=(p-1)(q-1)隨機選一整數(shù)e,1e<(n),gcd((n),e)=1(4)在模(n)下,計算e的有逆元d=e-1mod(n)(5)以n,e為公鑰。私鑰為d。(p,q不再需要,可以銷毀。)算法描述-加密E()和解密D():(1)加密將明文分組,各組對應的十進制數(shù)小于nc=memodn(2)解密m=cdmodn原理: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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論