版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、華北電力大學實驗報告|實驗名稱 現代密碼學課程設計課程名稱 現代密碼學|專業(yè)班級:學生姓名:學 號:成 績:指導教師:實驗日期: 綜合實驗一 AES-128 加密算法實現一、實驗目的及要求1)用 C+實現;2)具有 16 字節(jié)的加密演示;3)完成 4種工作模式下的文件加密與解密: ECB, CBC, CFB,OFB.二、所用儀器、設備計算機、 Visual C+軟件。三. 實驗原理3.1、設計綜述AES 中的操作均是以字節(jié)作為基礎的,用到的變量也都是以字節(jié)為基礎。State 可以用 4×4 的矩陣表示。 AES 算法結構對加密和解密的操作,算法由輪密鑰開始,并用 Nr 表 示對一個數
2、據分組加密的輪數 (加密輪數與密鑰長度的關系如表 2所示)。AES 算法的主循 環(huán) State矩陣執(zhí)行 Nr 1輪迭代運算,每輪都包括所有 4 個階段的代換,分別是在規(guī)范中 被稱為 SubBytes(字節(jié)替換 ) 、 ShiftRows(行位移變換 ) 、 MixColumns( 列混合變換 ) 和 AddRoundKey,(由于外部輸入的加密密鑰 K 長度有限,所以在算法中要用一個密鑰擴展 程序 (Keyexpansion)把外部密鑰 K 擴展成更長的比特串,以生成各輪的加密和解密密鑰。 最后執(zhí)行只包括 3 個階段 (省略 MixColumns 變換 )的最后一輪運算。表 2 AES 參數密
3、鑰長度 (bits)128192256明文分組長度 (bits)128128128輪數101214每輪密鑰長度 (bits)128128128擴展密鑰長度 (bytes)176206240基本要求按標準分組, 以 128 比特為分組大小。 所以輪數為 10 輪,密鑰長度也為 128 比特。3.2、字節(jié)代替( SubBytes )AES 定義了一個 S 盒, State中每個字節(jié)按照如下方式映射為一個新的字節(jié):把該字 節(jié)的高 4 位作為行值,低 4 位作為列值,然后取出 S 盒中對應行和列的元素作為輸出。 例如,十六進制數 84 。對應 S盒的行是 8列是 4, S盒中該位置對應的值是 5F 。
4、S 盒是一個由 16x16 字節(jié)組成的矩陣,包含了 8 位值所能表達的 256 種可能的變換。 S 盒按照以下方式構造:(1) 逐行按照升序排列的字節(jié)值初始化 S盒。第一行是00 ,01 ,02 ,OF ; 第二行是10 ,l1 ,1F等。在行 X 和列 Y的字節(jié)值是 xy 。(2) 把 S盒中的每個字節(jié)映射為它在有限域 GF(2k )中的逆。GF代表伽羅瓦域,GF( 28 ) 由 一 組 從 0x00 到 0xff 的 256 個 值 組 成 , 加 上 加 法 和 乘 法 。 GF(28)8 4Z 2 X3。00被映射為它自身 00 。( x x x x 1)(3) 把 S 盒中的每個字節(jié)
5、記成 (b8 ,b7,b6 ,b5,b4,b3,b2,b1,b0 )。對 S 盒中每個字節(jié)的每位 做如下變換:bi bi b(i 4)mod8 b(i 5)mod8 b(i 6)mod8 b(i 7) mod8 ci上式中 ci 是指值為63字節(jié) C第 i 位,即 (c8,c7,c6,c5,c4,c3,c2,c1,c0) (01100011) 。符號( ')表示更新后的變量的值AES 用以下的矩陣方式描述了這個變換:b010001111b01b111000111b11b211100011b20b311110001b30b411111000b40b501111100b51b6001111
6、10b61b700011111b70最后完成的效果如圖:3.3、行移位( ShiftRows )一 State 的第一行字節(jié)保持不變, State 的第二行字節(jié)循環(huán)左移一個字節(jié), State 的第三行字節(jié)循環(huán)左移兩個字節(jié), State 的第四行循環(huán)左移三個字節(jié)。行移位左偏移量:變化如圖 2 所示3.4、列混合( MixColumn )對應元素的乘積之和。的每一列 ( bi,j) 1=0數多項式 a(x) a3x3這個運算需要做m(x) x8x4x3 x 1)。設一個字節(jié)為 b=(b7b6b5b4b3b2b1b0),則b×01'=b;b×02'b×0
7、3'=(b6b5b4b3b2b1b00)+(000b7b70b7b7) ;=b×01'+b×'02'請注意,加法為取模2 的加法,即逐比特異或)一列混合變換是一個替代操作, 是 AES最具技巧性的部分。 它只在 AES的第 0,1, Nr 一 1 輪中使用,在第 N r 輪中不使用該變換。乘積矩陣中的每個元素都是一行和一列在 MixColumns變換中,乘法和加法都是定義在 GF(28 )上的。State,,3 ;J=0, Lb被理解為 GF( 28 )上的多項式,該多項式與常a2x2 a1x a0相乘并模 M (x) x4 1約化。GF(2
8、8 ) 上的乘法。但由于所乘的因子是三個固定的元素 02、03、01,所以這些乘法運算仍然是比較簡單的(注意到乘法運算所使用的模多項式為寫成矩陣形式為 :最后完成的效果如圖:b002 03 01 01a0b101 02 03 01a1b201 01 02 03a2b303 01 01 02a33.5、輪密鑰加( AddRoundKey)Add RoundKey 稱為輪密鑰加變換, 128 位的 State 按位與 128 位的密鑰 XOR: (b0j,b1j,b2j,b3j) (b0j ,b1j,b2j ,b3j ) (k0j ,k1j ,k2j,k3j)對 j=0, ,L-1 輪密鑰加變換很
9、 簡單,卻影響了 State中的每一位。密鑰擴展的復雜性和 AES 的其他階段運算的復雜性, 卻確保了該算法的安全性。最后完成的效果如圖:3.6.逆字節(jié)替換通過逆 S盒的映射變換得到3.7.逆行移位 InvShiftRow與加密時的行移位區(qū)別在于移位方向相反3.8.逆列混淆3.9 加密與解密模式電子密碼本 ECB 模式:ECB 模式是最古老 ,最簡單的模式,將加密的數據分成若干組,每組的大小跟加密密鑰長 度相同;然后每組都用相同的密鑰加密 ,比如 DES 算法,如果最后一個分組長度不夠 64位, 要補齊 64位;定義: Enc(X,Y)是加密函數 Dec(X,Y)是解密函數 Ci ( i =
10、0,1 是n密) 文塊, 大小為 64bit; XOR(X,Y) 是異或運算; IV 是初始向量(一般為 64 位)ECB 加密算法可表 示為:C0 = Enc(Key, XOR(IV, P0)Ci = Enc(Key, XOR(Ci-1, Pi)ECB 解密算法可以表示為:P0 = XOR(IV, Dec(Key, C0)Pi = XOR(Ci-1, Dec(Key,Ci)算法特點 :每次加密的密文長度為 64 位(8 個字節(jié) ); 當相同的明文使用相同的密鑰和初始 向量的時候 CBC 模式總是產生相同的密文 ; 密文塊要依賴以前的操作結果 ,所以,密文塊 不能進行重新排列 ; 可以使用不同
11、的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊 ; 一個錯誤發(fā)生以后 ,當前和以后的密文都會被影響 ;四、實驗方法與步驟4.1 字節(jié)替換SubBytes()變換是一個基于 S 盒的非線性置換,它用于將輸入或中間態(tài)的每一個字 節(jié)通過一個簡單的查表操作, 將其映射為另一個字節(jié)。 映射方法是把輸入字節(jié)的高四位作 為 S 盒的行值,低四位作為列值,然后取出 S 盒中對應的行和列的元素作為輸出。unsigned char subbytes(unsigned char state44)/取出中間態(tài) state映射到 S 盒中的值賦給中間/ 輸出到屏幕顯示 stateprintf(&qu
12、ot;after subbyte:n");態(tài) statefor(i=0;i<4;i+)for(j=0;j<4;j+) stateij=sboxstateij; for(i=0;i<4;i+)for(j=0;j<4;j+)printf("tt%02x ",stateij);printf("n");printf("n");return 0;4.2 行移位ShiftRows()完成基于行的循環(huán)移位操作,變換方法是第 0 行不動,第一行循環(huán)左 移一個字節(jié),第二位循環(huán)左移兩個字節(jié),第三行循環(huán)左移三個字節(jié)。uns
13、igned char shiftrows(unsigned char state44)printf("after shiftrows:n");k=state10;state10=state11;state11=state12;state12=state13; state13=k;k=state20;state20=state22; state22=k;/ 在中間態(tài)的行上,/ 第 0 行不變/ 第一行循環(huán)左移一個字節(jié)/ 第二行循環(huán)左移兩個字節(jié)/ 第三行循環(huán)左移三個字節(jié)k=state21;state21=state23;state23=k;k=state30;state30=s
14、tate33; state33=state32;state32=state31; state31=k;/輸出到屏幕顯示 statefor(i=0;i<4;i+)for(j=0;j<4;j+)printf("tt%02x ",stateij); printf("n");printf("n");return 0;4.3 列混合MixColumns ()實現逐列混合,方法是 s'(x)=c(x)*s(x)mod(x4+1)unsigned char mixcolumns(unsigned char state44) pr
15、intf("after mixcolumns:n");/ 實現 (02 03 01 01) 與中間態(tài) state 分別相乘后異或得 相應值for(i=0;i<4;i+)/(01 02 03 01)/(01 01 02 03)k=state0i; / (03 01 01 02)temp0 =temp1 =state0i state1i state2i state3i ;state0i state1i ; temp1 = xtime(temp1); state0i =temp1 temp0 ;temp1 =state1i state2i ; temp1 = xtime(t
16、emp1); state1i =temp1 temp0 ;temp1 =state2i state3i ; temp1 = xtime(temp1); state2i =temp1 temp0 ;temp1 = state3i k ; temp1 = xtime(temp1); state3i = temp1 temp0 ;/輸出到屏幕顯示 statefor(i=0;i<4;i+)for(j=0;j<4;j+) printf("tt%02x ",stateij); printf("n");printf("n");retur
17、n 0;4.4 輪密鑰加AddRoundKey()用于將輸入或中間態(tài) S 的每一列與一個密鑰字 ki 進行按位異或,每 一個輪密鑰由 Nb 個字組成。unsigned char addroundkey(unsigned char state44,unsigned char w44) printf("addroundkey %d:n",round+);/將中間態(tài) state中的每一列與一個密鑰字 (w44 中的一列 )進行按位異或 for(i=0;i<4;i+)/ 完了又賦值給 statefor(j=0;j<4;j+) stateij=wij;for(i=0;i&
18、lt;4;i+)/輸出到屏幕顯示出來 statefor(j=0;j<4;j+)printf("tt%02x ",stateij);printf("n"); printf("n");return 0;4.5 密鑰擴展通過生成器產生 Nr+1 個輪密鑰,每個輪密鑰由 Nb 個字組成,共有 Nb(Nr+1 )個字。 在加密過程中,需要 Nr+1 個輪密鑰,需要構造 4(Nr+1)個 32 位字。首先將輸入的 4 個字節(jié)直接復制到擴展密鑰數組的前 4 個字中,得到 W0,W1,W2,W3; 然后每次用 4 個字填充擴展密鑰數余下的部分。
19、/keyexpandprintf("after keyexpand:n");for(i=4;i<8;i+)if(i%4=0) rotword0=w1i-1;rotword1=w2i-1;rotword2=w3i-1;rotword3=w0i-1;printf("rotword():");for(j=0;j<4;j+) printf("%02x ",rotwordj);for(j=0;j<4;j+)subwordj=sboxrotwordj;printf("nsubword():");for(j=0
20、;j<4;j+) printf("%02x ",subwordj);for(j=0;j<4;j+)rconj=subwordj RconNj ;printf("after Rcon():");for(j=0;j<4;j+) printf("%02x ",rconj);for(j=0;j<4;j+)wji%4=rconj wji-4 ;printf("w%d :",count);for(j=0;j<4;j+) printf(" %02x ",wji%4) ; coun
21、t+;printf("nn");printf("nn");elsefor(j=0;j<4;j+) wji%4=wji%4wj(i%4)-1;printf("w%d :",count);for(j=0;j<4;j+) printf(" %02x ",wji%4); count+;printf("nn");printf(" 密鑰擴展 Round key:n");for(i=0;i<4;i+)for(j=0;j<4;j+) printf("tt%0
22、2x ",wij);printf("n");printf("n");4.6 逆字節(jié)替換與字節(jié)代替類似,逆字節(jié)代替基于逆 S 盒實現。 unsigned char InvSubbytes(unsigned char state44) for(i=0;i<4;i+)for(j=0;j<4;j+)/基于逆 S 盒的映射替代 stateij = rsboxstateij; printf("after InvSubbyte:n");for(i=0;i<4;i+)/輸出到屏幕顯示 statefor(j=0;j<4
23、;j+) printf("tt%02x ",stateij); printf("n");printf("n");return 0;4.7 逆行移位與行移位相反,逆行移位將態(tài) state 的后三行按相反的方向進行移位操作,即第 0 行 保持不變,第 1行循環(huán)向右移一個字節(jié), 第 2行循環(huán)向右移動兩個字節(jié), 第 3行循環(huán)向右 移動三個字節(jié)。unsigned char InvShiftRows(unsigned char state44) k=state13;state13=state12;state12=state11;state11=s
24、tate10;state10=k;k=state20;state20=state22;state22=k;/對中間態(tài) state進行移位操作/ 第 0 行保持不變/ 第 1 行循環(huán)右移一個字節(jié)/ 第 2 行循環(huán)右移兩個字節(jié)/ 第 3 行循環(huán)右移三個字節(jié)k=state21;state21=state23;state23=k;k=state30;state30=state31;state31=state32;/輸出到屏幕顯示 statestate32=state33; state33=k; printf("after InvShiftRows:n"); for(i=0;i<
25、;4;i+)for(j=0;j<4;j+) printf("tt%02x ",stateij); printf("n");printf("n");return 0;4.8 逆列混合逆列混淆的處理辦法與 MixColumns( )類似,每一列都通過與一個固定的多項式 d(x) 相乘進行交換。unsigned char InvMixColumns(unsigned char state44) printf("after InvMixColumns :n");/實現(0e 0b 0d 09)與中間態(tài) state分別
26、相乘后異或得相應 值(09 0e 0b 0d)(0d 09 0e 0b)(0b 0d 09 0e)for(i=0;i<4;i+) / temp0 = state0i; / temp1 = state1i; / temp2 = state2i; temp3 = state3i;for(i=0;i<4;i+)for(j=0;j<4;j+)printf("tt%02x ",stateij); printf("n"); printf("n");return 0;/ 輸出到屏幕顯示 statestate0i = Multipl
27、y(temp0,0x0e) Multiply(temp1,0x0b) Multiply(temp2, 0x0d) Multiply(temp3, 0x09); state1i = Multiply(temp0,0x09) Multiply(temp1,0x0e) Multiply(temp2, 0x0b) Multiply(temp3, 0x0d); state2i = Multiply(temp0,0x0d) Multiply(temp1,0x09) Multiply(temp2, 0x0e) Multiply(temp3, 0x0b); state3i = Multiply(temp0,0
28、x0b) Multiply(temp1,0x0d) Multiply(temp2, 0x09) Multiply(temp3, 0x0e); 4.9 加密加密部分我分了兩種情況, 一種是自動檢查加密程序的正確性, 之前在程序里給明文 和密鑰賦上初值,運行程序檢驗結果是否正確;另一種是用戶手動輸入32 位的十六進制數,進行加密,我是把每一具體項模塊化, 將功能在每個具體模塊中實現, 只需要直接調 用,視覺效果強,一目了然。下面是實現加密功能一些關鍵代碼void AES_encrypt(unsigned char StateN, unsigned char RoundKeyN)message16=
29、0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x 37,0x07,0x34;key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4 f,0x3c;for(i=0;i<4;i+) for(j=0;j<4;j+) / 分別獲取明文和密鑰 stateji=messagem;wji=keym;m+; . addroundkey(state,w);for(round=2;round<11;round
30、+) printf(" 第 %d 輪加密 : n",round);subbytes(state);shiftrows(state); mixcolumns(state);keyexpand(w, round); addroundkey(state,w); subbytes(state);/ 最后一輪shiftrows(state);keyexpand(w, 10); addroundkey(state,w);4.10 解密AES 解密我也是分成了兩個部分,第一部分是在程序中對密文和密鑰賦初值,通過 與標準對照檢查解密過程的正確性; 第二部分是用戶手動輸入密文和密鑰, 程序對
31、其進行 解密,得到最后的明文。解密過程基本如下:1)獲取輸入的明文和密鑰2)通過密鑰擴展過程獲取各輪密鑰3)輪密鑰加變換過程4)逆行移位5)逆字節(jié)替代 6)輪密鑰加變換7)逆列混淆47 步共 9 次循環(huán),最后一輪實現 46 步,完成解密過程。 主要代碼如下:void AES_decrypt(unsigned char StateN, unsigned char wN) key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x 4f,0x3c;cipher16=0x39,0x25,0x84,0x1
32、d,0x02,0xdc,0x09,0xfb,0xdc,0x11,0x85,0x97,0x19,0x6a, 0x0b,0x32;printf("%02x ",keyi);printf("n");/獲取密文和密鑰for(i=0;i<4;i+) for(j=0;j<4;j+) stateji=cipherm;wji=keym;m+;Keyexpand(w,round ); /獲得密鑰擴展列表 AddRoundKey(State, w); /首輪 for (i = 9; i > 0; i -) /1-9 輪 InvShiftRows(state
33、);InvSubbytes(state);Keyexpand(w,round );AddRoundKey(State, w);InvMixColumns(State);InvShiftRows(State); /最后一輪InvSubBytes(State);Keyexpand(w,0 );AddRoundKey(State, w);五、實驗結果與數據處理 實驗結果截圖:六、實驗心得這次課程設計我最大的收獲就是凡事都要自己動手去做, 有些事情自己不做, 什么都 不會,有畏懼感,膽怯,始終把事情放在那,就形成惡性循環(huán),這樣子一直都做不來,一 直都不會有進步, 所以不管什么事情都要親自去嘗試一下,
34、難易程度自己感知, 不要聽信 他人的謠言,或者誤導。還有就是,做代碼的時候查閱了相關的書籍,很雜很亂,這對于選擇有用的材料, 有價值的材料進行使用,會提高效率,最開始各種涉獵,很多,但是實用的卻沒有多少, 白白耽誤了很多時間。我覺得還是首先了解全局,了解總體,高屋建瓴,做好準備工作, 寫好報告,把每個過程搞懂了,才能動手去寫代碼,連基本的理論都不懂,就去操作,實 在是慢,當然在了解的基礎上,也要去實踐, 去檢驗自己的做法是否是對的, 不能光搞理 論,計算機是一個動手就得答案的科學,多檢驗,多算,多觀察。這樣子影響更深,更不 會忘,一輩子的經驗,自己動手得到的答案,遠比查閱資料了解來的有意義,有
35、效果。在寫代碼的時候參考了一些參考資料, 發(fā)現一些牛人寫的代碼簡介, 精煉,確實讓人 敬佩,我用很多行代碼實現的功能, 別人兩三句循環(huán)就解決了, 主要是平時沒怎么編寫代 碼,沒有經驗,還是要多寫代碼,多領悟,才能有他們的成就。而且我簡介的代碼都是很 好的數學算法, 我學的數學沒怎么用在這個上面, 不能直接用最低級的算法, 最普通的算 法,這樣子永遠不能簡化,要簡化就要用一些數學算法,下標改變啊, 循環(huán)啊啥的這些可 以實現意想不到的效果,實現功能和簡介的雙重母的。多實踐! 綜合實驗 二 RSA 加密算法的實現一、實驗目的及要求通過編程實現 RSA的加密和解密過程,加深對公鑰(非對稱)密碼算法的認識二、所用儀器、設備計算機、 Visual C#軟件。三、實驗原理1. RSA 算法是第一個能同時用于加密和數字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法, 從提出到現在已近二十年, 經歷了各種攻擊的考驗, 逐漸 為人們接受,普遍認為是目前最優(yōu)秀的公鑰方案之一。 RSA的安全性依賴于大數的因子分 解,但并沒有從理論上證明破譯 RSA的難度與大數分解難度等價。2. RSA 的安全性依賴于大數分解。公鑰和私鑰都是兩個大素數(大于 100 個十進制位)的函數。據猜測,從一個密鑰和密文推斷出明文的難度等同于分解兩個大素數的積。3. 密鑰對的產生。選擇兩個大素數, p 和 q 。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【大學課件】土木工程概論 土木工程材料
- 《莫言英文簡介》課件
- 單位人力資源管理制度匯編大全十篇
- 甘肅省武威市涼州區(qū)2024-2025學年高一上學期期末考試歷史試卷(含答案)
- 單位管理制度收錄大合集【職工管理篇】
- 【課件】大學課程演進的回顧與展望
- 學校傳染病預防管理實務
- 泵電機項目可行性研究報告(立項備案申請范文)
- 達州關于成立undefined公司可行性報告
- 設備工程師述職報告11
- 2024年高壓電工證理論考試題庫(含答案)
- 2023-2024學年仁愛版七上期末考試英語(試題)
- 無人機表演服務合同
- 2024年醫(yī)院培訓計劃
- 呼吸內科臨床診療指南及操作規(guī)范
- 學生管理教育課件
- 物業(yè)經理轉正述職
- 貿易崗位招聘面試題及回答建議(某大型國企)2025年
- 世界職業(yè)院校技能大賽高職組“關務實務組”賽項參考試題及答案
- 高中歷史教師資格考試面試試題及解答參考(2024年)
- 銀行貸款房產抵押合同樣本
評論
0/150
提交評論