AES密碼學(xué)課程設(shè)計(C語言實現(xiàn))_第1頁
AES密碼學(xué)課程設(shè)計(C語言實現(xiàn))_第2頁
AES密碼學(xué)課程設(shè)計(C語言實現(xiàn))_第3頁
AES密碼學(xué)課程設(shè)計(C語言實現(xiàn))_第4頁
AES密碼學(xué)課程設(shè)計(C語言實現(xiàn))_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、成都信息工程學(xué)院課程設(shè)計報告AES加密解密軟件的實現(xiàn)目錄1、選題背景42、設(shè)計的目標42.1基本目標:42.2較高目標:53、功能需求分析54、模塊劃分64.1、密鑰調(diào)度64.2、加密84.2.1、字節(jié)代替(SubBytes)84.2.2、行移位(ShiftRows)104.2.3、列混合(MixColumn)114.2.4、輪密鑰加(AddRoundKey)134.2.5、加密主函數(shù)144.3、解密164.3.1、逆字節(jié)替代(InvSubBytes)164.3.2、逆行移位(InvShiftRows)174.3.3、逆列混合(InvMixCloumns)174.3.4、輪密鑰加(AddRou

2、ndKey)184.3.5、解密主函數(shù)185.測試報告205.1主界面205.2測試鍵盤輸入明文和密鑰加密205.3測試鍵盤輸入密文和密鑰加密215.3測試文件輸入明文和密鑰加密225.4測試文件輸入密文和密鑰加密225.5軟件說明236.課程設(shè)計報告總結(jié)237.參考文獻241、選題背景高級加密標準(Advanced Encryption Standard,AES),在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準。這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標準由美國國家標準與技術(shù)研究院(NIST)于2001年11月2

3、6日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。該算法為比利時密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計,結(jié)合兩位作者的名字,以Rijndael之命名之,投稿高級加密標準的甄選流程。(Rijndael的發(fā)音近于 "Rhine doll") 嚴格地說,AES和Rijndael加密法并不完全一樣(雖然在實際應(yīng)用中二者可以互換),因為Rijndael加密法可以支援更大范圍的區(qū)塊和密鑰長度:AES的區(qū)塊長度固定為128 位元,密鑰長度則可以是128,192或256位元

4、;而Rijndael使用的密鑰和區(qū)塊長度可以是32位元的整數(shù)倍,以128位元為下限,256位元為上限。加密過程中使用的密鑰是由Rijndael密鑰生成方案產(chǎn)生。大多數(shù)AES計算是在一個特別的有限域完成的。 截至2006年,針對AES唯一的成功攻擊是旁道攻擊 旁道攻擊不攻擊密碼本身,而是攻擊那些實作于不安全系統(tǒng)(會在不經(jīng)意間泄漏資訊)上的加密系統(tǒng)。2005年4月,D.J. Bernstein公布了一種緩存時序攻擊法,他以此破解了一個裝載OpenSSL AES加密系統(tǒng)的客戶服務(wù)器6。為了設(shè)計使該服務(wù)器公布所有的時序資訊,攻擊算法使用了2億多條篩選過的明碼。有人認為誰?,對于需要多個跳躍的國際互聯(lián)網(wǎng)

5、而言,這樣的攻擊方法并不實用7。 Bruce Schneier稱此攻擊為“好的時序攻擊法”8。 2005年10月,Eran Tromer和另外兩個研究員發(fā)表了一篇論文,展示了數(shù)種針對AES的緩存時序攻擊法。其中一種攻擊法只需要800個寫入動作,費時65毫秒,就能得到一把完整的AES密鑰。但攻擊者必須在執(zhí)行加密的系統(tǒng)上擁有執(zhí)行程式的權(quán)限,方能以此法破解該密碼系統(tǒng)。雖然高級加密標準也有不足的一面,但是,它仍是一個相對新的協(xié)議。因此,安全研究人員還沒有那么多的時間對這種加密方法進行破解試驗。我們可能會隨時發(fā)現(xiàn)一種全新的攻擊手段會攻破這種高級加密標準。至少在理論上存在這種可能性。2、設(shè)計的目標2.1基

