下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、AES與基于AES珀CMAC_NewAES與基于AES珀CMAC本科實驗報告課程名稱:信息與通信安全姓名:鄧敏實驗:實驗一系:信電系專業(yè):信息與通信工程學號:31101009783110100978指導教師:謝磊AES與基于AES的CMAC一、實驗目的1、熟悉AES加解密過程,掌握其算法實現(xiàn);2、熟悉CMAC生成過程,掌握其算法實現(xiàn)。、實驗任務1、復習AES原理;2、用C/C+編寫AES算法并調試通過;3、復習CMAC原理;4、 在實現(xiàn)AES基礎上, 用C/C+編寫CMAC算法并調試通過。三、實驗原理1 .AES原理AES加解密過程如下圖所示,明文分組的長度為128位即16字節(jié), 秘鑰長度可以
2、為16,24或32字節(jié)(128,182或256位)。根據(jù)秘鑰的長度,算法被稱為AES-128、AES-192、或AES-256,本次實驗采用AES-12812#心咽金敢蛾1.1 AES加密過程AES明文輸入為一個現(xiàn)中被描述為4x4的字節(jié)方陣,一般稱其為state數(shù)組,并且按照如下方式填入到數(shù)組當中, 原始密鑰也為128為分組,并按同樣的方式填入數(shù)組。128位分組,在代碼實k0k4k8k12k1k5k9k13k2k6k10k14k3k7k11k151r業(yè),如雇衣加廿亞運并為/施密W葉或越情in0in4in8in12in1in5in9in13in2in6in10in14in3in7in11in15
3、AES加密過程共進行十輪,前九輪由四個步驟組成,四個步驟依次為字節(jié)代替(SubBytes),行移位(ShiftRows),列混淆(MixColumns),輪密鑰加(AddRoundKey),第十輪依次進行除列混淆的三個步驟。1.1.1字節(jié)代替AES定義了一個S盒,它是由16x16個字節(jié)組成的矩陣,包含了8位所能表示的256個數(shù)的一個置換,字節(jié)代替將輸入字節(jié)的高四位作為行值,低四位作為列值, 以這些行列值作為索引從S盒的對應位置取出元素作為輸入。1.1.2行移位變換行移位變換完成基于行的循環(huán)移位操作,state的第0行不動,第1行循環(huán)左移1個字節(jié),第2行循環(huán)左移2個字節(jié),第3行循環(huán)左移3個字節(jié)1
4、.1.3列混淆列混淆變換的正向列混淆變換對每列獨立地進行操作。 每列中的每個字節(jié)被映射為一個新值,此值由該列中的四個字節(jié)通過函數(shù)變換得到)這個變換可由下面基于state的矩陣乘法表示。5Q.0SnjSo+2So.3sSOJ50事SuoSjS】.S1.3SLOSI.iJ1泮31,3SztiSSZcsi5%工W2.3一S31oSajSa.2%MrLS.OS3.2S,.-0203()1or0102030101010203.030101021.1.4輪密鑰加輪密鑰加變換用于將輸入或中間態(tài)S的每一列與一個密鑰字Wi進行按位異或) 其中,Wi由原始密鑰通過密鑰擴展算法產(chǎn)生。1.2 AES解密過程AES解密
5、過程為加密過程的逆,同為十輪,四個步驟按一定順序執(zhí)行,四個步驟分別為逆向字節(jié)替代(InvSubBytes),逆向行移位(InvShiftRows),逆向列混淆(InvMixColumns),輪密鑰加(AddRoundKey),其中輪密鑰加與加密過程中的步驟相同。1.2.1逆向字節(jié)替代AES定義了一個逆S盒,其替代方法與加密過程相同1.2.2逆向行移位逆向行移位與行移位變換相反,逆行移位變換將態(tài)State的后三行按相反的方向進行移位操作,即第0行保持不變,第1行向右移1個字節(jié),第2行向右移2個字節(jié),第3行向右移3個字節(jié)。1.2.2逆向列狀態(tài)中單列的列混淆變換可表示為(So,j(2*So,j)(3
6、*Sj)S2,jS3,j(G,jso,j(3*s2,j)S3,j(S2,jso,jG,j(2*s2,j)(3*s3,j)(S3,j(3*So,j)Si,jS2,j(2*S3,j)混淆逆列混淆變換的處理方法與列混淆變換類似,每一列都通過與一個固定的多項相乘進行變換。寫為矩陣乘法的形式,逆列混淆變換按以下方式對列進行變換:1.3 AES秘鑰擴展AES加密解密過程中,每一輪都需要一個與輸入分組具有相同長度的擴展密鑰Wi的參與。由于外部輸入的加密密鑰長度有限,所以在算法中要用一個密鑰擴展程序把外部密鑰擴展成更長的比特串,以生成各輪的加密和解密密鑰。其一輪過程如下圖所示,一共需要進行十次,由原密鑰擴展出
7、10個密鑰,分別用于每輪加解密。I!小心Wj*-OE09QDQB其中g函數(shù)為行移位,自己替代以及與輪常量異或。2 .CMAC原理CMAC為基于密碼的消息認證碼, 生成認證碼的過程課分為兩種。首先,當消息長度是分組長度b的n倍時,在此我們選擇b=128,可將消息換分為n組(M1,M2.Mn)。 算法使用了k位的加密密鑰K和n位的常數(shù)K1.對于AES,密鑰長度k為128、192或256位,在此我們選擇128位,CMAC按如下方式計算C1E(K,M1)C2E(K,M2C1)CnE(K,MnCn1KJ)TMSBTien(Cn)其中,T為消息認證碼,也成為tag;Tlen是T的位長度,MSBs(X)是位
8、串的X最左邊的s位。如果消息不是密文分組長度的整數(shù)倍時,則最后分組的右邊(低有效位)填充一個1和若干0使得最后的分組長度為bo除了使用一個不同的n位密鑰K2代替K1外,和前面所述的一樣進行CMAC運算。兩個n位的密鑰由K位的加密密鑰按如下方式導出:LE(K,0n)KIL*x2K2L*x(L*x)*x其中乘法(*)在域GF(2八n)內(nèi)進行。四、AESAES 模塊代碼實現(xiàn)1、字節(jié)替代state值由16進制表示,因此staterc=16i+j,i為高四位,j為低4位,s盒為16x16矩陣,因此只需用staterc=sboxstaterc即可完成字節(jié)替代。其實現(xiàn)代碼如下:voidSubBytes(un
9、signedcharstate44)(intr,c;for(r=0;r4;r+)(for(c=0;c4;c+)(staterc=sboxstaterc;2、行移位代碼實現(xiàn)時,一行一行的完成,因為第一行不變,因此行移位由r=1開始到r=3,定義一個中間數(shù)組變 量 存 儲 移 位 后 改 行 每 列 的 值 , 變 換 可 由tc=stater(c+r)%4實現(xiàn),例如當r=1,c=1,t1=state2,r=1,c=3,t3=state0,即完成了第一行的移位,然后再將tc賦值回staterc即可。模塊代碼實現(xiàn)如下:voidShiftRows(unsignedcharstate4)(unsigne
10、dchart4;intr,c;for(r=1;r4;r+)(for(c=0;c4;c+)(tc=stater(c+r)%4;for(c=0;c4;c+)(staterc=tc;3、列混淆列混淆實現(xiàn)時,一列一列的進行,由原理可知,每個列混淆之后的元素都與該列的四個元素有關)因此定義一個中間變量tr存儲原state值防止之后給state賦值時將原值覆蓋,由列混淆原理,可總結出state列混淆之后每個元素的值為staterc=FFmul(0 x02,tr)八FFmul(0 x03,t(r+1)%4)八FFmul(0 x01,t(r+2)%4)八FFmul(0 x01,t(r+3)%4),其中FFmu
11、l為定義在GF(2A8)上的乘法,其元算原理為將某值x乘以2其結果左移以為,若該值的最左邊的位為1,那么在移位后還要異或(00011001),而x乘以3即為x*03=x*02八x,x乘以0E090D0B也可按相同方式實現(xiàn),因此可以寫出FFmul代碼。voidMixColumns(unsignedcharstate4)unsignedchart4;intr,c;for(c=0;c4;c+)for(r=0;r4;r+)tr=staterc;for(r=0;r4;r+)(staterc=FFmul(0 x02,tr)FFmul(0 x03,t(r+1)%4)八FFmul(0 x01,t(r+2)%4
12、)FFmul(0 x01,t(r+3)%4);)unsignedcharFFmul(unsignedchara,unsignedcharb)(unsignedcharbw4;unsignedcharres=0;inti;bw0=b;for(i=1;i4;i+)(bwi=bwi-11;if(bwi-1&0 x80)(bwiA=0 x1b;)for(i=0;ii)&0 x01)(resA=bwi;)returnres;)4、輪密鑰加輪密鑰加即將state值與相應的key值相異或后再賦回state,因此只需用staterc八=krc即可實現(xiàn)。模塊代碼實現(xiàn)如下:voidAddRound
13、Key(unsignedcharstate4,unsignedchark4)(intr,c;for(c=0;c4;c+)(for(r=0;r4;r+)(statercA=krc;)5、逆字節(jié)替代逆字節(jié)替代與字節(jié)替代代碼實現(xiàn)基本相同,指需將s盒換位逆s盒Invsbox即可。 模塊代碼實現(xiàn)如下:voidInvSubBytes(unsignedcharstate4)(intr,c;for(r=0;r4;r+)(for(c=0;c4;c+)(staterc=Invsboxstaterc;)6、逆向行移位逆向行移位代碼實現(xiàn)與行移位代碼實現(xiàn)也基本相同,行移位為向左移,而逆向行移位為向右移)可由tc=sta
14、ter(c-r+4)%4實現(xiàn)。模塊代碼實現(xiàn)如下:voidInvShiftRows(unsignedcharstate4)(unsignedchart4;intr,c;for(r=1;r4;r+)(for(c=0;c4;c+)(tc=stater(c-r+4)%4;for(c=0;c4;c+)(staterc=tc;7、逆向列混淆逆向列混淆代碼實現(xiàn)與列混淆基本相同,只需將相乘的矩陣變換一下即可,化成單列表示時,只需將各元素之前的系數(shù)改變即可,staterc=FFmul(0 x0e,tr)八FFmul(0 x0b,t(r+1)%4)八FFmul(0 x0d,t(r+2)%4)八FFmul(0 x0
15、9,t(r+3)%4)而FFmul模塊之前已經(jīng)介紹過了。模塊代碼實現(xiàn)如下:voidInvMixColumns(unsignedcharstate4)unsignedchart4;intr,c;for(c=0;c4;c+)for(r=0;r4;r+)tr=staterc;for(r=0;r4;r+)staterc=FFmul(0 x0e,tr)八FFmul(0 x0b,t(r+1)%4)AFFmul(0 x0d,t(r+2)%4)AFFmul(0 x09,t(r+3)%4);)8、密鑰擴展密鑰擴展共生成11個輪密鑰w0w10。A.w0為原始輸入密鑰,可由代碼w0rc=keyr+c*4實現(xiàn);B.之
16、后各輪密鑰由前一密鑰生成, 首先將前一輪密鑰第四列進行g函數(shù)變換;C.g函數(shù)可由如下步驟實現(xiàn)a.將第四列四個元素循環(huán)左移一位;b.將循環(huán)移位后所得數(shù)組進行s盒字節(jié)替代, 這兩步可由tr=sboxtemp(r+1)%4實現(xiàn);其中temp口數(shù)組存儲前一輪密鑰第三列元素值,t數(shù)組為定義中間變量數(shù)組;c將t與輪常量相異或,輪常量只有最高字節(jié)有值,其余為0,可由t0A=rci-1實現(xiàn);D.tr與前一輪密鑰第一列相異或得到該輪密鑰第一列,由wir0=wi-1r0Atr實現(xiàn);E.該輪第24列密鑰由前一輪對應列密鑰與該輪前一列密鑰異或得到,可由wirj=wi-1rjAwirj-1實現(xiàn)。for(r=0;r4;r
17、+)(for(c=0;c4;c+)(w0rc=keyr+c*4;for(i=1;i=10;i+)(unsignedchart4;unsignedchartemp4;for(r=0;r4;r+)(tempr=wi-1r3;for(r=0;r4;r+)(tr=sboxtemp(r+1)%4;)t0A=rci-1;for(r=0;r4;r+)(wir0=wi-1r0Atr;)for(j=1;j4;j+)(for(r=0;r4;r+)(wirj=wi-1rjAwirj-1;)341.加密加密過程首先進行一輪輪密鑰加,之后進行十輪的變換,每次變換分為字節(jié)替代,行移位,列混淆,輪密鑰加,其中第十輪變換不進
18、行列混淆。代碼實現(xiàn)如下:AddRoundKey(state,w0);for(i=1;i=0;i-)(InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,wi);if(i)(五、CMACCMAC 模塊代碼實現(xiàn) 1.K1、K2生成由CMAC生成原理可知道K1、K2的生成過程a.LE(K,0n),用AES力口密)由AES_128(key,Z,L)實現(xiàn),L定義為輸出;b.K1=L*x,乘法定義在GF(2八n),即將L左移一位,InvMixColumns(state);若L最高位為1,則將L左移一位之后再與const_Rb(常量)異或,左移由
19、函數(shù)leftshift_onebit(L,K1)實現(xiàn),K1定義為輸出。c.K2=L*xA2=K1*x,因此將L換位K1,重復進行b中操作即可得到K2ovoidgenerate_subkey(unsignedchar*key,unsignedchar*K1,unsignedchar*K2)(unsignedcharL16;unsignedcharZ16;unsignedchartmp16;inti;for(i=0;i16;i+)Zi=0;AES_128(key,Z,L);if(L0&0 x80)=0)(leftshift_onebit(L,K1);else(leftshift_onebi
20、t(L,tmp);xor_128(tmp,const_Rb,K1);if(K10&0 x80)=0)(leftshift_onebit(K1,K2);else(leftshift_onebit(K1,tmp);xor_128(tmp,const_Rb,K2);return;K1、K2生成時運用了左移一位函數(shù))因為input,為16為數(shù)組,因此左移時應考慮溢出,當前一數(shù)組元素最高位為1時, 則此時數(shù)組元素應在左移的同時加1,因此定義overflow,當前一元素最高位為1時)即inputi&0 x80=1)則overflow=1)否則為0)當前元素先左移一位outputi=inpu
21、ti=0;i-)outputi=inputi1;outputi|=overflow;overflow=(inputi&0 x80)?1:0;return;).消息末組確定當消息長度不是分組長度整數(shù)倍時,最后一組消息分組需要進行一些變換,因此需要一個函數(shù)來確 定 最 后 一 組 消 息 分 組 , 這 個 函 數(shù) 定 義 為padding(unsignedchar*lastb,unsignedchar*pad,intlength)其 中l(wèi)astb為消息分組后剩下不能成為一組的元素)length為lastb的元素個數(shù),pad定義為輸出,為最后一組消息分組。 當padj中jlength時)p
22、adj=lastbj,而當j達到length長度時)padlength=0 x80,其余為0)代碼實現(xiàn)如下:voidpadding(unsignedchar*lastb,unsignedchar*pad,intlength)intj;for(j=0;j16;j+)if(jlength)padj=lastbj;)elseif(j=length)(padj=0 x80;)else(padj=0 x00;).CMAC生成CMAC有函數(shù)AES_CMAC(unsignedchar*key,unsignedchar*input,intlength,unsignedchar*mac)生成)key為密鑰)in
23、put為消息輸入,length為消息長度,而mac則為生成的CMAC,在此算法中,將消息分組長度設置為16.a.生成K1)K2)由generate_subkey(key,K1,K2)實現(xiàn);b.確定分組長度)由n=(length+15)/16實現(xiàn))當length16時)n=1;c.確定消息長度是否為分組長度的整數(shù)倍, 定義flag,當flag=1時,是整數(shù)倍,否則不是,當length=0時,即輸入消息為0時,定義分組數(shù)n=1,flag=0;d.當flag=1,即消息長度為分組長度整數(shù)倍時,定義M_last為最后分組&input16*(n-1)與K1異或)由函數(shù)xor_128(&i
24、nput16*(n-1),K1,M_last)實現(xiàn),注意&的使用;e.當flag=0時)先由padding(&input16*(n-1),padded,length%16)確定最后分組,length%16即為未分組元素個數(shù),padded為最后分組,M_last為最后分組padded與K2異或)由函數(shù)xor_128(padded,K2,M_last)實現(xiàn);f.定義中間變量X為AES加密輸出,第一組運算時為M1直接與K加密,其后為前一組加密輸出X與Mi異或后再與K進行AES加密,因此第一次時定義X=0 x00,則前n-1輪可由xor_128(X,&input16*i,Y),
25、AES_128(key,Y,X)兩步實現(xiàn);g.最后一步加密與之前都不一樣,用第n-1輪加密輸出X與M_last異或,再與K進行AES加密,其中M_last先 前 已 定 義 , 因 此 最 后 一 步 運 算 為xor_128(X,M_last,Y),AES_128(key,Y,X)h.最 后 一 步 運 算 為MSB(Tlen),其中Tlen為輸出CMAC即T的長度,在此我們都定義為16,而MSB運算即為截取X最左邊的Tlen=16位,可由maci=Xi實現(xiàn)。voidAES_CMAC(unsignedchar*key,unsignedchar*input,intlength,unsigned
26、char*mac)unsignedcharX16,Y16,M_last16,padded16;unsignedcharK116,K216;intn,i,flag;generate_subkey(key,K1,K2);n=(length+15)/16;if(n=0)n=1;flag=0;)elseif(length%16)=0)flag=1;)elseflag=0;)if(flag)xor_128(&input16*(n-1),K1,M_last);)elsepadding(&input16*(n-1),padded,length%16);xor_128(padded,K2,M_
27、last);)for(i=0;i16;i+)Xi=0;for(i=0;in-1;i+)xor_128(X,&input16*i,Y);AES_128(key,Y,X);)xor_128(X,M_last,Y);AES_128(key,Y,X);for(i=0;i16;i+)maci=Xi;)五、實驗結果AES實驗結果:在VC中運行工程,輸入課本中一個已知密文的例子,其中明文、密鑰、密文如下input=0123456789abcdeffedcba9876543210key=0f1571c947d9e8590cb7add6af7f6798output=ff0b844a0853bf7c6934ab4364148fbVC運行結果如圖所示, 實驗結果與理論值相等, 因此可知實現(xiàn)了AES的加解密。CMAC實驗結果:定義輸入函數(shù)為M64,進行CMAC驗證時, 截取M64的長度各不相同,消息長度分別選擇為0(輸入消息為0),40(消息長度不為分組長度16的整數(shù)倍),64(消息長度為分組長度16的整數(shù)倍) , 得到如下結果。E匿/學各CD電buQKEacexe1 1enHenHWES.WES.=H=H-CHftG-CHftG900
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山地公園設施工程合同
- 漁業(yè)安全員聘任合同樣本
- 2025西安市存量房屋買賣合同經(jīng)紀成交版
- 2025關于投資合作合同范本
- 2025年度航空航天技術服務合同2篇
- 社區(qū)服務中心門禁施工合同
- 藥品生產(chǎn)冷藏庫租賃合同
- 2025有關學校食堂委托經(jīng)營合同
- 商業(yè)綜合體灰工合同
- 安防消防班組施工合同
- 第22單元(二次函數(shù))-單元測試卷(2)-2024-2025學年數(shù)學人教版九年級上冊(含答案解析)
- 藍色3D風工作總結匯報模板
- 小王子-英文原版
- 2024年江蘇省導游服務技能大賽理論考試題庫(含答案)
- 2024年中考英語閱讀理解表格型解題技巧講解(含練習題及答案)
- 新版中國食物成分表
- 浙江省溫州市溫州中學2025屆數(shù)學高二上期末綜合測試試題含解析
- 保安公司市場拓展方案-保安拓展工作方案
- 10以內(nèi)加減法(直接打印,20篇)
- 電力業(yè)擴工程竣工驗收單
- 三年級上冊口算題(1000道打印版)
評論
0/150
提交評論