AES課程設(shè)計報告(共22頁)_第1頁
AES課程設(shè)計報告(共22頁)_第2頁
AES課程設(shè)計報告(共22頁)_第3頁
AES課程設(shè)計報告(共22頁)_第4頁
AES課程設(shè)計報告(共22頁)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課程設(shè)計報告AES加密解密的實現(xiàn)課程名稱: 密碼算法程序設(shè)計 學(xué)生姓名: 學(xué)生學(xué)號: 專業(yè)班級: 任課教師: 2011年 6 月 24 日專心-專注-專業(yè)附件:課程設(shè)計成績評價表指導(dǎo)老師評閱成績表學(xué)習(xí)與工作態(tài)度(30%)選題意義(10%)文獻綜述(10%)研究水平與設(shè)計能力(20%)課程設(shè)計說明說(論文)撰寫質(zhì)量(20%)設(shè)計創(chuàng)新(10%)總分指導(dǎo)老師簽名: 年 月 日課程設(shè)計答辯記錄及評價表學(xué)生講述情況教師主要提問記錄學(xué)生回答問題情況答辯評分評分項目分值評價參考標(biāo)準(zhǔn)評分總分優(yōu)良中及格差選題意義1098764文獻綜述1098764研究水平與設(shè)計能力2019171513

2、10課程設(shè)計說明書(論文)撰寫質(zhì)量201917151310設(shè)計創(chuàng)新1098764答辯效果302825221915答辯小組成員簽名答辯小組組長簽名: 年 月 日課程設(shè)計成績評定表成績匯總評分項目評分比例分?jǐn)?shù)課程設(shè)計總分指導(dǎo)老師評分50%答辯小組評分50%目 錄1 背景與意義 由于AES應(yīng)用了,感覺這算法的分組為固定長度的128bit,而密鑰卻有三種,分別為128,192,256bit,對應(yīng)三種不同輪數(shù)分別為10輪,12輪,14輪。這就加大了算法實現(xiàn)的難度,加上每輪的4種變換,更加體現(xiàn)了算法的復(fù)雜性,所以我采用的AES來實現(xiàn)。不僅加深了我對密碼算法本身的認(rèn)識,更加鞏固了我本來不是很熟悉的C語言。A

3、ES算法采用的不可約多項式是p(x)=(84310),共256個多項余式構(gòu)成了一個有限域,在這有限域上要用到字節(jié)運算和字運算。 隨著對稱密碼的發(fā)展,DES數(shù)據(jù)加密標(biāo)準(zhǔn)算法由于密鑰長度較小(56位),已經(jīng)不適應(yīng)當(dāng)今分布式開放網(wǎng)絡(luò)對數(shù)據(jù)加密安全性的要求,因此1997年NIST公開征集新的數(shù)據(jù)加密標(biāo)準(zhǔn),即AES1。AES即高級加密標(biāo)準(zhǔn),作為傳統(tǒng)堆成加密算法標(biāo)準(zhǔn)DES的替代者,有美國國家標(biāo)準(zhǔn)與技術(shù)研究所于1997年提出征集該算法的公告.1999年3月22日,NIST從15個候選算法中公布了5個候選算法進入第二輪懸著:MARS、RC6、Rijindael、SERPENT和Twofish。經(jīng)過三輪的篩選,

4、2000年10月2日,以安全性(穩(wěn)定的數(shù)學(xué)基礎(chǔ)、沒有算法弱點、算法抗密碼分析的強度、算法輸出的隨機性)、性能(必須能再多種平臺上一較快的速度實現(xiàn))、大小(不能占用大量的存儲空間和內(nèi)存)、實現(xiàn)特性(靈活性、硬件和軟件適應(yīng)性、算法的簡單性等)為標(biāo)準(zhǔn)而最終選定了兩個比利時研究者Vincent Rijmen和Joan Daemen發(fā)明的Rijndael算法,并于2001年正式發(fā)布了AES標(biāo)準(zhǔn)。此算法將成為美國新的數(shù)據(jù)加密標(biāo)準(zhǔn)而被廣泛應(yīng)用在各個領(lǐng)域中。盡管人們對AES還有不同的看法,但總體來說,AES作為新一代的數(shù)據(jù)加密標(biāo)準(zhǔn)匯聚了強安全性、高性能、高效率、易用和靈活等優(yōu)點。AES設(shè)計有三個密鑰長度:12