6、本目標:(1)在深入理解AES加密/解密算法理論的基礎(chǔ)上,能夠設(shè)計一個AES加密/解密軟件系統(tǒng),采用控制臺模式,使用VS2010進行開發(fā),所用語言為C語言進行編程,實現(xiàn)加密解密;(2)能夠完成只有一個明文分組的加解密,明文和密鑰是ASCII碼,長度都為16個字符(也就是固定明文和密鑰為128比特),輸入明文和密鑰,輸出密文,進行加密后,能夠進行正確的解密;(3)程序運行時,能夠按照要求輸出最后兩輪的輪密鑰,以及最后兩輪加密或解密之后的值,16進制表示;(4)程序有良好的人機交互操作;(5)能夠?qū)崿F(xiàn)從兩個文件分別讀取明文和密鑰,并在程序中輸出明文及密鑰;(6)要求有與標準fips-197進行比較

7、的獨立模塊;(7)最后提供所設(shè)計系統(tǒng)的報告及完整的軟件,關(guān)鍵代碼等。2.2較高目標:能完成以下全部或部分功能:(1)如果從文件讀取的明文不止一個分組,程序能完成分組,然后加密;最后一個分組長度不足時要求完成填充;輸入信息可以是文本文檔,或者普通文件。進行加密后,能夠進行正確的解密;(2)密鑰包括128bit、192bit、256bit三種情況,有三種情況時與標準fips-197進行比較的獨立模塊,且從文本文件讀取。(3)程序代碼有比較好的結(jié)構(gòu),模塊劃分合理,如用類進行封裝,通過調(diào)用類的成員函數(shù)實現(xiàn)加密解密功能,函數(shù)的參數(shù)及返回值設(shè)置合理等;(4)對加密大文件的考慮;(5)多線程的使用;(6)界

8、面友好,程序設(shè)計實現(xiàn)有創(chuàng)新。 3、功能需求分析AES中的操作均是以字節(jié)作為基礎(chǔ)的,用到的變量也都是以字節(jié)為基礎(chǔ)。State可以用4×4的矩陣表示。AES算法結(jié)構(gòu)對加密和解密的操作,算法由輪密鑰開始,并用Nr表示對一個數(shù)據(jù)分組加密的輪數(shù)(加密輪數(shù)與密鑰長度的關(guān)系如表2所示)。AES算法的主循環(huán)State矩陣執(zhí)行輪迭代運算,每輪都包括所有 4個階段的代換,分別是在規(guī)范中被稱為 SubBytes(字節(jié)替換)、ShiftRows(行位移變換)、MixColumns(列混合變換) 和AddRoundKey,(由于外部輸入的加密密鑰K長度有限 ,所以在算法中要用一個密鑰擴展程序(Keyexpan

9、sion)把外部密鑰 K 擴展成更長的比特串,以生成各輪的加密和解密密鑰。)最后執(zhí)行只包括 3個階段 (省略 MixColumns變換)的最后一輪運算。表2 AES參數(shù)密鑰長度(bits)128192256明文分組長度(bits)128128128輪數(shù)101214每輪密鑰長度(bits)128128128擴展密鑰長度(bytes)176206240基本要求按標準分組,以128比特為分組大小。所以輪數(shù)為10輪,密鑰長度也為128比特4、模塊劃分劃分為三個部分,密鑰調(diào)度,加密,解密, 4.1、密鑰調(diào)度一密鑰調(diào)度包括兩個部分:密鑰擴展和輪密鑰選取。密鑰擴展的作用是在數(shù)據(jù)加密/解密前得到輪變換中中使用

