版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> AES加密解密的實(shí)現(xiàn)</p><p> 課程名稱: 密碼算法程序設(shè)計(jì) </p><p> 學(xué)生姓名: </p><p> 學(xué)生學(xué)號: </p><p> 專業(yè)班
2、級: </p><p> 任課教師: </p><p> 2011年 6 月 24 日</p><p><b> 目 錄</b></p><p> 1. 背景與意義1</p><p> 2. 系統(tǒng)設(shè)計(jì)1</p
3、><p> 2.1系統(tǒng)主要目標(biāo)1</p><p> 2.2主要軟件需求(運(yùn)行環(huán)境)2</p><p> 2.3功能模塊與系統(tǒng)結(jié)構(gòu)2</p><p> 3 系統(tǒng)功能程序設(shè)計(jì)3</p><p> 3.1基本要求部分3</p><p> 3.1.1 字節(jié)替換4</p>
4、<p> 3.1.2行移位5</p><p> 3.1.3列混合6</p><p> 3.1.4密鑰加8</p><p> 3.1.5密鑰擴(kuò)展8</p><p> 3.1.6獲取RoundKey10</p><p> 3.1.7逆字節(jié)替換11</p><p>
5、 3.1.8逆行移位11</p><p> 3.1.9逆列混合12</p><p> 3.1.10加密13</p><p> 3.1.11解密15</p><p> 4. 測試報(bào)告17</p><p><b> 5.結(jié)論19</b></p><p>
6、<b> 參考文獻(xiàn)19</b></p><p><b> 背景與意義 </b></p><p> 由于AES應(yīng)用了,感覺這算法的分組為固定長度的128bit,而密鑰卻有三種,分別為128,192,256bit,對應(yīng)三種不同輪數(shù)分別為10輪,12輪,14輪。這就加大了算法實(shí)現(xiàn)的難度,加上每輪的4種變換,更加體現(xiàn)了算法的復(fù)雜性,所以我采用的A
7、ES來實(shí)現(xiàn)。不僅加深了我對密碼算法本身的認(rèn)識,更加鞏固了我本來不是很熟悉的C語言。AES算法采用的不可約多項(xiàng)式是p(x)=(84310),共256個(gè)多項(xiàng)余式構(gòu)成了一個(gè)有限域,在這有限域上要用到字節(jié)運(yùn)算和字運(yùn)算。 隨著對稱密碼的發(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),即AES[1]。AES即高級加密標(biāo)準(zhǔn),作為傳統(tǒng)堆成加密算法
8、標(biāo)準(zhǔn)DES的替代者,有美國國家標(biāo)準(zhǔn)與技術(shù)研究所于1997年提出征集該算法的公告.1999年3月22日,NIST從15個(gè)候選算法中公布了5個(gè)候選算法進(jìn)入第二輪懸著:MARS、RC6、Rijindael、SERPENT和Twofish。經(jīng)過三輪的篩選,2000年10月2日,以安全性(穩(wěn)定的數(shù)學(xué)基礎(chǔ)、沒有算法弱點(diǎn)、算法抗密</p><p><b> 2. 系統(tǒng)設(shè)計(jì)</b></p>
9、<p> 先定義后面s盒變換和密鑰擴(kuò)展要用到的s盒數(shù)組和rcon數(shù)組,然后定義s盒查找函數(shù),行移位,列混合函數(shù),因?yàn)檫@幾個(gè)函數(shù)無論是在10輪還是12輪還是14輪執(zhí)行時(shí)都沒變化。然后就是12輪的輪密鑰加和密鑰擴(kuò)展。這一步也許有點(diǎn)困難,接著就是12輪的加密函數(shù)本身。然后才是10輪的輪米要加和密鑰擴(kuò)展,加密函數(shù)。最后是解密要用到的逆字節(jié)替代,逆行移位,逆列混合,輪密鑰加和密鑰擴(kuò)展函數(shù)和加密是一樣的,所以不用重新定義。</p
10、><p><b> 2.1系統(tǒng)主要目標(biāo)</b></p><p><b> 基本要求部分:</b></p><p> 1.完成一個(gè)明文分組的加解密,明文和密鑰是十六進(jìn)制,長度都為128比特(32個(gè)16進(jìn)制數(shù)),按照標(biāo)準(zhǔn)輸入明文和密鑰,輸出密文,進(jìn)行加密后,能夠進(jìn)行正確的解密。</p><p> 2
11、.程序運(yùn)行時(shí),要求輸出每一輪使用的密鑰,以及每一輪中字節(jié)替代、行移位、列混合和密鑰加等每一步操作之后的16進(jìn)制表示的值。</p><p> 3. 提供運(yùn)行標(biāo)準(zhǔn)示例的選項(xiàng)。</p><p> 4. 能夠在文件讀取密鑰明文。</p><p> 5. 程序有良好的人機(jī)交互操作。</p><p><b> ,</b>&l
12、t;/p><p> 2.2主要軟件需求(運(yùn)行環(huán)境)</p><p> 本軟件適用VC語言編寫,編譯成功后的EXE文件可以在裝有windows系統(tǒng)的任何計(jì)算機(jī)上使用。</p><p> 測試平臺(tái):Windows XP Professional</p><p> 使用軟件:Visual C++ 6.0</p><p>
13、 2.3功能模塊與系統(tǒng)結(jié)構(gòu)</p><p><b> 主函數(shù):</b></p><p> xAESencrypt();128比特加密</p><p> xAESencrypt6(); 12輪加密</p><p> xAESdencrypt();128比特解密</p><p><b&
14、gt; show();演示</b></p><p> void SB() //從文件讀取192比特密鑰和明文</p><p> void SA()//從文件讀取128比特密鑰</p><p> void subbyte(int col[4][4]) //字節(jié)替代 </p><p> void s
15、hiftrows(int col[4][4]) //行移位</p><p> void mixcolumn(int col[4][4]) //列混合</p><p> void addroundkey6(int col[4][4],int allkey[4][52],int nr) //192比特輪密鑰加</p><p> void addroundk
16、ey(int col[4][4],int allkey[4][44],int nr) //128論密鑰加</p><p> void keyschedule6(int key[4][6],int allkey[4][52],int nk,int nr) //192密鑰擴(kuò)展</p><p> void keyschedule(int key[4][4],int allkey[4]
17、[44],int nk,int nr) //128密鑰擴(kuò)展</p><p> void invsubbyte(int col[4][4]) //逆字節(jié)替代</p><p> void invshiftrows(int col[4][4]) //逆行移位</p><p> void invmixcolumn(int col[4][4]) //逆列
18、混合</p><p><b> 總體流程圖:</b></p><p> 先定義s盒查找函數(shù),行移位,列混合函數(shù),因?yàn)檫@幾個(gè)函數(shù)無論是在10輪還是12輪還是14輪執(zhí)行時(shí)都沒變化。然后就是12輪的輪密鑰加和密鑰擴(kuò)展。這一步也許有點(diǎn)困難,接著就是12輪的加密函數(shù)xAESencrypt6()本身。然后才是10輪的輪米要加和密鑰擴(kuò)展,加密函數(shù)xAESencrypt()。最后
19、是解xAESdencrypt()要用到的逆字節(jié)替代,逆行移位,逆列混合,輪密鑰加和密鑰擴(kuò)展函數(shù)和加密是一樣的,所以不用重新定義。最后寫了一個(gè)演示show()。用的是動(dòng)畫上面的明文和密鑰作為輸入。</p><p> 3 系統(tǒng)功能程序設(shè)計(jì)</p><p><b> 3.1基本要求部分</b></p><p> 3.1.1 字節(jié)替換</p
20、><p> 字節(jié)代換是非線性變換,獨(dú)立地對狀態(tài)的每個(gè)字節(jié)進(jìn)行查表代換。代換表(S盒)是可逆的,由以下兩個(gè)變換合成得到:</p><p> 首先,將字節(jié)看作GF(28)上的元素,映射到自己的乘法逆元。</p><p> b(x)=a(x) mod m(x)</p><p> 其中m(x)=x8+x4+x3+x+1,當(dāng)a(x)=0時(shí),其逆元素
21、也為0,即’00’映射到自己。。</p><p> 其次,對字節(jié)作如下的(GF(2)上的,可逆的)仿射變換,如圖2所示。</p><p><b> 圖2 S盒仿射變換</b></p><p> 將從00到FF的十六進(jìn)制數(shù)經(jīng)過上述運(yùn)算就可以得到一個(gè)16*16的字節(jié)代換表,也就是用于加密的S盒。</p><p> 圖
22、3是字節(jié)代換示意圖。</p><p> 圖3 字節(jié)代換示意圖</p><p><b> 主要算法:</b></p><p> void subbyte(int col[4][4]) </p><p><b> {
23、</b></p><p> for(int i=0;i<4;i++)</p><p> for(int j=0;j<4;j++)</p><p><b> {</b></p><p> col[i][j]=sbox[col[i][j]];</p><p><b
24、> }</b></p><p> for(int a=0;a<4;a++)</p><p> for( int b=0;b<4;b++)</p><p><b> {</b></p><p> printf(" %x",col[b][a]);</p>
25、;<p> }printf("\n");</p><p><b> }</b></p><p> S數(shù)組表示S-盒,此處采用直接查表的方法實(shí)現(xiàn)S-盒替代。</p><p> 對于用于解密的逆S盒,需要通過在GF(2)域上的逆仿射變換生成,下面是進(jìn)行逆仿射變換的仿射變換矩陣,如圖4。</p>
26、<p> 圖4 逆S盒仿射變換</p><p> 它的逆變換的實(shí)現(xiàn)和它十分類似,同樣也是通過查逆S-盒完成。</p><p><b> 3.1.2行移位</b></p><p> 行移位是根據(jù)不同的分組長度將狀態(tài)矩陣中的各行進(jìn)行相應(yīng)循環(huán)移位。在加密過程中,狀態(tài)矩陣的后三行要按字節(jié)進(jìn)行左移位。在解密過程中則要進(jìn)行逆行移位,即將
27、狀態(tài)矩陣中的后三行按字節(jié)進(jìn)行右移位。表3給出了在分組不同的情況下移位量,即在后三行的第1行要移位c1個(gè)字節(jié),第2行要移位c2個(gè)字節(jié),第3行要移位c3個(gè)字節(jié)。</p><p><b> 表3 行移位量</b></p><p> 加密算法的行移位過程如圖5所示。</p><p><b> 圖5 行移位示意圖</b><
28、;/p><p><b> 主要算法:</b></p><p> void shiftrows(int col[4][4])</p><p><b> {</b></p><p> unsigned char temp[4*4];
29、 </p><p><b> int i,j;</b></p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> for(i=0;i<4;i++)</p><p><b> {<
30、/b></p><p> temp[4*i+j]=col[i][j];</p><p><b> }</b></p><p><b> }</b></p><p> for(i=1;i<4;i++)</p><p><b> {</b&g
31、t;</p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if(i==1)col[i][j]=temp[4*i+(j+1)%4];//第一行左移1位</p><p> else if(i==2)col[i][j]=temp[4*i+(j+2)
32、%4];//第二行左移2位</p><p> else if(i==3)col[i][j]=temp[4*i+(j+3)%4];//第三行左移3位</p><p><b> }</b></p><p><b> }</b></p><p> for(int a=0;a<
33、4;a++)</p><p> for(int b=0;b<4;b++)</p><p><b> {</b></p><p> printf(" %x",col[b][a]);</p><p> }printf("\n");</p><p>
34、;<b> }</b></p><p><b> 3.1.3列混合</b></p><p> 在列混合變換中,將狀態(tài)矩陣中的一列看作在GF(28)上的多項(xiàng)式,與一個(gè)常數(shù)多項(xiàng)式c(x)相乘并模x4+1。其中,</p><p> c(x)=’03’x3+’01’x2+’01’x+’02’(系數(shù)用十六進(jìn)制表示)</
35、p><p> c(x)是與x4+1互素的,因此模x4+1是可逆的。列混合預(yù)算也可寫為矩陣乘法(圖6)。設(shè)b(x)=c(x)⊕a(x),則</p><p> 圖6 列混合的矩陣表示</p><p><b> 主要算法:</b></p><p> void mixcolumn(int col[4][4])</p&g
36、t;<p><b> {</b></p><p> int r=0,c=0;</p><p> int temp[4][4];</p><p> for(r=0;r<4;r++){</p><p> for(c=0;c<4;c++){</p><p> tem
37、p[r][c]=col[r][c];</p><p><b> }</b></p><p><b> }</b></p><p> for(c=0;c<4;c++){</p><p> col[0][c]=gfmultby02(temp[0][c])^gfmultby03(temp[1
38、][c])^gfmultby01(temp[2][c])^gfmultby01(temp[3][c]);</p><p> col[1][c]=gfmultby01(temp[0][c])^gfmultby02(temp[1][c])^gfmultby03(temp[2][c])^gfmultby01(temp[3][c]);</p><p> col[2][c]=gfmultby01
39、(temp[0][c])^gfmultby01(temp[1][c])^gfmultby02(temp[2][c])^gfmultby03(temp[3][c]);</p><p> col[3][c]=gfmultby03(temp[0][c])^gfmultby01(temp[1][c])^gfmultby01(temp[2][c])^gfmultby02(temp[3][c]);</p>&
40、lt;p><b> }</b></p><p> for(int a=0;a<4;a++)</p><p> for( int b=0;b<4;b++)</p><p><b> {</b></p><p> printf(" %x",col[b][
41、a]);</p><p> }printf("\n");</p><p><b> }</b></p><p> 這個(gè)算法還有點(diǎn)沒弄明白,主要是調(diào)用上面的函數(shù)。</p><p> 在解密過程中,要做的逆列混合運(yùn)算和列混合類似,即每列都用一個(gè)特定的多項(xiàng)式d(x)相乘。d(x)滿足</p&g
42、t;<p> (‘03’x3+’01’x2+’01’x+’02’)⊕d(x)=’01’</p><p><b> 由此得到</b></p><p> d(x)= ‘0b’x3+’0d’x2+’09’x+’0e’</p><p> 逆列混合運(yùn)算可轉(zhuǎn)變成如下的一個(gè)矩陣運(yùn)算,如圖7所示。</p><p>
43、 圖7 逆列混合矩陣表示</p><p><b> 3.1.4密鑰加</b></p><p> 輪密鑰加是最后一個(gè)階段,是將列混合的狀態(tài)與子密鑰進(jìn)行XOR邏輯運(yùn)算,即將輪密鑰與狀態(tài)按比特異或。輪密鑰是通過密鑰調(diào)度過程從密碼密鑰中得到的,輪密鑰長度等于分組長度。密鑰加是將輪密鑰簡單地與狀態(tài)進(jìn)行逐比特異或。輪密鑰由種子密鑰通過密鑰編排算法得到,輪密鑰長度等于分組長度
44、Nb。</p><p> 圖8是密鑰加運(yùn)算示意圖。</p><p><b> 圖8 密鑰加示意圖</b></p><p><b> 主要算法:</b></p><p> void addroundkey(int col[4][4],int allkey[4][44],int nr)</
45、p><p><b> {</b></p><p> int a,b,i,j;</p><p> for(i=0;i<4;i++)</p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p>
46、; col[i][j]^=allkey[i][j+4*nr]; </p><p><b> }</b></p><p> for(a=0;a<4;a++)</p><p> for(b=0;b<4;b++)</p><p
47、><b> {</b></p><p> printf(" %x",col[b][a]);</p><p> }printf("\n");</p><p><b> }</b></p><p> 3.1.5密鑰擴(kuò)展 </p>&
48、lt;p> 密鑰擴(kuò)展我認(rèn)為是本密碼程序的重點(diǎn)也是難點(diǎn),密鑰首先有一個(gè)初始密鑰,要將密鑰擴(kuò)展出十組子密鑰。密鑰bit的總數(shù)=分組長度*(輪數(shù)Round+1) 例如當(dāng)分組長度為128bits和輪數(shù)Round為10時(shí),輪密鑰長度為128*(10+1)=1408bits。密鑰的長度是夠使用的,所以必須將密碼密鑰擴(kuò)展成一個(gè)擴(kuò)展密鑰。擴(kuò)展算法:第i-1輪的分組長度個(gè)字節(jié)的子密鑰被分成四組來處理,每組4個(gè)字節(jié)。最后一組的4個(gè)字節(jié)先執(zhí)行一個(gè)字節(jié)
49、的循環(huán)左移,由s盒來進(jìn)行替代處理,然后這4個(gè)字節(jié)結(jié)果中的第一個(gè)字節(jié)和輪常數(shù)相異或,這個(gè)輪常數(shù)是預(yù)先定義的,并且固定值。最后,為了得到第i輪的密鑰,把得到的4個(gè)字節(jié)的結(jié)果和輪密鑰的最初4字節(jié)按位異或,得到i輪密鑰的最初4個(gè)字節(jié),然后又和密鑰的下面的4個(gè)字節(jié)按位異或,得到i輪密鑰的下面四個(gè)字節(jié),以此類推。下面是主要圖和代碼:</p><p> void keyschedule(int key[4][4],int a
50、llkey[4][44],int nk,int nr)</p><p><b> {</b></p><p> int temp[4][1],t;</p><p> for(int a=0;a<4;a++)//allkey初始化</p><p> for(int b=0;b<44;b++)&
51、lt;/p><p> {allkey[a][b]=0;}//置零</p><p> for(int i=0;i<4;i++)//將key保存在allkey的前4列</p><p> for(int j=0;j<4;j++)</p><p><b> {</b></p><p
52、> allkey[i][j]=key[i][j];</p><p><b> }</b></p><p><b> i=nk;</b></p><p> while(i<(4*(nr+1)))</p><p><b> {</b></p>&
53、lt;p> for(int x=0;x<4;x++)</p><p> temp[x][0]=allkey[x][i-1];</p><p> if(i%nk==0)</p><p><b> {</b></p><p><b> //rotword</b></p>
54、<p> t=temp[0][0];</p><p> temp[0][0]=temp[1][0];</p><p> temp[1][0]=temp[2][0];</p><p> temp[2][0]=temp[3][0];</p><p> temp[3][0]=t;</p><p>
55、for(int k=0;k<4;k++)// subword</p><p><b> {</b></p><p> temp[k][0]=sbox[temp[k][0]];</p><p><b> }</b></p><p> for(int h=0;h<4;h++)&
56、lt;/p><p> temp[h][0]^=Rcon[h][i/4];</p><p><b> }</b></p><p> for(int y=0;y<4;y++)</p><p> allkey[y][i]=allkey[y][i-4]^temp[y][0];</p><p>&
57、lt;b> i++;</b></p><p><b> }</b></p><p> for(int g=0;g<=10;g++){</p><p> printf("第 %d 輪密鑰",g);</p><p> for(int q=0;q<4;q++)<
58、/p><p> for(int w=0;w<4;w++)</p><p><b> {</b></p><p> printf(" %x",allkey[w][q+4*g]);</p><p><b> }</b></p><p> prin
59、tf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> 3.1.6獲取RoundKey </p><p> 以參數(shù)傳遞的形勢獲取allkey即每輪的密鑰。</p><p> 輪密鑰i(即第
60、i個(gè)輪密鑰)由輪密鑰緩沖字W[Nb*i]到W[Nb*(i+1)-1]給出,如圖9所示。</p><p> 圖9 Nb=6且Nk=4時(shí)的密鑰擴(kuò)展與輪密鑰選取</p><p> keyschedule(key,allkey,nk,nr);</p><p> addroundkey(col,allkey,0);</p><p> 3.1.7
61、逆字節(jié)替換</p><p> 這個(gè)就和S盒替代一樣。</p><p> void invsubbyte(int col[4][4])</p><p><b> {</b></p><p> int i,j,a,b;</p><p> for(i=0;i<4;i++)</p&g
62、t;<p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> col[i][j]=invsbox[col[i][j]];</p><p><b> }</b></p><p> for(a=0;a<4;a++)</p
63、><p> for(b=0;b<4;b++)</p><p><b> {</b></p><p> printf(" %x",col[b][a]);</p><p> }printf("\n");</p><p><b> }<
64、;/b></p><p><b> 3.1.8逆行移位</b></p><p> void invshiftrows(int col[4][4])</p><p><b> {</b></p><p> int j,temp,a,b;</p><p> tem
65、p=col[1][3];</p><p> for(j=3;j>0;j--)</p><p><b> {</b></p><p> col[1][j]=col[1][j-1];</p><p><b> }</b></p><p> col[1][0]=te
66、mp;</p><p> for(j=3;j>1;j--)</p><p><b> {</b></p><p> temp=col[2][j];</p><p> col[2][j]=col[2][j-2];</p><p> col[2][j-2]=temp;</p>
67、;<p><b> }</b></p><p> temp=col[3][0];</p><p> for(j=1;j<4;j++)</p><p><b> {</b></p><p> col[3][(j+3)%4]=col[3][(j+4)%4];</p&g
68、t;<p><b> }</b></p><p> col[3][3]=temp;</p><p> //printf("逆行移位后 :\n");</p><p> for(a=0;a<4;a++)</p><p> for(b=0;b<4;b++)</p&g
69、t;<p><b> {</b></p><p> printf(" %x",col[b][a]);</p><p> }printf("\n");</p><p><b> }</b></p><p><b> 3.1.9
70、逆列混合</b></p><p> void invmixcolumn(int col[4][4]){</p><p> int r=0,c=0,a,b;</p><p> int temp[4][4];</p><p> for(r=0;r<4;r++){</p><p> for(c=0
71、;c<4;c++){</p><p> temp[r][c]=col[r][c];</p><p><b> }</b></p><p><b> }</b></p><p> for(c=0;c<4;c++){</p><p> col[0][c]=g
72、fmultby0e(temp[0][c])^gfmultby0b(temp[1][c])^gfmultby0d(temp[2][c])^gfmultby09(temp[3][c]);</p><p> col[1][c]=gfmultby09(temp[0][c])^gfmultby0e(temp[1][c])^gfmultby0b(temp[2][c])^gfmultby0d(temp[3][c]);<
73、/p><p> col[2][c]=gfmultby0d(temp[0][c])^gfmultby09(temp[1][c])^gfmultby0e(temp[2][c])^gfmultby0b(temp[3][c]);</p><p> col[3][c]=gfmultby0b(temp[0][c])^gfmultby0d(temp[1][c])^gfmultby09(temp[2][c
74、])^gfmultby0e(temp[3][c]);</p><p><b> }</b></p><p> for(a=0;a<4;a++)</p><p> for(b=0;b<4;b++)</p><p><b> {</b></p><p>
75、printf(" %x",col[b][a]);</p><p> }printf("\n");</p><p><b> }</b></p><p><b> 3.1.10加密</b></p><p> AES加密算法由初始輪密鑰加和Nr輪的輪變換
76、組成,它的輸入為初始狀態(tài)矩陣和輪密鑰,執(zhí)行加密算法后產(chǎn)生一個(gè)輸出狀態(tài)矩陣,輸入明文和輸出密文均為128比特。或者是從文件讀取這些明文和密鑰。這里的密鑰可以是128比特也可以是192比特。流程圖如下:</p><p> void xAESencrypt()</p><p><b> {</b></p><p> system("c
77、ls");</p><p> int nk=4,nr=10;</p><p> int allkey[4][44];</p><p> int col[4][4];</p><p> int key[4][4];</p><p> printf("\n請輸入加密密鑰:\n");&
78、lt;/p><p> for(int o=0;o<4;o++)</p><p> for(int p=0;p<4;p++)</p><p><b> {</b></p><p> scanf("%x",&key[p][o]);</p><p><b
79、> }</b></p><p> //memcpy(dekey, key, 64);</p><p> printf("\n請輸入對應(yīng)要加密的字節(jié):\n");</p><p> for(int w=0;w<4;w++)</p><p> for(int v=0;v<4;v++)<
80、;/p><p><b> {</b></p><p> scanf("%x",&col[v][w]);</p><p><b> }</b></p><p> printf("輸入的密鑰為(16進(jìn)制):");</p><p>
81、; for(int a=0;a<4;a++)</p><p> for(int b=0;b<4;b++)</p><p> {printf(" %x",key[b][a]);}</p><p> printf("\n");</p><p> printf("輸入的明文為
82、(16進(jìn)制):");</p><p> for(int c=0;c<4;c++)</p><p> for(int d=0;d<4;d++)</p><p> {printf(" %x",col[d][c]);}</p><p> printf("\n");</p&
83、gt;<p> keyschedule(key,allkey,nk,nr);</p><p> addroundkey(col,allkey,0);</p><p> printf("輪子密鑰加結(jié)果:\n");</p><p> for(int e=0;e<4;e++)</p><p> fo
84、r(int f=0;f<4;f++)</p><p><b> {</b></p><p> printf(" %x",col[e][f]);</p><p> }printf("\n");</p><p> for(int x=1;x<=(nr-1);x+
85、+)</p><p><b> {</b></p><p> printf("第%d輪s盒置換以后:\n",x);subbyte(col); </p><p> printf("第%d輪行移位結(jié)果:\n",x);shiftrows(col); </p><p>
86、 printf("第%d列混合結(jié)果:\n",x);mixcolumn(col); </p><p> printf("第%d輪密鑰加結(jié)果:\n",x);addroundkey(col,allkey,x); </p><p><b> }</b></p><p> printf(&qu
87、ot;第10輪s盒置換以后:\n");subbyte(col);</p><p> printf("第10輪行移位結(jié)果:\n"); shiftrows(col);</p><p> printf("第10輪密鑰加結(jié)果:\n");addroundkey(col,allkey,nr);</p><p> print
88、f("\n\n加密結(jié)果為:");printf("\n");</p><p> for(int q=0;q<4;q++)</p><p> for(int r=0;r<4;r++)</p><p><b> {</b></p><p> printf("
89、; %x",col[r][q]);</p><p><b> }</b></p><p> printf("\n");</p><p> //memcpy(de_asd, col, 64);</p><p> printf("\n\n請按數(shù)字鍵“0”返回主菜單!(“ent
90、er”鍵確定)\n");</p><p><b> 3.1.11解密</b></p><p><b> 流程圖如下:</b></p><p> 解密算法和加密算法類似,只是在解密算法中使用的變換為加密時(shí)相應(yīng)變換的逆變換,并且在第一輪到地Nr-1輪之間逆字節(jié)替代與逆行移位,逆列混合和逆輪密鑰加交換了位置。&l
91、t;/p><p> void xAESdencrypt()</p><p><b> {</b></p><p> system("cls");</p><p> int allkey[4][44];</p><p> int nr=10,nk=4;</p>
92、<p> int asd[4][4];</p><p> int key[4][4];</p><p> printf("\n請輸入解密密鑰:16進(jìn)制(128比特)\n");</p><p> for(int o=0;o<4;o++)</p><p> for(int p=0;p<4;p+
93、+)</p><p><b> {</b></p><p> scanf("%x",&key[p][o]);</p><p><b> }</b></p><p> printf("\n請輸入要解密的字符:16進(jìn)制(128比特)\n");<
94、;/p><p> for(int w=0;w<4;w++)</p><p> for(int v=0;v<4;v++)</p><p><b> {</b></p><p> scanf("%x",&asd[v][w]);</p><p><b&g
95、t; }</b></p><p> printf("您輸入的密鑰為:");</p><p> for(int a=0;a<4;a++)</p><p> for(int b=0;b<4;b++)</p><p> {printf(" %x",key[b][a]);}&
96、lt;/p><p> printf("\n");</p><p> printf("您輸入的密文為:");</p><p> for(int c=0;c<4;c++)</p><p> for(int d=0;d<4;d++)</p><p> {printf(
97、" %x",asd[d][c]);}</p><p> printf("\n");</p><p> keyschedule(key,allkey,nk,nr);</p><p> printf("\n\n輪子密鑰加結(jié)果為:");addroundkey(asd,allkey,nr);printf(&
98、quot;\n");</p><p> for(int x=9;x>=1;x--)</p><p><b> {</b></p><p> printf("第%d逆字節(jié)替代結(jié)果:\n",10-x); invsubbyte(asd);</p><p> printf("
99、第%d逆行移位結(jié)果:\n",10-x); invshiftrows(asd); </p><p> printf("第%d逆輪密鑰加位結(jié)果:\n",10-x); addroundkey(asd,allkey,x);</p><p> printf("第%d逆列混合結(jié)果:\n",10-x); invmixcolumn(asd);</
100、p><p><b> }</b></p><p> printf("第10逆字節(jié)替代結(jié)果:\n");invsubbyte(asd);</p><p> printf("第10逆行移位結(jié)果:\n");invshiftrows(asd);</p><p> printf("
101、;第10逆輪密鑰加位結(jié)果:\n");addroundkey(asd,allkey,0);</p><p> printf("\n\n解密結(jié)果為:");</p><p> for(int i=0;i<4;i++)</p><p> for(int j=0;j<4;j++)</p><p><
102、b> {</b></p><p> printf(" %x",asd[j][i]);</p><p><b> }</b></p><p> printf("\n");</p><p> printf("\n\n請按數(shù)字鍵“0”返回主菜單!(
103、“enter”鍵確定)\n");</p><p><b> }</b></p><p><b> 4. 測試報(bào)告</b></p><p><b> 密鑰擴(kuò)展的測試</b></p><p> 本密鑰擴(kuò)展的測試直接調(diào)用密鑰擴(kuò)展函數(shù),測試密鑰在代碼以字節(jié)數(shù)組的方式中
104、輸入。</p><p> 測試結(jié)果如下,與FIPS PUB 197 給出的結(jié)果完全相同, 此處只列出密鑰長度為128位的數(shù)據(jù),因此密鑰擴(kuò)展模塊正確。3.5節(jié)已經(jīng)敘述了解密密鑰和加密密鑰相同。</p><p><b> 密鑰長度為128位</b></p><p><b> 初始密鑰=</b></p>&l
105、t;p> 2b7e151628aed2a6abf7158809cf4f3c</p><p><b> 加密輪密鑰=</b></p><p> 2b7e151628aed2a6abf7158809cf4f3c</p><p> a0fafe1788542cb123a339392a6c7605</p><p>
106、 f2c295f27a96b9435935807a7359f67f</p><p> 3d80477d4716fe3e1e237e446d7a883b</p><p> ef44a541a8525b7fb671253bdb0bad00</p><p> d4d1c6f87c839d87caf2b8bc11f915bc</p><p>
107、 6d88a37a110b3efddbf98641ca0093fd</p><p> 4e54f70e5f5fc9f384a64fb24ea6dc4f</p><p> ead27321b58dbad2312bf5607f8d292f</p><p> ac7766f319fadc2128d12941575c006e</p><p>
108、 d014f9a8c9ee2589e13f0cc8b6630ca6</p><p><b> 我的結(jié)果:</b></p><p><b> 密鑰擴(kuò)展沒有問題。</b></p><p> 再來測試加密結(jié)果FIPS PUB 197測試。</p><p><b> 我的答案:</
109、b></p><p> 解密測試:FIPS PUB 197先測試</p><p><b> 我的測試結(jié)果:</b></p><p><b> 對應(yīng)的明文:</b></p><p> 和上面的測試結(jié)果一樣。</p><p><b> 5.結(jié)論</
110、b></p><p> 這次總算搞懂了程序的編寫流程,雖然只實(shí)現(xiàn)了簡單要求,但是對我這樣一個(gè)敲程序不熟練的學(xué)生來說,的確花了一些功夫,雖然我沒有那么熟練的把每一步的實(shí)現(xiàn)算法流利的敲出來,但是對于密碼學(xué)本算法的熟悉,我的確有不少的想法,只是實(shí)現(xiàn)起來對我來說還有點(diǎn)考驗(yàn)。對這個(gè)算法我算是熟悉了,剛開始就想一下子把十輪十二輪十四輪一起實(shí)現(xiàn)了,可是后來才發(fā)覺不是那么簡單,所以就只實(shí)現(xiàn)了基本要求的128bit。嘗試了
111、一下十二輪的加密,但是有個(gè)問題的確不好解決,就是輸入的初始密鑰是192bit,然而后面需要用到的密碼分組是128bit一組,最后還是搞好了。從文件讀取也成功了。然后再整個(gè)實(shí)現(xiàn)過程中遇到了很多困難,比如,用的是二維數(shù)組,遇到有時(shí)輸入是先行后列,但是按照數(shù)組的定義是先列后行,很多時(shí)候有點(diǎn)繞。還有遇到的難題就是參數(shù)的選擇和傳遞,這是一個(gè)很惱火的事情,由于語言基礎(chǔ)不好,所以一個(gè)小小的問題都花了九牛二虎之力去把它解決。還有就是矩陣乘法那里的異或函
112、數(shù),也有點(diǎn)難,因?yàn)槭鞘M(jìn)制的算法,需要用到二進(jìn)制乘法的知識。還有就是很想實(shí)現(xiàn)多分組的算法還有漢字等作為密鑰的。還有就是文件處理,對文件的加密。最后就是窗口了,本來想設(shè)計(jì)一個(gè)有</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 譚浩強(qiáng) C程序設(shè)計(jì)(第二版) 清華大學(xué)出版社 1999</p><p> [2] 張世斌
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- aes密碼學(xué)課程設(shè)計(jì)(c語言實(shí)現(xiàn))--aes加密解密軟件的實(shí)現(xiàn)
- AES加密解密算法的高速ASIC設(shè)計(jì).pdf
- aes加密
- 基于AES算法的數(shù)據(jù)加密與解密硬件設(shè)計(jì).pdf
- 輕量級AES加解密芯片設(shè)計(jì)與實(shí)現(xiàn).pdf
- AES加密算法的FPGA實(shí)現(xiàn).pdf
- 高級加密標(biāo)準(zhǔn)AES的實(shí)現(xiàn)研究.pdf
- 加密與解密課程設(shè)計(jì)
- 文件加密與解密—java課程設(shè)計(jì)報(bào)告
- AES加、解密算法的FPGA優(yōu)化設(shè)計(jì).pdf
- SoC芯片中AES加密模塊的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于FPGA的AES加密系統(tǒng)設(shè)計(jì).pdf
- 基于AES的文件加密管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- java課程設(shè)計(jì)--加密與解密
- java課程設(shè)計(jì)---加密和解密
- java文件加密解密課程設(shè)計(jì)
- 基于aes的文件加密管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(1)
- AES加密算法的研究與IP核設(shè)計(jì)實(shí)現(xiàn).pdf
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--加密與解密
- 基于先進(jìn)加密標(biāo)準(zhǔn)(AES)算法的加密芯片設(shè)計(jì).pdf
評論
0/150
提交評論