5、8,192,256位,相對而言,AES的128密鑰比DES的56密鑰強1021倍2。AES算法主要包括三個方面:輪變化、圈數(shù)和密鑰擴展。本文以128為例,介紹算法的基本原理;結(jié)合AVR匯編語言,實現(xiàn)高級數(shù)據(jù)加密算法AES。2. 系統(tǒng)設(shè)計先定義后面s盒變換和密鑰擴展要用到的s盒數(shù)組和rcon數(shù)組,然后定義s盒查找函數(shù),行移位,列混合函數(shù),因為這幾個函數(shù)無論是在10輪還是12輪還是14輪執(zhí)行時都沒變化。然后就是12輪的輪密鑰加和密鑰擴展。這一步也許有點困難,接著就是12輪的加密函數(shù)本身。然后才是10輪的輪米要加和密鑰擴展,加密函數(shù)。最后是解密要用到的逆字節(jié)替代,逆行移位,逆列混合,輪密鑰加和密鑰擴

6、展函數(shù)和加密是一樣的,所以不用重新定義。2.1系統(tǒng)主要目標(biāo)基本要求部分: 1完成一個明文分組的加解密,明文和密鑰是十六進制,長度都為128比特(32個16進制數(shù)),按照標(biāo)準(zhǔn)輸入明文和密鑰,輸出密文,進行加密后,能夠進行正確的解密。2程序運行時,要求輸出每一輪使用的密鑰,以及每一輪中字節(jié)替代、行移位、列混合和密鑰加等每一步操作之后的16進制表示的值。3. 提供運行標(biāo)準(zhǔn)示例的選項。4. 能夠在文件讀取密鑰明文。5. 程序有良好的人機交互操作。,2.2主要軟件需求(運行環(huán)境)本軟件適用VC語言編寫,編譯成功后的EXE文件可以在裝有windows系統(tǒng)的任何計算機上使用。測試平臺:Windows XP

7、Professional使用軟件:Visual C+ 6.02.3功能模塊與系統(tǒng)結(jié)構(gòu)主函數(shù):xAESencrypt();128比特加密xAESencrypt6(); 12輪加密xAESdencrypt();128比特解密show();演示void SB() /從文件讀取192比特密鑰和明文void SA()/從文件讀取128比特密鑰void subbyte(int col44) /字節(jié)替代 void shiftrows(int col44) /行移位void mixcolumn(int col44) /列混合void addroundkey6(int col44,int allkey452,i

8、nt nr) /192比特輪密鑰加void addroundkey(int col44,int allkey444,int nr) /128論密鑰加void keyschedule6(int key46,int allkey452,int nk,int nr) /192密鑰擴展void keyschedule(int key44,int allkey444,int nk,int nr) /128密鑰擴展void invsubbyte(int col44) /逆字節(jié)替代void invshiftrows(int col44) /逆行移位void invmixcolumn(int col44) /