10、的輪密鑰,其基本原則是:1) 輪密鑰的密鑰長度為分組長乘以(1 +Nr),如果分組長為128bit,輪數(shù)為了10,則輪密鑰的長度為128*(10+1)= 1408bit;2) 種子密鑰擴展為擴展密鑰,種子密鑰長度為4*NK個字節(jié);3) 輪密鑰由以下方法從擴展密鑰中獲得:對第1輪密鑰由前Nb個字構(gòu)成;第2輪密鑰由第二個Nb個字節(jié)即第Nb + 1個字到第2Nb個字構(gòu)成;以下依次類推。擴展密鑰用數(shù)組w(Nb*(Nr + 1)表示,前Nk個字是原密鑰,其它密鑰字通過計算方法生成。子字節(jié)變換是一個返回4個字節(jié)的函數(shù),每個字節(jié)都是它輸入字中相應(yīng)位置字節(jié)通過S盒作用后的結(jié)果。循環(huán)左移變換返回的是這4個字節(jié)經(jīng)

11、循環(huán)置換后的字,即將該字循環(huán)左移一個字節(jié),如輸入字為w = (a0,a1,a2,a3),則變換后輸出字為w = (a1,a2,a3,a0)。擴展密鑰的前Nk個字由種子密鑰構(gòu)成,隨后的字wi等于字wi-1經(jīng)一些變換后得到的字temp和字Wi-Nk異或而成;而且對位置為Nk倍數(shù)的字變換中不僅運用了循環(huán)左移變換和子字節(jié)變換,還運用了輪常數(shù)Rcon對變換后的字temp進行異或。對輪常數(shù)的定義為:Rconi = (Rci,00,00,00)而Rci表示在有限域GF(28)中xi-1的值,即:Rci = 1 (即01)Rci=x·(Rci-1) = xi-1二關(guān)鍵代碼/先將密鑰數(shù)組的元素值存儲在

12、3維數(shù)組中,然后對其擴展,擴展方式氛圍兩種,條件是Ki是否是4的倍數(shù),兩種密鑰方式不同,復(fù)雜的是當(dāng)為4的倍數(shù)時,要進行生成Ti-1,先是行移位,然后是進入S盒字節(jié)替代,最后與輪常數(shù)異或得到,再將此T與Ki-4異或void KeyExpansion(unsigned char *Key,unsigned charExpandKey44) unsigned char RC = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36; /輪常數(shù) int i,j,m,n;for(m=0;m<4;m+) for(n=0;n<4;n

13、+)ExpandKey0mn=Keyn*4+m; for(i=1;i<11;i+) for(j=0;j<4;j+)unsigned char Temp4; for(m=0; m<4; m+)Tempm = j ? ExpandKeyimj-1 : ExpandKeyi-1m3; /進行兩種劃分,先把密鑰存在一個變量數(shù)組中,if(j = 0)unsigned char t = Temp0;for(m=0; m<3; m+)Tempm = SboxTemp(m+1)%4;Temp3 = Sboxt;Temp0 = RCi-1;for(m=0; m<4; m+) Exp

14、andKeyimj =ExpandKeyi-1mj Tempm; / 4.2、加密加密流程圖:4.2.1、字節(jié)代替(SubBytes)一AES定義了一個S盒,State中每個字節(jié)按照如下方式映射為一個新的字節(jié):把該字節(jié)的高4位作為行值,低4位作為列值,然后取出S盒中對應(yīng)行和列的元素作為輸出。例如,十六進制數(shù)84。對應(yīng)S盒的行是8列是4,S盒中該位置對應(yīng)的值是5F。S盒是一個由16x16字節(jié)組成的矩陣,包含了8位值所能表達的256種可能的變換。S盒按照以下方式構(gòu)造:(1) 逐行按照升序排列的字節(jié)值初始化S盒。第一行是00,01,02,OF;第二行是10,l1,1F等。在行X和列Y的字節(jié)值是xy。

15、(2) 把S盒中的每個字節(jié)映射為它在有限域GF()中的逆。GF代表伽羅瓦域,GF()由一組從0x00到0xff的256個值組成,加上加法和乘法。00被映射為它自身00。(3) 把S盒中的每個字節(jié)記成。對S盒中每個字節(jié)的每位做如下變換:上式中是指值為63字節(jié)C第i位,即。 符號()表示更新后的變量的值。AES用以下的矩陣方式描述了這個變換:最后完成的效果如圖:二關(guān)鍵代碼 直接采取讓4x4矩陣的值進入S盒,這是因為數(shù)組元素的要求前四位作為行數(shù),后四位作為列數(shù),而元素值剛好是16進制表示形如:AB,元素的值=A*16+B,這個剛好就是S盒的位置,void SubBytes(unsigned char

16、 State4) int i,j; for(i=0; i<4; i+) for(j=0; j<4; j+) Stateij = SboxStateij; 4.2.2、行移位(ShiftRows)一State的第一行字節(jié)保持不變,State的第二行字節(jié)循環(huán)左移一個字節(jié),State的第三行字節(jié)循環(huán)左移兩個字節(jié),State的第四行循環(huán)左移三個字節(jié)。行移位左偏移量:變化如圖2所示。二關(guān)鍵代碼void ShiftRows(unsigned char State4) /采用最原始的辦法,以分別為0.1.2.3字節(jié) unsigned char k; k=State10; State10=Stat

17、e11; State11=State12; State12=State13; State13=k; k=State21; State21=State23;State23=k;k=State20;State20=State22;State22=k; k=State33;State33=State32;State32=State31;State31=State30;State30=k;4.2.3、列混合(MixColumn)一列混合變換是一個替代操作,是AES最具技巧性的部分。它只在AES的第0,1,Nr一1輪中使用,在第N r輪中不使用該變換。乘積矩陣中的每個元素都是一行和一列對應(yīng)元素的乘積之和

18、。在MixColumns變換中,乘法和加法都是定義在GF()上的。State的每一列 () 1=0,,3;J=0,被理解為 GF()上的多項式,該多項式與常數(shù)多項式相乘并模約化。這個運算需要做GF()上的乘法。但由于所乘的因子是三個固定的元素02、03、01,所以這些乘法運算仍然是比較簡單的(注意到乘法運算所使用的模多項式為)。設(shè)一個字節(jié)為b=(b7b6b5b4b3b2b1b0),則b×01=b; b×02=(b6b5b4b3b2b1b00)+(000b7b70b7b7); b×03=b×01+b×02。(請注意,加法為取模2的加法,即逐比特異

19、或)寫成矩陣形式為:最后完成的效果如圖:二關(guān)鍵代碼/其中調(diào)用小函數(shù)xtime,根據(jù)02乘法原理編寫,最后03乘是在02乘的基礎(chǔ)上進行了03=(21+1 ),同理進行一次02乘,在與本省異或void MixColumns(unsigned char State4) unsigned char output44;int i, j; for(j=0; j< 4; j+) for(i=0; i<4; i+) outputij = xtime(Statei%4j) /0x02乘法 ( State ( i + 1 ) % 4j xtime( State ( i + 1 ) % 4j ) ) /

20、0x03乘法 State ( i + 2 ) % 4j /0x01乘法 State ( i + 3 ) % 4j; /0x01乘法 for(i=0; i<4; i+) for(j=0; j< 4; j+)Stateij=outputij; 02乘法函數(shù):unsigned char xtime (unsigned char input) int temp; temp = input<<1; if(input & 0x80) temp = 0x1b; return temp; 4.2.4、輪密鑰加(AddRoundKey)一Add RoundKey稱為輪密鑰加變換,

21、128位的State按位與 128位的密鑰XOR:對 j=0, ,L-1 輪密鑰加變換很簡單,卻影響了 State中的每一位。密鑰擴展的復(fù)雜性和 AES的其他階段運算的復(fù)雜性,卻確保了該算法的安全性。最后完成的效果如圖:二關(guān)鍵代碼void AddRoundKey(unsigned char State4,unsigned char Key4) int i,j;for(i=0;i<4;i+)for(j=0;j<4;j+)Stateji=Keyji;4.2.5、加密主函數(shù)關(guān)鍵代碼/根據(jù)加密函數(shù)流程圖,進行架構(gòu)加密主函數(shù),參數(shù)分別是一個密鑰數(shù)組,一個明文分組進入,參與運算,其中密鑰一進入

22、就進入密鑰擴展,為以后的加密產(chǎn)生密鑰,void Encryption(unsigned char input16,unsigned char Key16) KeyExpansion(Key,ExpandKey); unsigned char State44; int i,j,k; for(i=0; i<4; i+) for(j=0; j<4 ;j+) Stateij= input4*j+i; AddRoundKey(State,ExpandKey0); for(i=1; i<=10; i+) SubBytes(State); ShiftRows(State); if(i!=1

23、0)MixColumns(State); AddRoundKey(State,ExpandKeyi); if(i>=9) printf("n第%d輪加密密鑰矩陣為:n",i); int m,n; for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,",ExpandKeyinm); printf("n"); printf("第%d輪加密出的密文為:",i); for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,

24、",Statenm); printf("n"); for(j=0; j<4; j+) for(k=0; k<4 ;k+)input4*k+j=Statejk; 4.3、解密解密流程:4.3.1、逆字節(jié)替代(InvSubBytes)關(guān)鍵代碼與字節(jié)代替類似,逆字節(jié)代替基于逆S盒實現(xiàn)。直接進圖逆S盒,原理很簡單,與字節(jié)替代相同,只是盒子不同void InvSubBytes(unsigned char State4) int i,j; for(i=0; i<4; i+) for(j=0; j<4; j+) Stateij = InvSboxStat

25、eij; 4.3.2、逆行移位(InvShiftRows)關(guān)鍵代碼/與加密時的行移位區(qū)別在于移位方向相反。即向右移動void InvShiftRows(unsigned char State4) char k;k=State13; State13=State12;State12=State11;State11=State10;State10=k;k=State23; State23=State21; State21=k;k=State22;State22=State20;State20=k;k=State30; State30=State31;State31=State32;State32=S

26、tate33;State33=k;4.3.3、逆列混合(InvMixCloumns)關(guān)鍵代碼/逆列混合操作與列混合一樣,只是多項式d(x)不同,因而可以表示為矩陣相乘來實現(xiàn),輸入矩陣與固定矩陣(十六進制)相乘, void InvMixColumns(unsigned char State4) unsigned char output44; int i, j; for(j=0; j< 4; j+) for(i=0; i<4; i+) outputij = (xtime(xtime(xtime(Statei % 4j) xtime(xtime(Statei % 4j)xtime(Sta

27、tei % 4j) /0x0E=14乘法 (xtime(xtime(xtime(State ( i + 1 ) % 4j) xtime(State ( i + 1 ) % 4j) State ( i + 1 ) % 4j) /0x0B=11乘法 (xtime(xtime(xtime(State ( i + 2 ) % 4j) xtime(xtime(State ( i + 2 ) % 4j) State ( i + 2 ) % 4j) /0x0D=13乘法 (xtime(xtime(xtime(State ( i + 3 ) % 4j) State ( i + 3 ) % 4j); /0x09

28、乘法 for(i=0; i<4; i+) for(j=0; j< 4; j+)Stateij=outputij; 4.3.4、輪密鑰加(AddRoundKey)與加密完全相同4.3.5、解密主函數(shù)關(guān)鍵代碼/與加密函數(shù)不同的是,過程相反,根據(jù)流程圖構(gòu)造解密主函數(shù),輪數(shù)相同,由于是AES本質(zhì)是對稱函數(shù),所以是相反的而已void InvEncryption(unsigned char input16,unsigned char Key16) int i,j,k;KeyExpansion(Key,ExpandKey);unsigned char State44; for(j=0; j<

29、;4; j+) for(k=0; k<4 ;k+) Statejk = inputk*4+j; AddRoundKey(State,ExpandKey10); for(i=9; i>=0; i-) InvShiftRows(State);InvSubBytes(State); AddRoundKey(State, ExpandKeyi);if(i)InvMixColumns(State);if(i<=1) /* 輸出最后解密兩輪密鑰和密文 */ printf("n第%d輪密鑰矩陣為:n",10-i); int m,n; for(m=0;m<4;m+)

30、 for(n=0;n<4;n+) printf("%X,",ExpandKeyinm); printf("n"); printf("第%d輪解密出的消息為:",10-i); for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,",Statenm); printf("n"); printf("n最后解密出的明文消息為:"); for(int m=0;m<4;m+) for(int n=0;n<4;n+) print

31、f("%c ",Statenm); printf("n");for(j=0;j<4;j+) for(k=0; k<4 ;k+) inputk*4+j = Statejk; 5.測試報告由于加密解密分兩種方式,一種是由鍵盤輸入進行加密解密。另一種是文件讀入加密解密5.1主界面根據(jù)數(shù)字選擇使用軟件,下面分開測試:5.2測試鍵盤輸入明文和密鑰加密鍵盤輸入1,選擇加密,并輸入:IloveYouYouKnow? 共計16個字符,再任意輸入16字符的密鑰,為方便起見,測試時,輸入為11111111111111111,最后加密成功之后輸出中間密鑰與密文狀態(tài)其中最后加密密文為:A1,00,E9,BD,13,9A,CC,51,76,6A,3F,B8,AA,34,6A,C5.3測試鍵盤輸入密文和密鑰加密選擇3,進入解密界面。為測試是否成功加密,采用上次加密時的密文進行輸入,如圖結(jié)果說明加密解密是成功的。5.3測試文件輸入明文和密鑰加密/選擇2進入文件加密界面,輸入保存有明文的文件名:Mingwen.txt.密鑰文件名:Key.txt 輸出到空文件State.txt中進行保存5

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論