版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> AES加密解密軟件的實(shí)現(xiàn)</p><p><b> 目錄</b></p><p><b> 1、選題背景4</b></p><p><b> 2、設(shè)計(jì)的目標(biāo)4</b><
2、/p><p> 2.1基本目標(biāo):4</p><p> 2.2較高目標(biāo):5</p><p> 3、功能需求分析5</p><p><b> 4、模塊劃分6</b></p><p> 4.1、密鑰調(diào)度6</p><p><b> 4.2、加密8&l
3、t;/b></p><p> 4.2.1、字節(jié)代替(SubBytes)8</p><p> 4.2.2、行移位(ShiftRows)10</p><p> 4.2.3、列混合(MixColumn)11</p><p> 4.2.4、輪密鑰加(AddRoundKey)13</p><p> 4.2
4、.5、加密主函數(shù)14</p><p><b> 4.3、解密16</b></p><p> 4.3.1、逆字節(jié)替代(InvSubBytes)16</p><p> 4.3.2、逆行移位(InvShiftRows)17</p><p> 4.3.3、逆列混合(InvMixCloumns)17</p&
5、gt;<p> 4.3.4、輪密鑰加(AddRoundKey)18</p><p> 4.3.5、解密主函數(shù)18</p><p><b> 5.測(cè)試報(bào)告20</b></p><p><b> 5.1主界面20</b></p><p> 5.2測(cè)試鍵盤輸入明文和密鑰加密
6、20</p><p> 5.3測(cè)試鍵盤輸入密文和密鑰加密21</p><p> 5.3測(cè)試文件輸入明文和密鑰加密22</p><p> 5.4測(cè)試文件輸入密文和密鑰加密22</p><p> 5.5軟件說(shuō)明23</p><p> 6.課程設(shè)計(jì)報(bào)告總結(jié)23</p><p>&
7、lt;b> 7.參考文獻(xiàn)24</b></p><p><b> 1、選題背景</b></p><p> 高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),在密碼學(xué)中又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過(guò)五年的甄選流程
8、,高級(jí)加密標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。該算法為比利時(shí)密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計(jì),結(jié)合兩位作者的名字,以Rijndael之命名之,投稿高級(jí)加密標(biāo)準(zhǔn)的甄選流程。(Rijndael的發(fā)音近于 "Rhine doll&quo
9、t;)</p><p> 嚴(yán)格地說(shuō),AES和Rijndael加密法并不完全一樣(雖然在實(shí)際應(yīng)用中二者可以互換),因?yàn)镽ijndael加密法可以支援更大范圍的區(qū)塊和密鑰長(zhǎng)度:AES的區(qū)塊長(zhǎng)度固定為128 位元,密鑰長(zhǎng)度則可以是128,192或256位元;而Rijndael使用的密鑰和區(qū)塊長(zhǎng)度可以是32位元的整數(shù)倍,以128位元為下限,256位元為上限。加密過(guò)程中使用的密鑰是由Rijndael密鑰生成方案產(chǎn)生。大多
10、數(shù)AES計(jì)算是在一個(gè)特別的有限域完成的。</p><p> 截至2006年,針對(duì)AES唯一的成功攻擊是旁道攻擊</p><p> 旁道攻擊不攻擊密碼本身,而是攻擊那些實(shí)作于不安全系統(tǒng)(會(huì)在不經(jīng)意間泄漏資訊)上的加密系統(tǒng)。2005年4月,D.J. Bernstein公布了一種緩存時(shí)序攻擊法,他以此破解了一個(gè)裝載OpenSSL AES加密系統(tǒng)的客戶服務(wù)器[6]。為了設(shè)計(jì)使該服務(wù)器公布所有的
11、時(shí)序資訊,攻擊算法使用了2億多條篩選過(guò)的明碼。有人認(rèn)為[誰(shuí)?],對(duì)于需要多個(gè)跳躍的國(guó)際互聯(lián)網(wǎng)而言,這樣的攻擊方法并不實(shí)用[7]。 Bruce Schneier稱此攻擊為“好的時(shí)序攻擊法”[8]。</p><p> 2005年10月,Eran Tromer和另外兩個(gè)研究員發(fā)表了一篇論文,展示了數(shù)種針對(duì)AES的緩存時(shí)序攻擊法。其中一種攻擊法只需要800個(gè)寫(xiě)入動(dòng)作,費(fèi)時(shí)65毫秒,就能得到一把完整的AES密鑰。但攻擊者
12、必須在執(zhí)行加密的系統(tǒng)上擁有執(zhí)行程式的權(quán)限,方能以此法破解該密碼系統(tǒng)。</p><p> 雖然高級(jí)加密標(biāo)準(zhǔn)也有不足的一面,但是,它仍是一個(gè)相對(duì)新的協(xié)議。因此,安全研究人員還沒(méi)有那么多的時(shí)間對(duì)這種加密方法進(jìn)行破解試驗(yàn)。我們可能會(huì)隨時(shí)發(fā)現(xiàn)一種全新的攻擊手段會(huì)攻破這種高級(jí)加密標(biāo)準(zhǔn)。至少在理論上存在這種可能性。</p><p><b> 2、設(shè)計(jì)的目標(biāo)</b></p&
13、gt;<p><b> 2.1基本目標(biāo):</b></p><p> ?。?)在深入理解AES加密/解密算法理論的基礎(chǔ)上,能夠設(shè)計(jì)一個(gè)AES加密/解密軟件系統(tǒng),采用控制臺(tái)模式,使用VS2010進(jìn)行開(kāi)發(fā),所用語(yǔ)言為C語(yǔ)言進(jìn)行編程,實(shí)現(xiàn)加密解密;</p><p> ?。?)能夠完成只有一個(gè)明文分組的加解密,明文和密鑰是ASCII碼,長(zhǎng)度都為16個(gè)字符(也就是
14、固定明文和密鑰為128比特),輸入明文和密鑰,輸出密文,進(jìn)行加密后,能夠進(jìn)行正確的解密;</p><p> (3)程序運(yùn)行時(shí),能夠按照要求輸出最后兩輪的輪密鑰,以及最后兩輪加密或解密之后的值,16進(jìn)制表示;</p><p> (4)程序有良好的人機(jī)交互操作;</p><p> ?。?)能夠?qū)崿F(xiàn)從兩個(gè)文件分別讀取明文和密鑰,并在程序中輸出明文及密鑰;</p&
15、gt;<p> ?。?)要求有與標(biāo)準(zhǔn)fips-197進(jìn)行比較的獨(dú)立模塊;</p><p> ?。?)最后提供所設(shè)計(jì)系統(tǒng)的報(bào)告及完整的軟件,關(guān)鍵代碼等。</p><p><b> 2.2較高目標(biāo):</b></p><p> 能完成以下全部或部分功能:</p><p> (1)如果從文件讀取的明文不止一個(gè)
16、分組,程序能完成分組,然后加密;最后一個(gè)分組長(zhǎng)度不足時(shí)要求完成填充;輸入信息可以是文本文檔,或者普通文件。進(jìn)行加密后,能夠進(jìn)行正確的解密;</p><p> ?。?)密鑰包括128bit、192bit、256bit三種情況,有三種情況時(shí)與標(biāo)準(zhǔn)fips-197進(jìn)行比較的獨(dú)立模塊,且從文本文件讀取。</p><p> ?。?)程序代碼有比較好的結(jié)構(gòu),模塊劃分合理,如用類進(jìn)行封裝,通過(guò)調(diào)用類的成
17、員函數(shù)實(shí)現(xiàn)加密解密功能,函數(shù)的參數(shù)及返回值設(shè)置合理等;</p><p> (4)對(duì)加密大文件的考慮;</p><p> ?。?)多線程的使用;</p><p> ?。?)界面友好,程序設(shè)計(jì)實(shí)現(xiàn)有創(chuàng)新。 </p><p><b> 3、功能需求分析</b></p><p> AES中的操作均是
18、以字節(jié)作為基礎(chǔ)的,用到的變量也都是以字節(jié)為基礎(chǔ)。State可以用4×4的矩陣表示。AES算法結(jié)構(gòu)對(duì)加密和解密的操作,算法由輪密鑰開(kāi)始,并用Nr表示對(duì)一個(gè)數(shù)據(jù)分組加密的輪數(shù)(加密輪數(shù)與密鑰長(zhǎng)度的關(guān)系如表2所示)。AES算法的主循環(huán)State矩陣執(zhí)行輪迭代運(yùn)算,每輪都包括所有 4個(gè)階段的代換,分別是在規(guī)范中被稱為 SubBytes(字節(jié)替換)、ShiftRows(行位移變換)、MixColumns(列混合變換) 和AddRound
19、Key,(由于外部輸入的加密密鑰K長(zhǎng)度有限 ,所以在算法中要用一個(gè)密鑰擴(kuò)展程序(Keyexpansion)把外部密鑰 K 擴(kuò)展成更長(zhǎng)的比特串,以生成各輪的加密和解密密鑰。)最后執(zhí)行只包括 3個(gè)階段 (省略 MixColumns變換)的最后一輪運(yùn)算。</p><p><b> 表2 AES參數(shù)</b></p><p> 基本要求按標(biāo)準(zhǔn)分組,以128比特為分組大小。
20、所以輪數(shù)為10輪,密鑰長(zhǎng)度也為128比特</p><p><b> 4、模塊劃分</b></p><p> 劃分為三個(gè)部分,密鑰調(diào)度,加密,解密, </p><p><b> 4.1、密鑰調(diào)度</b></p><p> 一.密鑰調(diào)度包括兩個(gè)部分:密鑰擴(kuò)展和輪密鑰選取。</p>
21、<p> 密鑰擴(kuò)展的作用是在數(shù)據(jù)加密/解密前得到輪變換中中使用的輪密鑰,其基本原則是:</p><p> 1) 輪密鑰的密鑰長(zhǎng)度為分組長(zhǎng)乘以(1 +Nr),如果分組長(zhǎng)為128bit,輪數(shù)為了10,則輪密鑰的長(zhǎng)度為128*(10+1)= 1408bit;</p><p> 2) 種子密鑰擴(kuò)展為擴(kuò)展密鑰,種子密鑰長(zhǎng)度為4*NK個(gè)字節(jié);</p><p>
22、; 3) 輪密鑰由以下方法從擴(kuò)展密鑰中獲得:對(duì)第1輪密鑰由前Nb個(gè)字構(gòu)成;第2輪密鑰由第二個(gè)Nb個(gè)字節(jié)即第Nb + 1個(gè)字到第2Nb個(gè)字構(gòu)成;以下依次類推。</p><p> 擴(kuò)展密鑰用數(shù)組w(Nb*(Nr + 1))表示,前Nk個(gè)字是原密鑰,其它密鑰字通過(guò)計(jì)算方法生成。</p><p> 子字節(jié)變換是一個(gè)返回4個(gè)字節(jié)的函數(shù),每個(gè)字節(jié)都是它輸入字中相應(yīng)位置字節(jié)通過(guò)S盒作用后的結(jié)果。
23、</p><p> 循環(huán)左移變換返回的是這4個(gè)字節(jié)經(jīng)循環(huán)置換后的字,即將該字循環(huán)左移一個(gè)字節(jié),如輸入字為w = (a0,a1,a2,a3),則變換后輸出字為w = (a1,a2,a3,a0)。</p><p> 擴(kuò)展密鑰的前Nk個(gè)字由種子密鑰構(gòu)成,隨后的字w[i]等于字w[i-1]經(jīng)一些變換后得到的字temp和字W[i-Nk]異或而成;而且對(duì)位置為Nk倍數(shù)的字變換中不僅運(yùn)用了循環(huán)左移變
24、換和子字節(jié)變換,還運(yùn)用了輪常數(shù)Rcon對(duì)變換后的字temp進(jìn)行異或。</p><p><b> 對(duì)輪常數(shù)的定義為:</b></p><p> Rcon[i] = (Rc[i],00,00,00)</p><p> 而Rc[i]表示在有限域GF(28)中xi-1的值,即:</p><p> Rc[i] = 1 (
25、即01)</p><p> Rc[i]=x·(Rc[i-1]) = xi-1</p><p><b> 二.關(guān)鍵代碼</b></p><p> //先將密鑰數(shù)組的元素值存儲(chǔ)在3維數(shù)組中,然后對(duì)其擴(kuò)展,擴(kuò)展方式氛圍兩種,條件是Ki是否是4的倍數(shù),兩種密鑰方式不同,復(fù)雜的是當(dāng)為4的倍數(shù)時(shí),要進(jìn)行生成T[i-1],先是行移位,然后是
26、進(jìn)入S盒字節(jié)替代,最后與輪常數(shù)異或得到,再將此T與K[i-4]異或</p><p> void KeyExpansion(unsigned char *Key,unsigned charExpandKey[][4][4]) </p><p><b> {</b></p><p> unsigned char RC[
27、] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36}; //輪常數(shù)</p><p> int i,j,m,n;</p><p> for(m=0;m<4;m++) </p><p><b> {</b>
28、</p><p> for(n=0;n<4;n++)</p><p><b> {</b></p><p> ExpandKey[0][m][n]=Key[n*4+m]; </p><p><b> }</b></p><p><b>
29、 }</b></p><p> for(i=1;i<11;i++) </p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p>
30、;<p> unsigned char Temp[4]; </p><p> for(m=0; m<4; m++)</p><p><b> {</b></p><p> Temp[m] = j ? ExpandKey[i][m][j-1] : ExpandKey[i-1][m][3]; </p>
31、<p> //進(jìn)行兩種劃分,先把密鑰存在一個(gè)變量數(shù)組中,</p><p><b> }</b></p><p> if(j == 0)</p><p><b> {</b></p><p> unsigned char t = Temp[0];</p><p
32、> for(m=0; m<3; m++)</p><p><b> {</b></p><p> Temp[m] = Sbox[Temp[(m+1)%4]];</p><p><b> }</b></p><p> Temp[3] = Sbox[t];</p>&
33、lt;p> Temp[0] ^= RC[i-1];</p><p><b> }</b></p><p> for(m=0; m<4; m++)</p><p> { </p><p> ExpandKey[i][m][j] =ExpandKey[i-1][m][j]
34、^ Temp[m]; //</p><p> } </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&l
35、t;/p><p><b> 4.2、加密</b></p><p><b> 加密流程圖:</b></p><p> 4.2.1、字節(jié)代替(SubBytes)</p><p> 一.AES定義了一個(gè)S盒,State中每個(gè)字節(jié)按照如下方式映射為一個(gè)新的字節(jié):把該字節(jié)的高4位作為行值,低4位作為列值,
36、然后取出S盒中對(duì)應(yīng)行和列的元素作為輸出。例如,十六進(jìn)制數(shù){84}。對(duì)應(yīng)S盒的行是8列是4,S盒中該位置對(duì)應(yīng)的值是{5F}。</p><p> S盒是一個(gè)由16x16字節(jié)組成的矩陣,包含了8位值所能表達(dá)的256種可能的變換。S盒按照以下方式構(gòu)造:</p><p> 逐行按照升序排列的字節(jié)值初始化S盒。第一行是{00},{01},{02},…,{OF};第二行是{10},{l1},…,{1
37、F}等。在行X和列Y的字節(jié)值是{xy}。</p><p> 把S盒中的每個(gè)字節(jié)映射為它在有限域GF()中的逆。GF代表伽羅瓦域,GF()由一組從0x00到0xff的256個(gè)值組成,加上加法和乘法。。{00}被映射為它自身{00}。</p><p> 把S盒中的每個(gè)字節(jié)記成。對(duì)S盒中每個(gè)字節(jié)的每位做如下變換:</p><p> 上式中是指值為{63}字節(jié)C第i位
38、,即。 符號(hào)()表示更新后的變量的值。AES用以下的矩陣方式描述了這個(gè)變換:</p><p> 最后完成的效果如圖:</p><p><b> 二.關(guān)鍵代碼</b></p><p> 直接采取讓4x4矩陣的值進(jìn)入S盒,這是因?yàn)閿?shù)組元素的要求前四位作為行數(shù),后四位作為列數(shù),而元素值剛好是16進(jìn)制表示形如:AB,元素的值=A*16+B,這個(gè)剛
39、好就是S盒的位置,</p><p> void SubBytes(unsigned char State[][4]) </p><p><b> {</b></p><p> int i,j; </p><p> for(i=0; i<4; i++) </p><p>&
40、lt;b> { </b></p><p> for(j=0; j<4; j++) </p><p> { </p><p> State[i][j] = Sbox[State[i][j]]; </p><p><b> } </b>
41、</p><p><b> }</b></p><p><b> }</b></p><p> 4.2.2、行移位(ShiftRows)</p><p> 一.State的第一行字節(jié)保持不變,State的第二行字節(jié)循環(huán)左移一個(gè)字節(jié),State的第三行字節(jié)循環(huán)左移兩個(gè)字節(jié),State的第四行循
42、環(huán)左移三個(gè)字節(jié)。</p><p><b> 行移位左偏移量:</b></p><p><b> 變化如圖2所示。</b></p><p><b> 二.關(guān)鍵代碼</b></p><p> void ShiftRows(unsigned char State[][4])
43、 //采用最原始的辦法,以分別為0.1.2.3字節(jié)</p><p><b> {</b></p><p> unsigned char k;</p><p> k=State[1][0]; </p><p> State[1][0]=State[1][
44、1]; </p><p> State[1][1]=State[1][2]; </p><p> State[1][2]=State[1][3]; </p><p> State[1][3]=k;</p><p> k=State[2][1];
45、 </p><p> State[2][1]=State[2][3];</p><p> State[2][3]=k;</p><p> k=State[2][0];</p><p> State[2][0]=State[2][2];</p><p> State[2][2]=k;</p>
46、;<p> k=State[3][3];</p><p> State[3][3]=State[3][2];</p><p> State[3][2]=State[3][1];</p><p> State[3][1]=State[3][0];</p><p> State[3][0]=k;</p&g
47、t;<p><b> }</b></p><p> 4.2.3、列混合(MixColumn)</p><p> 一.列混合變換是一個(gè)替代操作,是AES最具技巧性的部分。它只在AES的第0,1,…,Nr一1輪中使用,在第N r輪中不使用該變換。乘積矩陣中的每個(gè)元素都是一行和一列對(duì)應(yīng)元素的乘積之和。在MixColumns變換中,乘法和加法都是定義在GF
48、()上的。State的每一列 () 1=0,…,3;J=0,…,被理解為 GF()上的多項(xiàng)式,該多項(xiàng)式與常數(shù)多項(xiàng)式相乘并模約化。</p><p> 這個(gè)運(yùn)算需要做GF()上的乘法。但由于所乘的因子是三個(gè)固定的元素02、03、01,所以這些乘法運(yùn)算仍然是比較簡(jiǎn)單的(注意到乘法運(yùn)算所使用的模多項(xiàng)式為)。設(shè)一個(gè)字節(jié)為b=(b7b6b5b4b3b2b1b0),則</p><p> b×
49、;‘01’=b; </p><p> bב02’=(b6b5b4b3b2b1b00)+(000b7b70b7b7); </p><p> bב03’=bב01’+b×’02’。</p><p> ?。ㄕ?qǐng)注意,加法為取模2的加法,即逐比特異或)</p><p><b> 寫(xiě)成矩陣形式
50、為:</b></p><p> 最后完成的效果如圖:</p><p><b> 二.關(guān)鍵代碼</b></p><p> //其中調(diào)用小函數(shù)xtime,根據(jù)02乘法原理編寫(xiě),最后03乘是在02乘的基礎(chǔ)上進(jìn)行了03=(2^1+1 ),同理進(jìn)行一次02乘,在與本省異或</p><p> void MixCo
51、lumns(unsigned char State[][4]) </p><p><b> {</b></p><p> unsigned char output[4][4];</p><p> int i, j; </p><p> for(j=0; j< 4; j++) </p
52、><p><b> { </b></p><p> for(i=0; i<4; i++) </p><p><b> { </b></p><p> output[i][j] = xtime(State[i%4][j])
53、//0x02乘法 </p><p> ^ ( State[ ( i + 1 ) % 4][j] ^ xtime( State[ ( i + 1 ) % 4][j] ) ) //0x03乘法 </p><p> ^ State[ ( i + 2 ) % 4][j] //0x01乘法 <
54、;/p><p> ^ State[ ( i + 3 ) % 4][j]; //0x01乘法 </p><p><b> } </b></p><p><b> } </b></p><p> for(i=0; i<
55、;4; i++) </p><p><b> {</b></p><p> for(j=0; j< 4; j++)</p><p><b> {</b></p><p> State[i][j]=output[i][j];</p&
56、gt;<p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> 02乘法函數(shù):</b></p><p> unsigned char xtime (uns
57、igned char input) </p><p><b> {</b></p><p> int temp; </p><p> temp = input<<1; </p><p> if(input & 0x80)
58、 </p><p><b> { </b></p><p> temp ^= 0x1b; </p><p><b> } </b></p><p> return temp; </p><p><b> } </b>
59、;</p><p> 4.2.4、輪密鑰加(AddRoundKey)</p><p> 一.Add RoundKey稱為輪密鑰加變換,128位的State按位與 128位的密鑰XOR:對(duì) j=0,… ,L-1 輪密鑰加變換很簡(jiǎn)單,卻影響了 State中的每一位。密鑰擴(kuò)展的復(fù)雜性和 AES的其他階段運(yùn)算的復(fù)雜性,卻確保了該算法的安全性。</p><p> 最后完
60、成的效果如圖:</p><p><b> 二.關(guān)鍵代碼</b></p><p> void AddRoundKey(unsigned char State[][4],unsigned char Key[][4]) </p><p><b> {</b></p><p><b>
61、 int i,j;</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> State[j]
62、[i]^=Key[j][i];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 4.2.5、加密主函數(shù)</p><p><b> 關(guān)鍵代碼</b
63、></p><p> //根據(jù)加密函數(shù)流程圖,進(jìn)行架構(gòu)加密主函數(shù),參數(shù)分別是一個(gè)密鑰數(shù)組,一個(gè)明文分組進(jìn)入,參與運(yùn)算,其中密鑰一進(jìn)入就進(jìn)入密鑰擴(kuò)展,為以后的加密產(chǎn)生密鑰,</p><p> void Encryption(unsigned char input[16],unsigned char Key[16])</p><p><b> {&
64、lt;/b></p><p> KeyExpansion(Key,ExpandKey); </p><p> unsigned char State[4][4];</p><p> int i,j,k;</p><p> for(i=0; i<4; i++) </p>
65、<p><b> { </b></p><p> for(j=0; j<4 ;j++) </p><p> { </p><p> State[i][j]= input[4*j+i]; </p><p><b> } &l
66、t;/b></p><p><b> }</b></p><p> AddRoundKey(State,ExpandKey[0]); </p><p> for(i=1; i<=10; i++) </p><p><b> {
67、 </b></p><p> SubBytes(State);</p><p> ShiftRows(State);</p><p> if(i!=10)MixColumns(State);</p><p> AddRoundKey(State,ExpandKey[i]);</p><p> i
68、f(i>=9) </p><p><b> {</b></p><p> printf("\n第%d輪加密密鑰矩陣為:\n",i);</p><p><b> int m,n;</b></p><p> for(m=0
69、;m<4;m++)</p><p><b> {</b></p><p> for(n=0;n<4;n++)</p><p><b> {</b></p><p> printf("%X,",ExpandKey[i][n][m]);</p>&l
70、t;p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> printf("第%d輪加密出的密文為:",i);</p><p> for(m=0;m<4;m++)
71、 </p><p><b> {</b></p><p> for(n=0;n<4;n++)</p><p><b> {</b></p><p> printf("%X,",State[n][m]);</p&
72、gt;<p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p>
73、;<p> for(j=0; j<4; j++) </p><p> { </p><p> for(k=0; k<4 ;k++)</p><p><b> {</b></p><p> input[4*k+j]=State[j]
74、[k];</p><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p><b> 4.3、解密</b></p><p><b> 解密流程:&
75、lt;/b></p><p> 4.3.1、逆字節(jié)替代(InvSubBytes)</p><p><b> 關(guān)鍵代碼</b></p><p> 與字節(jié)代替類似,逆字節(jié)代替基于逆S盒實(shí)現(xiàn)。直接進(jìn)圖逆S盒,原理很簡(jiǎn)單,與字節(jié)替代相同,只是盒子不同</p><p> void InvSubBytes(unsign
76、ed char State[][4]) {</p><p> int i,j; </p><p> for(i=0; i<4; i++) </p><p><b> { </b></p><p> for(j=0; j<4; j++)
77、 </p><p> { </p><p> State[i][j] = InvSbox[State[i][j]]; </p><p><b> } </b></p><p><b> }</b></p><p><b&
78、gt; }</b></p><p> 4.3.2、逆行移位(InvShiftRows)</p><p><b> 關(guān)鍵代碼</b></p><p> //與加密時(shí)的行移位區(qū)別在于移位方向相反。即向右移動(dòng)</p><p> void InvShiftRows(unsigned char State[]
79、[4]) </p><p><b> {</b></p><p><b> char k;</b></p><p> k=State[1][3]; </p><p> State[1][3]=State[1][2];</p><p> State[
80、1][2]=State[1][1];</p><p> State[1][1]=State[1][0];</p><p> State[1][0]=k;</p><p> k=State[2][3]; </p><p> State[2][3]=State[2][1]; </p><p> State[
81、2][1]=k;</p><p> k=State[2][2];</p><p> State[2][2]=State[2][0];</p><p> State[2][0]=k;</p><p> k=State[3][0]; </p><p> State[3][0]=State[3][1];&l
82、t;/p><p> State[3][1]=State[3][2];</p><p> State[3][2]=State[3][3];</p><p> State[3][3]=k;</p><p><b> }</b></p><p> 4.3.3、逆列混合(InvMixCloumns
83、)</p><p><b> 關(guān)鍵代碼</b></p><p> //逆列混合操作與列混合一樣,只是多項(xiàng)式d(x)不同,因而可以表示為矩陣相乘來(lái)實(shí)現(xiàn),輸入矩陣與固定矩陣(十六進(jìn)制)相乘, </p><p> void InvMixColumns(unsigned char State[][4]) </p>
84、<p><b> {</b></p><p> unsigned char output[4][4];</p><p> int i, j; </p><p> for(j=0; j< 4; j++) </p><p><b> { </b></p>
85、<p> for(i=0; i<4; i++) </p><p><b> { </b></p><p> output[i][j] = (xtime(xtime(xtime(State[i % 4][j]))) ^ xtime(xtime(State[i % 4][j]))^xtime(State[i % 4][j]))
86、 //0x0E=14乘法</p><p> ^ (xtime(xtime(xtime(State[ ( i + 1 ) % 4][j]))) ^ xtime(State[ ( i + 1 ) % 4][j]) ^ State[ ( i + 1 ) % 4][j]) //0x0B=11乘法</p><p> ^ (xtime(xtime(xtime(Sta
87、te[ ( i + 2 ) % 4][j]))) ^ xtime(xtime(State[ ( i + 2 ) % 4][j])) ^ State[ ( i + 2 ) % 4][j]) //0x0D=13乘法 </p><p> ^(xtime(xtime(xtime(State[ ( i + 3 ) % 4][j]))) ^ State[ ( i + 3 ) % 4][j]);
88、 //0x09乘法 </p><p><b> } </b></p><p><b> }</b></p><p> for(i=0; i<4; i++) </p><p>&
89、lt;b> {</b></p><p> for(j=0; j< 4; j++)</p><p><b> {</b></p><p> State[i][j]=output[i][j];</p><p><b> }</b></p><p>
90、;<b> }</b></p><p><b> } </b></p><p> 4.3.4、輪密鑰加(AddRoundKey)</p><p><b> 與加密完全相同</b></p><p> 4.3.5、解密主函數(shù)</p><p><
91、;b> 關(guān)鍵代碼</b></p><p> //與加密函數(shù)不同的是,過(guò)程相反,根據(jù)流程圖構(gòu)造解密主函數(shù),輪數(shù)相同,由于是AES本質(zhì)是對(duì)稱函數(shù),所以是相反的而已</p><p> void InvEncryption(unsigned char input[16],unsigned char Key[16]) </p><p>
92、 { </p><p> int i,j,k;</p><p> KeyExpansion(Key,ExpandKey);</p><p> unsigned char State[4][4]; </p><p> for(j=0; j<4; j++)</p><p>
93、;<b> { </b></p><p> for(k=0; k<4 ;k++)</p><p> { </p><p> State[j][k] = input[k*4+j];</p><p><b> } </b></p>&
94、lt;p><b> }</b></p><p> AddRoundKey(State,ExpandKey[10]); </p><p> for(i=9; i>=0; i--) </p><p><b> { <
95、;/b></p><p> InvShiftRows(State);</p><p> InvSubBytes(State); </p><p> AddRoundKey(State, ExpandKey[i]);</p><p> if(i)InvMixColumns(State);</p><p>
96、 if(i<=1) /* 輸出最后解密兩輪密鑰和密文 */</p><p><b> {</b></p><p> printf("\n第%d輪密鑰矩陣為:\n",10-i);</p><p><b> int m,n;<
97、;/b></p><p> for(m=0;m<4;m++)</p><p><b> {</b></p><p> for(n=0;n<4;n++)</p><p><b> {</b></p><p> printf("%X,&quo
98、t;,ExpandKey[i][n][m]);</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> printf("第%d輪解密出的消息為:",10-i);<
99、/p><p> for(m=0;m<4;m++) </p><p><b> {</b></p><p> for(n=0;n<4;n++)</p><p><b> {</b></p><p> prin
100、tf("%X,",State[n][m]);</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n"); </p><p><b> }</b><
101、;/p><p><b> } </b></p><p> printf("\n最后解密出的明文消息為:");</p><p> for(int m=0;m<4;m++) </p><p><b> {</b></
102、p><p> for(int n=0;n<4;n++)</p><p><b> {</b></p><p> printf("%c ",State[n][m]);</p><p><b> }</b></p><p><b> }&
103、lt;/b></p><p> printf("\n");</p><p> for(j=0;j<4;j++) </p><p><b> { </b></p><p> for(k=0; k&
104、lt;4 ;k++) </p><p> { </p><p> input[k*4+j] = State[j][k];</p><p><b> } </b></p><p><b> } </b></p><p><b&g
105、t; }</b></p><p><b> 5.測(cè)試報(bào)告</b></p><p> 由于加密解密分兩種方式,一種是由鍵盤輸入進(jìn)行加密解密。另一種是文件讀入加密解密</p><p><b> 5.1主界面</b></p><p> 根據(jù)數(shù)字選擇使用軟件,下面分開(kāi)測(cè)試:</p
106、><p> 5.2測(cè)試鍵盤輸入明文和密鑰加密</p><p> 鍵盤輸入1,選擇加密,并輸入:IloveYouYouKnow? 共計(jì)16個(gè)字符,再任意輸入16字符的密鑰,為方便起見(jiàn),測(cè)試時(shí),輸入為11111111111111111,最后加密成功之后輸出中間密鑰與密文狀態(tài)</p><p> 其中最后加密密文為:A1,00,E9,BD,13,9A,CC,51,76,6
107、A,3F,B8,AA,34,6A,C</p><p> 5.3測(cè)試鍵盤輸入密文和密鑰加密</p><p> 選擇3,進(jìn)入解密界面。為測(cè)試是否成功加密,采用上次加密時(shí)的密文進(jìn)行輸入,如圖結(jié)果說(shuō)明加密解密是成功的。</p><p> 5.3測(cè)試文件輸入明文和密鑰加密</p><p> //選擇2進(jìn)入文件加密界面,輸入保存有明文的文件名:M
108、ingwen.txt.密鑰文件名:Key.txt </p><p> 輸出到空文件State.txt中進(jìn)行保存</p><p> 5.4測(cè)試文件輸入密文和密鑰加密</p><p> //選擇4進(jìn)入界面解密,同理,為檢驗(yàn)是否加密成功,采用上次加密時(shí)密文輸出到State.txt上的密文進(jìn)行解密,密鑰文件相同,與上圖相比,結(jié)果正確。解密成功!</p>
109、<p><b> 5.5軟件說(shuō)明</b></p><p> 是為注明信息而設(shè)置,表明版權(quán),可省略,</p><p> 6.課程設(shè)計(jì)報(bào)告總結(jié)</p><p> 這次課程設(shè)計(jì)我最大的收獲就是凡事都要自己動(dòng)手去做,有些事情自己不做,啥子都不會(huì),有畏懼感,膽怯,始終把事情放在那,就形成惡性循環(huán),這樣子一直都做不來(lái),一直都不會(huì)有進(jìn)步,所
110、以不管什么事情都要親自去嘗試一下,難易程度自己感知,不要聽(tīng)信他人的謠言,或者誤導(dǎo),以為怎么怎么樣。</p><p> 還有就是,做代碼的時(shí)候查閱了相關(guān)的書(shū)籍,很雜很亂,這對(duì)于選擇有用的材料,有價(jià)值的材料進(jìn)行使用,會(huì)提高效率,最開(kāi)始各種涉獵,很多,但是實(shí)用的卻沒(méi)有多少,白白耽誤了很多時(shí)間。我覺(jué)得還是首先了解全局,了解總體,高屋建瓴,做好準(zhǔn)備工作,寫(xiě)好報(bào)告,把每個(gè)過(guò)程搞懂了,才能動(dòng)手去寫(xiě)代碼,連基本的理論都不懂,就
111、去操作,實(shí)在是慢,當(dāng)然在了解的基礎(chǔ)上,也要去實(shí)踐,去檢驗(yàn)自己的做法是否是對(duì)的,不能光搞理論,計(jì)算機(jī)是一個(gè)動(dòng)手就得答案的科學(xué),多檢驗(yàn),多算,多觀察。這樣子影響更深,更不會(huì)忘,一輩子的經(jīng)驗(yàn),自己動(dòng)手得到的答案,遠(yuǎn)比查閱資料了解來(lái)的有意義,有效果。</p><p> 在寫(xiě)代碼的時(shí)候參考了一些參考資料,發(fā)現(xiàn)一些牛人啊,他們寫(xiě)的代碼簡(jiǎn)介,精煉,確實(shí)讓人敬佩,我用很多行代碼實(shí)現(xiàn)的功能,別人兩三句循環(huán)就解決了,主要是平時(shí)沒(méi)怎
112、么編寫(xiě)代碼,沒(méi)有經(jīng)驗(yàn),還是要多寫(xiě)代碼,多領(lǐng)悟,才能有他們的成就。而且我簡(jiǎn)介的代碼都是很好的數(shù)學(xué)算法,我學(xué)的數(shù)學(xué)沒(méi)怎么用在這個(gè)上面,不能直接用最低級(jí)的算法,最普通的算法,這樣子永遠(yuǎn)不能簡(jiǎn)化,要簡(jiǎn)化就要用一些數(shù)學(xué)算法,下標(biāo)改變啊,循環(huán)啊啥的這些可以實(shí)現(xiàn)意想不到的效果,實(shí)現(xiàn)功能和簡(jiǎn)介的雙重母的。多實(shí)踐!</p><p> 最后我要感謝**,在我調(diào)試過(guò)程中,他給了我很大的幫助,真心的不知道說(shuō)什么,我有很多的問(wèn)題都是詢問(wèn)
113、他解決的,而且那天他花了一整晚上的時(shí)間和我一起探討,一起專研,幫我調(diào)試,這對(duì)于目前一個(gè)物質(zhì)社會(huì),節(jié)奏超快的社會(huì),我真心感覺(jué)好幸運(yùn),好人還是多,這就堅(jiān)定了我要做好人的決心。助人為樂(lè),真心感覺(jué)很好!特別是那些在需要中的人們是、多么期盼的幫助。幫助別人就是幫助自己,萬(wàn)分感謝尋者!致敬!</p><p><b> 7.參考文獻(xiàn)</b></p><p> [1] 譚浩強(qiáng).
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- aes課程設(shè)計(jì)報(bào)告--aes加密解密的實(shí)現(xiàn)
- 應(yīng)用密碼學(xué)課程設(shè)計(jì)-rsa加密解密的設(shè)計(jì)與實(shí)現(xiàn)
- c語(yǔ)言課程設(shè)計(jì)-文件加密解密
- c語(yǔ)言課程設(shè)計(jì)-文件加密解密
- c語(yǔ)言課程設(shè)計(jì)—數(shù)據(jù)加密解密
- 凱撒密碼--c語(yǔ)言實(shí)現(xiàn)
- AES加密解密算法的高速ASIC設(shè)計(jì).pdf
- 密碼學(xué)課程設(shè)計(jì)—網(wǎng)頁(yè)加密技術(shù)
- 《c語(yǔ)言課程設(shè)計(jì)》課程設(shè)計(jì)--數(shù)據(jù)的加密與解密
- 維吉尼亞密碼的c語(yǔ)言實(shí)現(xiàn)
- 密碼學(xué)課程設(shè)計(jì)
- AES加密算法的FPGA實(shí)現(xiàn).pdf
- c語(yǔ)言課程設(shè)計(jì)數(shù)據(jù)的加密與解密
- AES密碼硬件實(shí)現(xiàn)方法研究.pdf
- 替代密碼和置換密碼的c語(yǔ)言實(shí)現(xiàn)
- 輕量級(jí)AES加解密芯片設(shè)計(jì)與實(shí)現(xiàn).pdf
- aes加密
- 高級(jí)加密標(biāo)準(zhǔn)AES的實(shí)現(xiàn)研究.pdf
- 基于AES算法的數(shù)據(jù)加密與解密硬件設(shè)計(jì).pdf
- c語(yǔ)言課程設(shè)計(jì)-文件加密解密(含源代碼)
評(píng)論
0/150
提交評(píng)論