9、逆列混合總體流程圖:S盒置換明文分組數(shù)據(jù)X與原始密鑰K1異或(XK1)行變換列混淆與子密鑰Ki異或(XKi)S盒置換行變換與子密鑰Kr+1異或(XKi+1)加密分組數(shù)據(jù)加密分組數(shù)據(jù)與子密鑰Kr+1異或(XKi+1)與子密鑰Ki異或(XKi)反行變換反S盒置換反行變換反列混淆反列混淆與原始密鑰K1異或(XK1)解密分組數(shù)據(jù)X先定義s盒查找函數(shù),行移位,列混合函數(shù),因為這幾個函數(shù)無論是在10輪還是12輪還是14輪執(zhí)行時都沒變化。然后就是12輪的輪密鑰加和密鑰擴展。這一步也許有點困難,接著就是12輪的加密函數(shù)xAESencrypt6()本身。然后才是10輪的輪米要加和密鑰擴展,加密函數(shù)xAESenc

10、rypt()。最后是解xAESdencrypt()要用到的逆字節(jié)替代,逆行移位,逆列混合,輪密鑰加和密鑰擴展函數(shù)和加密是一樣的,所以不用重新定義。最后寫了一個演示show()。用的是動畫上面的明文和密鑰作為輸入。3 系統(tǒng)功能程序設(shè)計3.1基本要求部分3.1.1 字節(jié)替換字節(jié)代換是非線性變換,獨立地對狀態(tài)的每個字節(jié)進行查表代換。代換表(S盒)是可逆的,由以下兩個變換合成得到:首先,將字節(jié)看作GF(28)上的元素,映射到自己的乘法逆元。b(x)=a(x) mod m(x)其中m(x)=x8+x4+x3+x+1,當(dāng)a(x)=0時,其逆元素也為0,即00映射到自己。其次,對字節(jié)作如下的(GF(2)上的

11、,可逆的)仿射變換,如圖2所示。圖2 S盒仿射變換將從00到FF的十六進制數(shù)經(jīng)過上述運算就可以得到一個16*16的字節(jié)代換表,也就是用于加密的S盒。圖3是字節(jié)代換示意圖。圖3 字節(jié)代換示意圖主要算法:void subbyte(int col44) for(int i=0;i<4;i+)for(int j=0;j<4;j+)colij=sboxcolij;for(int a=0;a<4;a+)for( int b=0;b<4;b+)printf(" %x",colba);printf("n");S數(shù)組表示S-盒,此處采用直接查表的方

12、法實現(xiàn)S-盒替代。對于用于解密的逆S盒,需要通過在GF(2)域上的逆仿射變換生成,下面是進行逆仿射變換的仿射變換矩陣,如圖4。圖4 逆S盒仿射變換它的逆變換的實現(xiàn)和它十分類似,同樣也是通過查逆S-盒完成。3.1.2行移位行移位是根據(jù)不同的分組長度將狀態(tài)矩陣中的各行進行相應(yīng)循環(huán)移位。在加密過程中,狀態(tài)矩陣的后三行要按字節(jié)進行左移位。在解密過程中則要進行逆行移位,即將狀態(tài)矩陣中的后三行按字節(jié)進行右移位。表3給出了在分組不同的情況下移位量,即在后三行的第1行要移位c1個字節(jié),第2行要移位c2個字節(jié),第3行要移位c3個字節(jié)。表3 行移位量Nbc1c2c3412361238134加密算法的行移位過程如圖

