




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、密碼學課程設計實驗報告實驗題目:文件加密/解密系統(tǒng)實驗任務書課程設計題目文件加密/解密系統(tǒng)人數(shù)1學時2周設計目的、任務和要求設計目的:本課程設計力求為學生提供一個理論聯(lián)系實際的機會。通過實踐,建立密碼學理論的整體思想,鍛煉編寫、調(diào)試程序的能力,學習文檔編寫規(guī)范,培養(yǎng)獨立學習、吸取他人經(jīng)驗、探索前沿知識的習慣,樹立團隊協(xié)作精神。同時,課程設計可以充分彌補課堂教學及普通實驗中知識深度與廣度有限的缺陷,更好地幫助學生從全局角度把握課程體系。設計任務:(1)在深入理解DES或AES加密/解密算法理論的基礎上,設計一個DES或AES加密/解密軟件系統(tǒng);(2)加/解密過程可用分組密碼運行模式中的任一種模式
2、;(3)完成一個明文分組的加解密,明文和密鑰可以是二進制,十六進制或者ASCII碼。進行加密后,能夠進行正確的解密;(4)提供良好的用戶界面;(5)要求提供所設計系統(tǒng)的報告及完整的軟件。設計的方法和步驟第一步:進行系統(tǒng)設計;第二步:代碼編碼;第三步:對實現(xiàn)部分的軟件功能或者模塊進行測試 第四步:提交完整可執(zhí)行軟件,準備答辯;第五步:答辯,演示軟件,教師根據(jù)實際情況提出測試用例,學生作最后的修改和完善,教師對軟件運行部分進行評分;第六步:完成課程設計報告并提交。設計工作計劃1. 本次課程設計的時間是2周,工作計劃如下:2. 任務書下達,理解選題,明確軟件功能,分析和設計:2天;3. 分析和設計報
3、告的撰寫:1天4. 實現(xiàn)部分設計及文檔編寫;1天;5. 編碼及調(diào)試:4天;6. 報告完善及打?。?天;7. 成果提交和驗收:1天。主要參考資料1、 陳魯生、沈世鎰現(xiàn)代密碼學(2) 北京:科學出版社,2008年2、 Michael Welschenbach編著,趙振江,連國卿等譯,編碼密碼學加密方法的C與C+實現(xiàn),電子工業(yè)出版社,2003年6月;3、 教研室簽字: 年 月 日學院簽字: 年 月 日第一章、AES加密解密原理由于DES已經(jīng)無法滿足高保密性的要求,美國于1997年1月開始征集新一代數(shù)據(jù)加密標準(即高級數(shù)據(jù)加密標準,Advanced Encryption Standard,AES)。2
4、000年10月2日,正式宣布選擇比利時密碼學家所開發(fā)的Rijndael算法成為AES的最終算法。AES(The Advanced Encryption Standard)是美國國家標準與技術(shù)研究所用于加密電子數(shù)據(jù)的規(guī)范。它被預期能成為人們公認的加密包括金融、電信和政府數(shù)字信息的方法。AES 是一個新的可以用于保護電子數(shù)據(jù)的加密算法。明確地說,AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入 數(shù)據(jù)相
5、同。迭代加密使用一個循環(huán)結(jié)構(gòu),在該循環(huán)中重復置換(permutations )和替換(substitutions)輸入數(shù)據(jù)。1.1AES算法設計及性能研究現(xiàn)狀:目前在理論上對于AES算法的研究主要集中在算法設計和性能分析上。1.1.1算法設計主要研究算法設計遵循的原則和整體結(jié)構(gòu)。研究算法設計的目的一方面為性能分析提供了一條途徑,從算法的結(jié)構(gòu)上分析算法性能是簡單有效的,研究算法整體結(jié)構(gòu)上的缺陷為提出新的密碼分析方法提供新的手段。另一方面,研究AES的算法設計對研發(fā)新的分組密碼提供了設計原則和參考。目前分組數(shù)據(jù)加密算法的整體結(jié)構(gòu)有兩大類:Festiel網(wǎng)絡、非平衡網(wǎng)絡和SP網(wǎng)絡。作為AES選擇的R
6、ijndael算法遵循分組密碼的安全性和實現(xiàn)性原則,在整體結(jié)構(gòu)上采用的是SP網(wǎng)絡結(jié)構(gòu)。1.1.2 性能分析主要研究算法的各項特性,主要可以分為實現(xiàn)分析和密碼分析兩類。(1)實現(xiàn)分析主要研究AES算法可實現(xiàn)的能力,即算法的實現(xiàn)性分析。當前實現(xiàn)性分析主要集中在AES的硬、軟件實現(xiàn)的難易度和實現(xiàn)算法的效率等領域中。(2)密碼分析主要研究AES算法抵抗現(xiàn)有己知密碼攻擊的能力,即算法的安全性分析。除此之外,由于S-盒是AES算法的唯一非線性變換器件,S-盒的性能在很大程度上決定了AES算法的安全性。因此,出現(xiàn)了許多分析和研究S-盒代數(shù)性質(zhì)的研究成果。在這些成果中分析了S-盒的代數(shù)特征或是表達S-盒的線性
7、方程組,以達到求解S-盒或是研究S-盒安全性的目的。1.2AES算法基礎:1.2.1AES算法的數(shù)學基礎定義一 一個由b7b6b5b4b3b2b1b0組成的字節(jié)b可表示成系數(shù)為0,1的二進制多項式b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x1+b0x0定義二 在GF(28)上加法的定義為二進制多項式的加法,且其系數(shù)模2。定義三 在GF(28)上乘法(用符號·表示)定義為二進制多項式的乘積模一個次數(shù)為8的不可約多項式.此不可約多項式為(十六進制為11B)m(x) = x8+x4+x3+x+1上面定義的乘法在GF(28)上滿足結(jié)合律,且有一個本原元(01)。例如:(
8、57)16(83)16 = (x6+x4+x2+x+1)( x7+x+1) =x13+x11+x9+x8+x7+x7+x5+x3+x2+x+x6+x4+x2+x+1 = (x13+x11+x9+x8 +x6+x5+ x4+x3 +x+1) mod (x8+x4+x3+x+1) = x7+x6+1 = (C1) 16定義四 在GF(28)上的二進制多項式b(x)的乘法逆為滿足下面方程式的二進制多項式a(x),記為b-1(x).a(x)b(x) mod m(x) = 1.b-1(x) = a(x) mod m(x).00除外,00的逆元還是00。定義五 GF(28)上的多項式加法定義為相應項系數(shù)相
9、加。因為在域GF(28)上的加是簡單的按位異或,所以在域GF(28)上的兩向量的加也就是簡單的按位異或.定義六 GF(28)上的多項式a(x) = a3x3+a2x2+a1x1+a0x0 和b(x) = b3x3+b2x2+b1x1+b0x0 相乘模x4 + 1 的積(表示為c(x) = a(x)b(x)為c(x) = c3x3+c2x2+c1x1+c0x0,其系數(shù)由下面4個式子得到:c0 = a0·b0a3 ·b1a2· b2a1 ·b3 ,c1 = a1·b0a0 ·b1a3· b2a2 ·b3 ,c2 = a
10、2·b0a1 ·b1a0· b2a3 ·b3 ,c3 = a3·b0a2 ·b1a1· b2a0 ·b3 ,利用定義六,有x×b(x) = b2x3+b1x2+b0x1+b3。如果再與x相乘后模x4+1,得b1x3+b0x2+b3x1+b2,由此可得:多項式每乘上一次x的運算結(jié)果,相當于多項式系數(shù)的一次左移操作。1.2.2 密碼算法的設計準則關于實用密碼的兩個一般的設計原則是Shannon提出混亂原則和擴散原則:混亂原則:人們所設計的密碼應使得密鑰和明文以及密文之間的信賴關系相當復雜以至于這種信賴性對密碼
11、分析者來說是無法利用的。擴散原則:人們所設計密碼應使得密鑰的每一位數(shù)字影響密文的多位數(shù)字以防止對密鑰進行逐段破譯,而且明文的每一位數(shù)字也影響密文的多位數(shù)字以便隱蔽明文數(shù)字的統(tǒng)計特性。Rjindael算法的設計原則:Joan Daemen和Vincent Rijmen在設計Rijndael算法時主要考慮了以下三點:1.要能抵抗現(xiàn)在所有的已知密碼攻擊;2.在各種平臺上都應具有良好的性能;3.設計要簡單。從以上三點可看出Rijndael算法在設計時遵循了安全性原則和易實現(xiàn)性原則。算法整體結(jié)構(gòu)的精心設計確保了算法的安全性、簡單性和對稱性,確保了算法的易實現(xiàn)性。為使密碼算法能抵抗對密鑰的強力攻擊,必須保
12、證密鑰長度盡可能大。密鑰長度要求至少128bist。另外為阻止對分組密碼進行統(tǒng)計分析,分組長度必須足夠大,使得對密文進行頻率統(tǒng)計分析計算上不可行。1.2.3 AES算法的整體結(jié)構(gòu)Rjindael采用的是代替/置換網(wǎng)絡,即SP結(jié)構(gòu)。每一輪有三層組成:P層為線性層,它包括ShiftRows變換(行移變換)和MixColumns變換(列混合變換),線性混合層確保多輪之上的高度擴散;S層為非線性層,由一個SubBytes變換組成,具體由非線性S-盒構(gòu)成,起到混淆作用;密鑰加層由AddRuondKey變換組成,將子密鑰簡單異或到中間狀態(tài)上,實現(xiàn)密鑰與明、密文的結(jié)合。(1) S層設計AES 定義了一個 S
13、 盒,State 中每個字節(jié)按如下方式映射為一個新的字節(jié):把該字節(jié)的高 4 位作為行值,低4 位作為列值,然后取出 S 盒中對應行和列的元素作為輸出。S 盒是一個由 16×16 字節(jié)組成的矩陣,包含了 8 位值所能表達的256種可能的變換。S盒按以下方式構(gòu)造: 逐行按升序排列的字節(jié)值初始化 S 盒。第一行是 00,01,02,0F ;第二行是 10,11, 1F 等。在行 x 和列 y 的字節(jié)值是 xy。把 S 盒中的每個字節(jié)映射為它在有限域GF(28)中的逆。GF 代表伽羅瓦域,GF(28)由一組從0×00 到0×ff的 256個值組成,加上加法和乘法。GF(2
14、8)=Z2X/( x8+x4+x3+x+1)。00 被映射為它自身 00。把 S 盒中的每個字節(jié)記成(b7,b6,b5,b4,b3, b2,b1,b0)。對 S 盒中每個字節(jié)的每位做如下矩陣方式所描述變換:1.2.4 P層設計P層也稱為線性層,包括 ShiftRows和MixColumns變換,其目的是提供雪崩效應,從而起到擴散作用。MixColumns變換將狀態(tài)陣列中的一個字節(jié)擴散到該字節(jié)所在列的每個字節(jié)中,ShiftRows變換則將原來處在同一列上的字節(jié)擴散到不同的列中。Rjindael算法P層的設計起到了很好的擴散作用,提高了抵抗差分密碼攻擊能力,這種設計同時也可有效抗擊截短差分攻擊和S
15、quare攻擊。1.2.5 密鑰加層設計輪函數(shù)實現(xiàn)的功能是把輪密鑰加到狀態(tài)中去。它執(zhí)行了16個并行的把密鑰加到狀態(tài)中的運算。加法是通過異或運算來完成的:13AES部分算法優(yōu)化目前提升輪變換執(zhí)行效率的方法主要是利用查表和簡單的移位異或操作來簡化原有算法中的一些復雜運算,如矩陣運算和乘法運算。最為典型的就是在進行輪變換之前將用于字節(jié)替換變換的S-盒計算出來并存儲到一個二維數(shù)組中,當在進行字節(jié)替換變換時直接從這個數(shù)組中查找到相應的字節(jié)數(shù)據(jù)來替換原來狀態(tài)矩陣中的字節(jié)數(shù)據(jù)。這就將字節(jié)替換原來算法中的乘法求逆和仿射運算轉(zhuǎn)變?yōu)橐粋€簡單的查表操作。雖然這要求在輪變換前要花費一定的時間和存儲空間來計算和存儲S-
16、盒,但與原算法相比起來,優(yōu)化后的算法實現(xiàn)變得相對簡單,其執(zhí)行的效率也大大提高。在輪變換的過程中,行移位變換只改變字節(jié)數(shù)據(jù)在狀態(tài)矩陣中的位置,并不改變字節(jié)數(shù)據(jù)的值;而字節(jié)替換變換只根據(jù)S-盒對字節(jié)數(shù)據(jù)進行一一對應的替換,與字節(jié)數(shù)據(jù)所在的位置無關。所以,這兩個變換層的順序可以調(diào)換,且對于加密算法并沒有什么影響。這兩層順序調(diào)換之后,可以方便的將字節(jié)替換變換和列混合變換并作一步,通過查表的方法來代替原來算法中的矩陣乘法的操作,得到變換后的結(jié)果。在這種優(yōu)化的方法中,將以列為單位進行變換。第二章、AES算法描述:2.1 狀態(tài)、密鑰、算法輪數(shù)Rjindael算法是一個數(shù)據(jù)塊長度和密鑰長度都可變的迭代分組加密
17、算法,數(shù)據(jù)塊長度和密鑰長度可以為128、192、256位。在加密前對數(shù)據(jù)塊做預處理。首先,把數(shù)據(jù)塊寫成字的形式,每個字包含4個字節(jié)。其次,把字記為列的形式(如下圖):AES把128位的輸入看作是一個由16個字節(jié)組成的向量,并用一個4×4的列矩陣的形式來組織,叫做“狀態(tài)”(state)。按同樣的方式組織密鑰,得到一個k矩陣:我們用Nb表示一個數(shù)據(jù)塊中字的個數(shù)(列的個數(shù)),那么Nb=4,6或8;用Nk表示密鑰中字的個數(shù)(列的個數(shù)),那么Nb=4,6或8。算法輪數(shù)Nr由Nb和Nk共同決定:NrNb = 4Nb = 6Nb = 8Nk = 4101214Nk = 6121214Nk = 81
18、414142.2 非線性混合層的S變換字節(jié)代換(ByteSub)是作用在字節(jié)上的一種非線性變換,這個變換(或稱S-box)是可逆的。它由以下兩個部分組成:a 把字節(jié)的值用它的乘法逆代替;b 把經(jīng)過a處理后的字節(jié)進行如下定義的仿射變換乘法取逆運算為: b(x)=a(x) mod m(x) (定義四)其中m(x) = x8+x4+x3+x+1,當a(x) = 0時,其逆元素也為0。下面是進行逆仿射運算的仿射變換矩陣:其中bi是bi在GF(28)上的乘法逆。2.3 P層的行移位和列混合描述行移位根據(jù)不同的分組長度做相應的循環(huán)移位運算,加密算法的行移位過程如圖所示:在加密過程中,狀態(tài)矩陣中的后三行要按
19、字節(jié)進行左移位。在解密過程中,則要進行逆行移位,即將狀態(tài)矩陣中的后三行按字節(jié)進行右移位。下表給出了在不同的情況下移位的次數(shù)。即在后三行的第1行要移位C1字節(jié),第2行要移位C2字節(jié),第3行要移位C3字節(jié)。NbC1C2C3412361238134行移位后所得的狀態(tài)矩陣還要進行列混合,加密算法的列混合過程如圖所示。在列混合變換時,把狀態(tài)矩陣的一列看作在GF(2)上的多項式,與一個常數(shù)多項式c (x)相乘并模X4+l后得到的結(jié)果。其中:利用列混合可以使第一列的第一個字節(jié)與該列中的其他任一字節(jié)相互作用,而行移位則可以使第一輪中的其他字節(jié)互相混合,由此經(jīng)過多輪運算可以達到相當強的擴散作用。2.4 密鑰加層
20、描述密鑰加是負責把輪密鑰加入到狀態(tài)中去,簡單地使用異或運算即可得到。輪密鑰可以通過密鑰調(diào)度得到。2.5 密鑰調(diào)度密鑰調(diào)度包括密鑰編制和密鑰選擇兩部分。并且遵循一下原則:2.5.1 輪密鑰的比特總數(shù)為數(shù)據(jù)塊長度與輪數(shù)加1的積:Nk*4*8*(Nr+1);2.5.2 種子密鑰編制為擴展密鑰,種子密鑰長度為4* Nk個字節(jié);2.5.3 輪密鑰由以下方法從擴展密鑰中獲得:對第1輪密鑰由前Nb個字構(gòu)成;第2輪密鑰由第二個Nb個字即第Nb+1個字到第2Nb個字構(gòu)成,以下依次類推。AES算法利用外部輸入密鑰K(密鑰串的字數(shù)為Nk) ,通過密鑰擴展程序得到共4 (Nr + 1) 字的擴展密鑰w4 *(Nr +
21、 1) 。涉及如下三個模塊:(1)位置變換RotWord (),把一個四個字節(jié)的序列a0,a1,a2,a3 左移一個字節(jié)變?yōu)?a1,a2,a3,a0。(2) SubWord ( ),對一個四字節(jié)的輸入字a0,a1,a2,a3的每一個字節(jié)進行S盒變換,然后作為輸出。(3) 變換 Rcon ,對輪常數(shù)的定義為: Rconi=(Rci,00,00,00);而Rci表示在有限域GF(28)中xi-1的值,即:Rcl=1(即01);Rci=x·(Rci-1)= xi-1 (即02·(Rci-l)。/*用于密鑰調(diào)度的Rcon表*/static const unsigned char r
22、con 10 = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0X36(4)擴展密鑰的生成:擴展密鑰的前Nk個字就是外部密鑰 K;以后的字w i 等于它前一個字wi-1與前第Nk個字wi-Nk的異或 ,即w i = wi-1 XOR wi-Nk。但是若i 為Nk 的倍數(shù) , 則wi = wi-Nk XOR SubWord(RotWord (wi-1)XOR Rcon i/Nk。2.6 加密算法AES加密算法由初始輪密鑰加層和Nr輪的輪變換組成它的輸入為初始狀態(tài)陣列和輪密鑰,執(zhí)行加密算法后產(chǎn)生一個輸出狀態(tài)陣列,輸入明文和輸出密文均為128比特2.7
23、解密算法解密算法的結(jié)構(gòu)與加密算法的結(jié)構(gòu)相同,其中的變換為加密算法變換的逆變換,且使用了一個稍有改變的密鑰編制。第三章、AES算法的實現(xiàn):3.1 AES算法的流程圖S盒置換明文分組數(shù)據(jù)X與原始密鑰K1異或(XK1)行變換列混淆與子密鑰Ki異或(XKi)S盒置換行變換與子密鑰Kr+1異或(XKi+1)加密分組數(shù)據(jù)加密分組數(shù)據(jù)與子密鑰Kr+1異或(XKi+1)與子密鑰Ki異或(XKi)反行變換反S盒置換反行變換反列混淆反列混淆與原始密鑰K1異或(XK1)解密分組數(shù)據(jù)XAES加解密算法流程圖void aes:jiemi(unsigned char ming44,unsigned char me44)i
24、nput(me);int i=Nr;AddRoundKey(i);for(i=Nr-1;i>=1;i-)InvShiftRows();InvSubBytes();AddRoundKey(i);InvMixColumns();InvShiftRows();InvSubBytes();AddRoundKey(i);output(ming);3.2 程序中各變換表的說明3.2.1 S-盒和逆S-盒變換表將用于字節(jié)替換變換的S-盒計算出來并存儲到一個二維數(shù)組中,當在進行字節(jié)替換變換時直接從這個數(shù)組中查找到相應的字節(jié)數(shù)據(jù)來替換原來狀態(tài)矩陣中的字節(jié)數(shù)據(jù)。同理可將逆S-盒也計算出來存儲在數(shù)組里。用于加
25、密的S-盒的定義如下:用于解密的逆S-盒的定義如下:3.3 密鑰擴展模塊的實現(xiàn)void aes:KeyExpansion(unsigned char keyNk_max) unsigned char t4;int i=0,j=0;for( i=0;i<4;i+)for( j=0;j<Nk;j+)Keyij=keyij;i=0;j=0;while(i<Nk)KeyExp0i=Key0i;KeyExp1i=Key1i;KeyExp2i=Key2i;KeyExp3i=Key3i;i+;while(i<Nb*(Nr+1)int row=0;t0=KeyExp0i-1;t1=Ke
26、yExp1i-1;t2=KeyExp2i-1;t3=KeyExp3i-1;if(i%Nk=0)RotWord(t);for(row=0;row<4;row+)trow=SboxHIGH4(trow)LOW4(trow);trow=trowRconi/Nkrow;else if(Nk>6 && i%Nk=4)for(row=0;row<4;row+)trow=SboxHIGH4(trow)LOW4(trow);for(row=0;row<4;row+)KeyExprowi=KeyExprowi-Nktrow;i+;5.3 加密模塊的實現(xiàn)void aes:j
27、iami(unsigned char ming44,unsigned char me44)input(ming);int i=0;AddRoundKey(i);for(i=1;i<=Nr-1;i+)SubBytes();ShiftRows();MixColumns();AddRoundKey(i);SubBytes();ShiftRows();AddRoundKey(i);output(me);5.4解密模塊的實現(xiàn)oid AES:DecryptionProcess() / 解密過程 InitialState(cipherText); KeyExpansion(); InvFinalRou
28、nd(); for(int i = N_ROUND-2; i >0 ; -i) InvRound(i); AddRoundKey(0); InitialplainText();六、算法測試及分析:6.1 正確性測試本程序采用動態(tài)加密,要求輸入加密明文(16位)和加密密鑰(16位)后即可得到加密后的密文。程序啟動界面如圖:6.1.1字符串加解密測試輸入1后,輸入16位的待加密明文,然后再輸入不超過16位的加密密鑰,按下回車,即可得到加密結(jié)果如下:解密后的結(jié)果如圖所示:關于對話框:幫助對話框:七總結(jié) 通過本次課程設計,對AES加密解密算法有了更深的主任認識,同時也提高了自己的動手能力,對MF
29、C編程有了一定的了解,在做課程設計的過程中也遇到了一些問題,在老師的幫助下得到了解決,很欣慰。不足之處由于初次寫MFC所以界面等設計的不是很好,以后會加強這方面的學習。源代碼如下:/ AES.h: interface for the AES class./#if !defined(AFX_AES_H_E7A55E4B_8EAF_4FAE_B547_3829CB5B5130_INCLUDED_)#define AFX_AES_H_E7A55E4B_8EAF_4FAE_B547_3829CB5B5130_INCLUDED_#define N_ROUND 11#define KEY_SIZE 16#
30、if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include<iostream>#include<bitset>#include <utility>using namespace std;class AES public: typedef unsigned char byte; /static const int KEY_SIZE;/; = 16; / 密鑰長度為位/ static const int N_ROUND ;/= 11; byte plainText16; / 明文 by
31、te state16; / 當前分組。 byte cipherKey16; / 密鑰 byte roundKeyN_ROUND16; /輪密鑰 byte cipherText16; /密文 byte SBox1616; / S盒 byte InvSBox1616; / 逆S盒 void EncryptionProcess() / 加密過程 InitialState(plainText); KeyExpansion(); / 密鑰擴展 AddRoundKey(0); / 輪密鑰加 for(int i = 1; i < N_ROUND-1; +i) Round(i); FinalRound(
32、); InitialCipherText();void DecryptionProcess() / 解密過程 InitialState(cipherText); KeyExpansion(); InvFinalRound(); for(int i = N_ROUND-2; i >0 ; -i) InvRound(i); AddRoundKey(0); InitialplainText();void Round(const int& round) / 正常輪 SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); voi
33、d InvRound(const int& round) / 正常輪的逆 AddRoundKey(round); InvMixColumns(); InvShiftRows(); InvSubBytes(); void FinalRound() / 最后輪 SubBytes(); ShiftRows(); AddRoundKey(N_ROUND - 1);void InvFinalRound() / 最后輪的逆 AddRoundKey(N_ROUND - 1); InvShiftRows(); InvSubBytes(); void KeyExpansion() / 密鑰擴展 cons
34、t byte rconN_ROUND4 = 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 ; for(int ii =
35、0; ii < 16; +ii) roundKey0ii = cipherKeyii; for(int i = 0; i < 4; +i) / roundKey016為cipherKey的轉(zhuǎn)置矩陣 for(int j = 0; j < 4; +j) roundKey04*i + j = cipherKey4*j + i; for(int roundIndex = 1; roundIndex < N_ROUND; +roundIndex) byte rotWord4 = 0x00; rotWord0 = roundKeyroundIndex - 13; rotWord1
36、= roundKeyroundIndex - 17; rotWord2 = roundKeyroundIndex - 111; rotWord3 = roundKeyroundIndex - 115; std:swap<byte>(rotWord0, rotWord1); std:swap<byte>(rotWord1, rotWord2); std:swap<byte>(rotWord2, rotWord3); for(int i = 0; i < 4; +i) rotWordi = SBox rotWordi >> 4 rotWordi
37、 & 0x0f ; roundKeyroundIndex4*i = roundKeyroundIndex - 14*i rotWordi rconroundIndexi; for(int j = 1; j < 4; +j) for(int i = 0; i < 4; +i) roundKeyroundIndex4*i + j = roundKeyroundIndex - 14*i + j roundKeyroundIndex4*i + j - 1; void AddRoundKey(const int& round) / 輪密鑰加 for(int i = 0; i
38、< 16; +i) / 利用當前分組state和第round組擴展密鑰進行按位異或 statei = roundKeyroundi; void SubBytes() / 字節(jié)代換 for(int i = 0; i < 16; +i) statei = SBox statei >> 4 statei & 0x0f ; void InvSubBytes() / 逆字節(jié)代換 for(int i = 0; i < 16; +i) statei = InvSBox statei >> 4 statei & 0x0f ; void ShiftRow
39、s() / 行變換 /state第一行保持不變 / Do nothing. /state第二行循環(huán)左移一個字節(jié) std:swap<byte>(state4, state5); std:swap<byte>(state5, state6); std:swap<byte>(state6, state7); /state第三行循環(huán)左移兩個字節(jié) std:swap<byte>(state8, state10); std:swap<byte>(state9, state11); /state第三行循環(huán)左移三個字節(jié) std:swap<byte
40、>(state14, state15); std:swap<byte>(state13, state14); std:swap<byte>(state12, state13); void InvShiftRows() / 行變換反演 /state第一行保持不變 / Do nothing. /state第二行循環(huán)右移一個字節(jié) std:swap<byte>(state6, state7); std:swap<byte>(state5, state6); std:swap<byte>(state4, state5); /state第三
41、行循環(huán)右移兩個字節(jié) std:swap<byte>(state9, state11); std:swap<byte>(state8, state10); /state第三行循環(huán)右移三個字節(jié) std:swap<byte>(state12, state13); std:swap<byte>(state13, state14); std:swap<byte>(state14, state15); void MixColumns() / 列混淆 byte matrix44 = 0x02, 0x03, 0x01, 0x01, 0x01, 0x02
42、, 0x03, 0x01, 0x01, 0x01, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02; const byte* temp = GFMultplyBytesMatrix(byte*)matrix, state); for(int i = 0; i < 16; +i) statei = tempi; / delete temp;void InvMixColumns() / 列混淆反演 byte matrix44 = 0x0e, 0x0b, 0x0d, 0x09, 0x09, 0x0e, 0x0b, 0x0d, 0x0d, 0x09, 0x0e, 0x0b,
43、 0x0b, 0x0d, 0x09, 0x0e ; const byte* temp = GFMultplyBytesMatrix(byte*)matrix, state); for(int i = 0; i < 16; +i) statei = tempi; / delete temp;void BuildSBox() / 構(gòu)建S盒 byte box1616 = /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2
44、b, 0xfe, 0xd7, 0xab, 0x76, /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x8
45、0, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf
46、9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x4
47、6, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc
48、6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x4
49、2, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ; for(int i = 0; i < 16; +i) for(int j = 0; j < 16; +j) SBoxij = boxij; void BuildInvSBox() / 構(gòu)建逆S盒 byte box1616 = /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0
50、xf3, 0xd7, 0xfb, /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度風力發(fā)電項目風機設備采購與投資分析合同
- 2025年度智能制造對賭協(xié)議約定倍收益合作協(xié)議
- 二零二五年度林地使用權(quán)變更及補償合同
- 2025年度藥店藥店藥品知識產(chǎn)權(quán)保護聘用勞動合同
- 股權(quán)代持協(xié)議書標準模板:2025年度股權(quán)激勵適用
- 2025年度森林土地承包與林木撫育合作協(xié)議
- 二零二五年度企業(yè)內(nèi)部員工外出安全免責合同
- 二零二五年度汽車零部件貨物運輸保險協(xié)議
- 二零二五年度歷史文化街區(qū)拆除搬遷保護協(xié)議
- 2025年度服裝廠職工勞動合同模板書(智能化工廠)
- (新版)廣電全媒體運營師資格認證考試復習題庫(含答案)
- 2024年法律職業(yè)資格考試(試卷一)客觀題試卷與參考答案
- 安全生產(chǎn)重大事故隱患排查報告表
- 淺圓倉滑模及倉頂板施工方案
- 應用文第一章緒論2016春
- 統(tǒng)編版必修上冊第五《鄉(xiāng)土中國》導讀優(yōu)質(zhì)課件PPT
- 電纜敷設施工方案及安全措施范文
- 市場營銷課程標準
- ppt模板:信保專用中國出口信用保險公司課件
- 2021年四川省綿陽市中考物理真題及答案
- 小學音樂課后服務教學設計方案計劃
評論
0/150
提交評論