13、5所示。圖5 行移位示意圖主要算法:void shiftrows(int col44)unsigned char temp4*4; int i,j;for(j=0;j<4;j+)for(i=0;i<4;i+)temp4*i+j=colij;for(i=1;i<4;i+)for(j=0;j<4;j+)if(i=1)colij=temp4*i+(j+1)%4;/第一行左移1位else if(i=2)colij=temp4*i+(j+2)%4;/第二行左移2位else if(i=3)colij=temp4*i+(j+3)%4;/第三行左移3位for(int a=0;a<

14、4;a+)for(int b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.3列混合在列混合變換中,將狀態(tài)矩陣中的一列看作在GF(28)上的多項式,與一個常數(shù)多項式c(x)相乘并模x4+1。其中,c(x)=03x3+01x2+01x+02(系數(shù)用十六進制表示)c(x)是與x4+1互素的,因此模x4+1是可逆的。列混合預(yù)算也可寫為矩陣乘法(圖6)。設(shè)b(x)=c(x)a(x),則圖6 列混合的矩陣表示主要算法:void mixcolumn(int col44)int r=0,c=0;int temp44;f

15、or(r=0;r<4;r+)for(c=0;c<4;c+)temprc=colrc;for(c=0;c<4;c+)col0c=gfmultby02(temp0c)gfmultby03(temp1c)gfmultby01(temp2c)gfmultby01(temp3c);col1c=gfmultby01(temp0c)gfmultby02(temp1c)gfmultby03(temp2c)gfmultby01(temp3c);col2c=gfmultby01(temp0c)gfmultby01(temp1c)gfmultby02(temp2c)gfmultby03(temp3

16、c);col3c=gfmultby03(temp0c)gfmultby01(temp1c)gfmultby01(temp2c)gfmultby02(temp3c);for(int a=0;a<4;a+)for( int b=0;b<4;b+)printf(" %x",colba);printf("n");這個算法還有點沒弄明白,主要是調(diào)用上面的函數(shù)。在解密過程中,要做的逆列混合運算和列混合類似,即每列都用一個特定的多項式d(x)相乘。d(x)滿足(03x3+01x2+01x+02)d(x)=01由此得到d(x)= 0bx3+0dx2+09x+

17、0e逆列混合運算可轉(zhuǎn)變成如下的一個矩陣運算,如圖7所示。圖7 逆列混合矩陣表示3.1.4密鑰加輪密鑰加是最后一個階段,是將列混合的狀態(tài)與子密鑰進行XOR邏輯運算,即將輪密鑰與狀態(tài)按比特異或。輪密鑰是通過密鑰調(diào)度過程從密碼密鑰中得到的,輪密鑰長度等于分組長度。密鑰加是將輪密鑰簡單地與狀態(tài)進行逐比特異或。輪密鑰由種子密鑰通過密鑰編排算法得到,輪密鑰長度等于分組長度Nb。圖8是密鑰加運算示意圖。圖8 密鑰加示意圖主要算法:void addroundkey(int col44,int allkey444,int nr)int a,b,i,j;for(i=0;i<4;i+)for(j=0;j<

18、;4;j+)colij=allkeyij+4*nr; for(a=0;a<4;a+)for(b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.5密鑰擴展 密鑰擴展我認(rèn)為是本密碼程序的重點也是難點,密鑰首先有一個初始密鑰,要將密鑰擴展出十組子密鑰。密鑰bit的總數(shù)=分組長度*(輪數(shù)Round+1) 例如當(dāng)分組長度為128bits和輪數(shù)Round為10時,輪密鑰長度為128*(10+1)=1408bits。密鑰的長度是夠使用的,所以必須將密碼密鑰擴展成一個擴展密鑰。擴展算法:第i-1輪的分組長度個字節(jié)的

19、子密鑰被分成四組來處理,每組4個字節(jié)。最后一組的4個字節(jié)先執(zhí)行一個字節(jié)的循環(huán)左移,由s盒來進行替代處理,然后這4個字節(jié)結(jié)果中的第一個字節(jié)和輪常數(shù)相異或,這個輪常數(shù)是預(yù)先定義的,并且固定值。最后,為了得到第i輪的密鑰,把得到的4個字節(jié)的結(jié)果和輪密鑰的最初4字節(jié)按位異或,得到i輪密鑰的最初4個字節(jié),然后又和密鑰的下面的4個字節(jié)按位異或,得到i輪密鑰的下面四個字節(jié),以此類推。下面是主要圖和代碼:void keyschedule(int key44,int allkey444,int nk,int nr)int temp41,t;for(int a=0;a<4;a+)/allkey初始化 for

20、(int b=0;b<44;b+)allkeyab=0;/置零 for(int i=0;i<4;i+)/將key保存在allkey的前4列 for(int j=0;j<4;j+) allkeyij=keyij; i=nk;while(i<(4*(nr+1)for(int x=0;x<4;x+) tempx0=allkeyxi-1;if(i%nk=0)/rotwordt=temp00;temp00=temp10;temp10=temp20;temp20=temp30;temp30=t;for(int k=0;k<4;k+)/ subwordtempk0=sbo

21、xtempk0;for(int h=0;h<4;h+) temph0=Rconhi/4;for(int y=0;y<4;y+)allkeyyi=allkeyyi-4tempy0;i+;for(int g=0;g<=10;g+)printf("第 %d 輪密鑰",g);for(int q=0;q<4;q+)for(int w=0;w<4;w+)printf(" %x",allkeywq+4*g);printf("n");3.1.6獲取RoundKey 以參數(shù)傳遞的形勢獲取allkey即每輪的密鑰。輪密鑰i(

22、即第i個輪密鑰)由輪密鑰緩沖字WNb*i到WNb*(i+1)-1給出,如圖9所示。W0W1W2W3W4W5W6W7W8W9W10W11W12W13W14輪密鑰0輪密鑰1圖9 Nb=6且Nk=4時的密鑰擴展與輪密鑰選取keyschedule(key,allkey,nk,nr);addroundkey(col,allkey,0);3.1.7逆字節(jié)替換這個就和S盒替代一樣。void invsubbyte(int col44)int i,j,a,b;for(i=0;i<4;i+)for(j=0;j<4;j+)colij=invsboxcolij;for(a=0;a<4;a+)for(

23、b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.8逆行移位void invshiftrows(int col44)int j,temp,a,b;temp=col13;for(j=3;j>0;j-)col1j=col1j-1;col10=temp;for(j=3;j>1;j-)temp=col2j;col2j=col2j-2;col2j-2=temp;temp=col30;for(j=1;j<4;j+)col3(j+3)%4=col3(j+4)%4;col33=temp;/printf(

24、"逆行移位后 :n");for(a=0;a<4;a+)for(b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.9逆列混合void invmixcolumn(int col44)int r=0,c=0,a,b;int temp44;for(r=0;r<4;r+)for(c=0;c<4;c+)temprc=colrc;for(c=0;c<4;c+)col0c=gfmultby0e(temp0c)gfmultby0b(temp1c)gfmultby0d(temp2c

25、)gfmultby09(temp3c);col1c=gfmultby09(temp0c)gfmultby0e(temp1c)gfmultby0b(temp2c)gfmultby0d(temp3c);col2c=gfmultby0d(temp0c)gfmultby09(temp1c)gfmultby0e(temp2c)gfmultby0b(temp3c);col3c=gfmultby0b(temp0c)gfmultby0d(temp1c)gfmultby09(temp2c)gfmultby0e(temp3c);for(a=0;a<4;a+)for(b=0;b<4;b+)printf(

26、" %x",colba);printf("n");3.1.10加密AES加密算法由初始輪密鑰加和Nr輪的輪變換組成,它的輸入為初始狀態(tài)矩陣和輪密鑰,執(zhí)行加密算法后產(chǎn)生一個輸出狀態(tài)矩陣,輸入明文和輸出密文均為128比特?;蛘呤菑奈募x取這些明文和密鑰。這里的密鑰可以是128比特也可以是192比特。流程圖如下:void xAESencrypt()system("cls");int nk=4,nr=10;int allkey444;int col44;int key44;printf("n請輸入加密密鑰:n");for(

27、int o=0;o<4;o+)for(int p=0;p<4;p+)scanf("%x",&keypo);/memcpy(dekey, key, 64);printf("n請輸入對應(yīng)要加密的字節(jié):n");for(int w=0;w<4;w+)for(int v=0;v<4;v+)scanf("%x",&colvw);printf("輸入的密鑰為(16進制):");for(int a=0;a<4;a+)for(int b=0;b<4;b+)printf("

28、 %x",keyba);printf("n");printf("輸入的明文為(16進制):");for(int c=0;c<4;c+)for(int d=0;d<4;d+)printf(" %x",coldc);printf("n");keyschedule(key,allkey,nk,nr);addroundkey(col,allkey,0);printf("輪子密鑰加結(jié)果:n");for(int e=0;e<4;e+)for(int f=0;f<4;f+)p

29、rintf(" %x",colef);printf("n"); for(int x=1;x<=(nr-1);x+)printf("第%d輪s盒置換以后:n",x);subbyte(col); printf("第%d輪行移位結(jié)果:n",x);shiftrows(col); printf("第%d列混合結(jié)果:n",x);mixcolumn(col); printf("第%d輪密鑰加結(jié)果:n",x);addroundkey(col,allkey,x); printf(&quo

30、t;第10輪s盒置換以后:n");subbyte(col); printf("第10輪行移位結(jié)果:n"); shiftrows(col);printf("第10輪密鑰加結(jié)果:n");addroundkey(col,allkey,nr); printf("nn加密結(jié)果為:");printf("n");for(int q=0;q<4;q+)for(int r=0;r<4;r+)printf(" %x",colrq);printf("n");/memcpy(d

31、e_asd, col, 64);printf("nn請按數(shù)字鍵“0”返回主菜單!(“enter”鍵確定)n");3.1.11解密流程圖如下:解密算法和加密算法類似,只是在解密算法中使用的變換為加密時相應(yīng)變換的逆變換,并且在第一輪到地Nr-1輪之間逆字節(jié)替代與逆行移位,逆列混合和逆輪密鑰加交換了位置。void xAESdencrypt()system("cls");int allkey444;int nr=10,nk=4;int asd44;int key44;printf("n請輸入解密密鑰:16進制(128比特)n");for(in

32、t o=0;o<4;o+)for(int p=0;p<4;p+)scanf("%x",&keypo);printf("n請輸入要解密的字符:16進制(128比特)n");for(int w=0;w<4;w+)for(int v=0;v<4;v+)scanf("%x",&asdvw);printf("您輸入的密鑰為:");for(int a=0;a<4;a+)for(int b=0;b<4;b+)printf(" %x",keyba);print

33、f("n");printf("您輸入的密文為:");for(int c=0;c<4;c+)for(int d=0;d<4;d+)printf(" %x",asddc);printf("n");keyschedule(key,allkey,nk,nr);printf("nn輪子密鑰加結(jié)果為:");addroundkey(asd,allkey,nr);printf("n");for(int x=9;x>=1;x-)printf("第%d逆字節(jié)替代結(jié)果:

34、n",10-x); invsubbyte(asd);printf("第%d逆行移位結(jié)果:n",10-x); invshiftrows(asd); printf("第%d逆輪密鑰加位結(jié)果:n",10-x); addroundkey(asd,allkey,x);printf("第%d逆列混合結(jié)果:n",10-x); invmixcolumn(asd);printf("第10逆字節(jié)替代結(jié)果:n");invsubbyte(asd);printf("第10逆行移位結(jié)果:n");invshiftr

35、ows(asd); printf("第10逆輪密鑰加位結(jié)果:n");addroundkey(asd,allkey,0);printf("nn解密結(jié)果為:");for(int i=0;i<4;i+)for(int j=0;j<4;j+)printf(" %x",asdji);printf("n");printf("nn請按數(shù)字鍵“0”返回主菜單!(“enter”鍵確定)n");4. 測試報告 密鑰擴展的測試本密鑰擴展的測試直接調(diào)用密鑰擴展函數(shù),測試密鑰在代碼以字節(jié)數(shù)組的方式中輸入。測試結(jié)果如下,與FIPS PUB 197 給出的結(jié)果完全相同

溫馨提示

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

評論

0/150

提交評論