AES原理及其在c語言上的實(shí)現(xiàn)_第1頁
AES原理及其在c語言上的實(shí)現(xiàn)_第2頁
AES原理及其在c語言上的實(shí)現(xiàn)_第3頁
AES原理及其在c語言上的實(shí)現(xiàn)_第4頁
AES原理及其在c語言上的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、AES加密解密算法及其在c語言上的實(shí)現(xiàn)引言對稱密碼算法主要用于保證數(shù)據(jù)的機(jī)密性,通信雙方在加密/ 解密過程中使用它們共享的單一密鑰。對稱密碼算法的使用相當(dāng)廣泛,密碼學(xué)界已經(jīng)對它們進(jìn)行了深入的研究1 。最常用的對稱密碼算法是數(shù)據(jù)加密標(biāo)準(zhǔn)(DES) 算法,它是由IBM在美國國家安全局(NSA) 授意之下研制的一種使用56 位密鑰的分組密碼算法。自1977 年公布成為美國政府的商用加密標(biāo)準(zhǔn)以來已使用20 多年2 。DES 的主要問題是其密鑰長度較短,已不適合于當(dāng)今分布式開放網(wǎng)絡(luò)對數(shù)據(jù)加密安全性的要求。在DES 每隔五年的評估會(huì)議中,最后一次在1998 年美國政府終于決定不再繼續(xù)延用DES作為聯(lián)邦加密

2、標(biāo)準(zhǔn),也就表明了DES 將退出加密標(biāo)準(zhǔn)的舞臺(tái),而新的標(biāo)準(zhǔn)AES(AdvancedEncryptionStandard ) 將粉墨登場3 。AES是美國國家標(biāo)準(zhǔn)技術(shù)研究所NIST旨在取代DES的新一代的加密標(biāo)準(zhǔn)35 。NIST對AES候選算法的基本要求是:對稱分組密碼體制;密鑰長度支持128,192,256位;明文分組長度128 位;算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。1998年NIST開始AES第一輪征集、分析、測試,共產(chǎn)生了15 個(gè)候選算法。1999 年3 月完成了第二輪AES 的分析、測試。1999 年8 月NIST公布了五種算法(MARS,RC6,Rijndael,Serpent,Twofis

3、h) 成為候選算法。最后,Rijn2dael5 ,這個(gè)由比利時(shí)人設(shè)計(jì)的算法與其它候選算法在成為高級加密標(biāo)準(zhǔn)(AES) 的競爭中取得成功,于2000 年10月被NIST宣布成為取代DES的新一代的數(shù)據(jù)加密標(biāo)準(zhǔn),即AES。盡管人們對AES還有不同的看法68 ,但總體來說,Rijndael作為新一代的數(shù)據(jù)加密標(biāo)準(zhǔn)匯聚了強(qiáng)安全性、高性能、高效率、易用和靈活等優(yōu)點(diǎn)。AES設(shè)計(jì)有三個(gè)密鑰長度:128,192,256 比特, 相對而言,AES 的128 比特密鑰比DES的56 比特密鑰強(qiáng)1021倍4 。AES 加密/ 解密算法原理對稱密碼算法根據(jù)對明文消息加密方式的不同可分為兩大類,即分組密碼和流密碼。分組

4、密碼將消息分為固定長度的分組,輸出的密文分組通常與輸入的明文分組長度相同。AES算法屬于分組密碼算法,它的輸入分組、輸出分組以及加/ 解密過程中的中間分組都是128比特。密鑰的長度K為128,192 或256 比特。用Nk=4,6,8 代表密鑰串的字?jǐn)?shù)(1 字=32 比特) ,在本文編制的程序中由用戶選定。用Nr 表示對一個(gè)數(shù)據(jù)分組加密的輪數(shù)(加密輪數(shù)與密鑰長度的關(guān)系見表1) 。每一輪都需要一個(gè)和輸入分組具有同樣長度(128 比特) 的擴(kuò)展密鑰Ke的參與。由于外部輸入的加密密鑰K長度有限,所以在AES中要用一個(gè)密鑰擴(kuò)展程序( KeyExpansion) 把外部密鑰K擴(kuò)展成更長的比特串,以生成各

5、輪的加密密鑰。AES的加密與解密框圖如圖1 所示。128位數(shù)據(jù)分組128位數(shù)據(jù)分組與擴(kuò)展秘鑰的異或運(yùn)算與擴(kuò)展秘鑰的異或運(yùn)算反S盒變換S盒變換反行變換變換行變換變換列變換變換反列變換變換與擴(kuò)展秘鑰的異或與擴(kuò)展秘鑰的異或S盒變換反S盒變換行變換反行變換輸出128位數(shù)據(jù)與擴(kuò)展秘鑰的異或運(yùn)算輸出128位數(shù)據(jù)與擴(kuò)展秘鑰的異或運(yùn)算AES加密與解密流程圖(1) 加密變換設(shè)X是AES的128 比特明文輸入,Y 是128 比特的密文輸出,則AES密文Y可以用下面的復(fù)合變換表示:Y=A k(r+1 )·R·S·Akr·C·R·S·Ak(r21)

6、··C·R·S·Ak1(X)其中“·”表示復(fù)合運(yùn)算。這里Aki :表示對X 的一個(gè)變換Aki (X) =X Ý Ki ( Ki為第i 輪的子密鑰,為比特串的異或運(yùn)算) 。S:S 盒置換。即對每一個(gè)字節(jié)用S2Box做一個(gè)置換。S2Box是一個(gè)給定的轉(zhuǎn)換表。R: 行置換。C: 列置換。這里是特殊的乘法運(yùn)算,將在下面詳細(xì)介紹。(2) 解密變換解密變換是加密變換的逆變換,這里不再詳述。AES 加密/ 解密算法的實(shí)現(xiàn)分組加密表1 是三種不同類型的AES 加密密鑰分組大小與相應(yīng)的加密輪數(shù)的對照表。加密開始時(shí),輸入分組的各字節(jié)按表2 的方

7、式裝入一個(gè)矩陣State 中。如輸入ABCDEFGHIJKLMNOP, 則輸入塊影射到如表2 的狀態(tài)矩陣State 中。表1AES類型秘鑰長度分組大小加密輪數(shù)AES-1284字4字10AES-1926字4字12AES-2568字4字14字表2AEIMBFJNCCAODHLP加密過程主程序由下面的偽代碼描述。其中的子程序SubBytes () ,ShiftRows () ,MixColumns () 和Ad2dRounKey() 將在接下來的部分介紹,密鑰擴(kuò)展程序( KeyExpansion) 將在下面介紹。Cipher(bytein4 3 4,byteout4 3 4,wordw4 3 (Nr

8、+1 ) )beginbytestate4,4state=in;AddRoundKey(state,w ) /SeeSec.3.1.4forround=1step1toNr 21SubBytes(state) /SeeSec.3.1.1ShiftRows(state) /SeeSec.3.1.2MixColumns(state) /SeeSec.3.1.3AddRoundKey(state,w+round 3 4)endforSubBytes(state)ShiftRows(state)AddRoundKey(state,w+Nr 3 4)out=stateendS 盒變換SubBytes()

9、對輸入矩陣的任一個(gè)元素A 做如下變換SA:(1) 一個(gè)元素A 從存儲(chǔ)角度看都是一個(gè)八位的二進(jìn)制數(shù)。算出前四位所代表的十六進(jìn)制數(shù)x 和后四位所代表的十六進(jìn)制數(shù)y。如A=11010100 時(shí),x=c,y=4 。(2) 從AES算法給定的S2Box(16 行16 列的矩陣,其中每個(gè)元素為一個(gè)字節(jié), 具體的S2Box 略) 中找出SA=Sx,y 的值。如A=11010100 時(shí),SA=Sx,y=Sc,4=1c=00011101 ?;蛑苯油ㄟ^下面的公式將A=b7b6b5b4b3b2b1b0 變?yōu)镾A=b 7b6b5b4b3b2b1b0 。這里c= (c0,c1,c2,c3,c4,c5,c6,c7 ) =

10、 (0,1,1,0,0,0,1,1 ) 。行變換ShiftRows()在行變換中,中間狀態(tài)矩陣State 的第一行不變;第二至第四行做如下變換,即將表3 的狀態(tài)矩陣變?yōu)楸?的狀態(tài)矩陣。表3A1A2A3A4B1B2B3B4C1C2C3C4D1D2D3D4變換為表4A1A2A3A4B2B3B4B1C3C4C1C2D4D1D2D3列變換MixColumns()列變換是對中間狀態(tài)矩陣State 逐列進(jìn)行變換。其變換為如下的矩陣運(yùn)算:經(jīng)過上面的運(yùn)算,原來的一列就被替換成下面的式子所表達(dá)的新列:S(0,c )= (02 ×S(0,c ) (03 ×S(1,c ) S(2,c ) S(3

11、,c )S(1,c )=S (0,c ) (02 ×S(1,c ) (03 ×S(2,c ) S(3,c )S(2,c )=S (0,c ) S(1,c ) (02 ×S(2,c ) (03 ×S(3,c )S(3,c )= (03 ×S(0,c ) S(1,c ) S(2,c ) (02 ×S(3,c )這里為按位異或運(yùn)算,其中的乘法×按照下面介紹的模乘同余規(guī)則進(jìn)行計(jì)算。列變換中要用到的模乘同余規(guī)則和我們一般用到的乘法有些不同,由于每一個(gè)元素都是一個(gè)字節(jié),于是可把這個(gè)字節(jié)看成一個(gè)形式上的七次多項(xiàng)式, 即將b7b6b5b4b

12、3b2b1b0 視為b7x7 +b 6x6 +b 5x5 +b 4x4 +b 3x3 +b2x2 +b 1x+b 0 ,如110110012 =d9 16可以被看成是x7+x 6 +x 4 +x 3 +1 。列變換希望把一個(gè)字節(jié)變換為一個(gè)新的字節(jié),所以需要把兩個(gè)形式上的七次多項(xiàng)式的乘法結(jié)果變?yōu)橐粋€(gè)新的形式上的七次多項(xiàng)式,然后才能將其恢復(fù)為一個(gè)字節(jié)的長度。這里采用模一個(gè)八次不可約多項(xiàng)式的同余乘法,即將兩七次多項(xiàng)式的乘法結(jié)果除以這個(gè)八次不可約多項(xiàng)式再取其余式。在AES 中這個(gè)八次不可約多項(xiàng)式為m(x) =x 8 +x 4 +x 3 +x+1 。例如:(x6 +x 4 +x 2 +x+1 ) 

13、15;(x7 +x+1 ) =x 13 +x 11 +x 9 +x 8 +x 6 +x 5 +x 4 +x 3 +1(x13 +x 11 +x 9 +x 8 +x 6 +x 5 +x 4 +x 3 +1 ) mod(x8 +x 4 +x 3 +x+1 ) =x 7 + x6 +1對應(yīng)為57 ×83=c1 。與擴(kuò)展密鑰的異或運(yùn)算AddRoundKey()擴(kuò)展密鑰只參與了這一個(gè)變換。根據(jù)加密的輪數(shù)用相應(yīng)的擴(kuò)展密鑰的四個(gè)數(shù)據(jù)項(xiàng)和中間狀態(tài)矩陣上的列進(jìn)行按位異或。S (0,c ),S(1,c ),S(2,c ),S(3,c )=S (0,c ) ,S(1,c ) ,S(2,c ) ,S(3,c

14、 ) XORW (round×nb+c ) 密鑰擴(kuò)展程序KeyExpansionAES 算法利用外部輸入密鑰K(密鑰串的字?jǐn)?shù)為Nk) ,通過密鑰擴(kuò)展程序得到共4 (Nr+1 ) 字的擴(kuò)展密鑰w4 ×(Nr+1 ) 。涉及如下三個(gè)模塊: (1) 位置變換RotWord() 。把一個(gè)四個(gè)字節(jié)的序列a0,a1,a2,a3 左移一個(gè)字節(jié)變?yōu)閍1,a2,a3,a0 。(2) SubWord() 。對一個(gè)四字節(jié)的輸入字a0,a1,a2,a3 的每一個(gè)字節(jié)進(jìn)行S 盒變換,然后作為輸出(見31111) 。(3) 變換Rcon 。Rconi 表示32 比特字符串 xi21 ,00,00,00

15、 。例如,Rcon1=01000000,Rcon2=02000000,Rcon3=04000000,Rcon4=08000000, ,Rcon10=36000000 。(4) 擴(kuò)展密鑰的生成。擴(kuò)展密鑰的前Nk 個(gè)字就是外部密鑰K;以后的字wi 等于它前一個(gè)字wi 21與前第Nk 個(gè)字wi 2Nk 的異或,即wi=wi 21XORwi 2Nk 。但是若i 為Nk 的倍數(shù), 則wi=wi2 NkXORSubWord ( RotWord(wi 21 ) XORRconi/Nk 。舉例:設(shè)外部輸入的加密密鑰CipherKey=2b7e151628aed2a6abf7158809cf4f3cNk=4,

16、則w0=2b7e1516w1=28aed2a6w2=abf71588w3=09cf4f3c;w4=w0XORSubWord (RotWord(w3) XORRcon4/Nk=a0fafe17;w5=wi 21XORwi 2Nk=w4XORw1=88542cb1; w43=b6630ca6 。輸入明文:00112233445566778899aabbccddeeff;輸入密鑰:000102030405060708090a0b0c0d0e0f各輪密文:round0.input00112233445566778899aabbccddeeff;round0.k sch00010203040506070

17、8090a0b0c0d0e0fround1.start00102030405060708090a0b0c0d0e0f0round10.output69c4e0d86a7b0430d8cdb78070b4c55aOUTPUT:69c4e0d86a7b0430d8cdb78070b4c55a對文件的加密/ 解密在完成了DES分組加密算法實(shí)現(xiàn)的基礎(chǔ)上,現(xiàn)在利用密文分組鏈接(CBC) 方式將其用于對文件的加密/ 解密(密鑰長度可選) ,程序的操作步驟如下:(1) 根據(jù)文件處理方式選擇模塊,選擇對文件加密、對文件解密或是退出程序。(2) 輸入密鑰K的長度(128 比特、192 比特、256 比特) 和密

18、鑰。(3) 用密鑰擴(kuò)展程序?qū)γ荑€加以擴(kuò)展。128 比特、192 比特、256 比特密鑰分別對應(yīng)KeyExpansion128(key) ,KeyExpansion192(key) ,KeyExpansion256 (key) ,分別生成72bytes,204bytes,236bytes 的擴(kuò)展密鑰。(4) 創(chuàng)建加密/ 解密文件。文件都是以文本格式存儲(chǔ)的。(5) 從等待加密/ 解密文件中取出16 字節(jié)。若是未取出16 個(gè)字節(jié)文件就結(jié)束,則在結(jié)束處標(biāo)上文件結(jié)束符。把取出的數(shù)據(jù)放入中間變量(STATE) 中。(6) 根據(jù)密鑰的長度對STATE中的數(shù)據(jù)進(jìn)行加密/解密。128 比特、192 比特、256

19、 比特分別對應(yīng)Cipher128( InvCipher128) ,Cipher192 ( InvCipher192) ,Cipher256 ( In2vCipher256) 。并把加密/ 解密后的數(shù)據(jù)保存在STATE中。把STATE中的數(shù)據(jù)寫入加密/ 解密文件中。(7) 如果等待加密/ 解密的文件已經(jīng)結(jié)束,則關(guān)閉文件,回到操作(1) ;否則回到操作(5) 。這樣程序就實(shí)現(xiàn)了對一個(gè)文件的加密/ 解密操作。結(jié)束語本文在研究分析了AES 加密原理的基礎(chǔ)上著重說明了AES算法實(shí)現(xiàn)的具體步驟,包括擴(kuò)展密鑰的異或運(yùn)算、AddRoundKey() 、列變換MixColumns() 、行變換ShiftRows

20、() 、S 盒變換SubBytes() 等,以及各步驟的輪換順序和最重要的密鑰擴(kuò)展程序KeyExpansion 等,并用C語言完整地實(shí)現(xiàn)了AES算法。AES在C語言上實(shí)現(xiàn)程序#include <string.h>#include <stdio.h>#ifndef uint8#define uint8 unsigned char#endif#ifndef uint32#define uint32 unsigned long int#endiftypedef struct uint32 erk64; /* encryption round keys */ uint32 dr

21、k64; /* decryption round keys */ int nr; /* number of rounds */aes_context;/#define TEST/* uncomment the following line to use pre-computed tables */* otherwise the tables will be generated at the first run */* #define FIXED_TABLES */#ifndef FIXED_TABLES/* forward S-box & tables */uint32 FSb256;

22、uint32 FT0256; uint32 FT1256; uint32 FT2256; uint32 FT3256; /* reverse S-box & tables */uint32 RSb256;uint32 RT0256;uint32 RT1256;uint32 RT2256;uint32 RT3256;/* round constants */uint32 RCON10;/* tables generation flag */int do_init = 1;/* tables generation routine */#define ROTR8(x) ( ( ( x <

23、;< 24 ) & 0xFFFFFFFF ) | ( ( x & 0xFFFFFFFF ) >> 8 ) )#define XTIME(x) ( ( x << 1 ) ( ( x & 0x80 ) ? 0x1B : 0x00 ) )#define MUL(x,y) ( ( x && y ) ? pow(logx + logy) % 255 : 0 )void aes_gen_tables( void ) int i; uint8 x, y; uint8 pow256; uint8 log256; /* compute pow

24、 and log tables over GF(28) */ for( i = 0, x = 1; i < 256; i+, x = XTIME( x ) ) powi = x; logx = i; /* calculate the round constants */ for( i = 0, x = 1; i < 10; i+, x = XTIME( x ) ) RCONi = (uint32) x << 24; /* generate the forward and reverse S-boxes */ FSb0x00 = 0x63; RSb0x63 = 0x00;

25、 for( i = 1; i < 256; i+ ) x = pow255 - logi; y = x; y = ( y << 1 ) | ( y >> 7 ); x = y; y = ( y << 1 ) | ( y >> 7 ); x = y; y = ( y << 1 ) | ( y >> 7 ); x = y; y = ( y << 1 ) | ( y >> 7 ); x = y 0x63; FSbi = x; RSbx = i; /* generate the forward and

26、 reverse tables */ for( i = 0; i < 256; i+ ) x = (unsigned char) FSbi; y = XTIME( x ); FT0i = (uint32) ( x y ) ( (uint32) x << 8 ) ( (uint32) x << 16 ) ( (uint32) y << 24 ); FT0i &= 0xFFFFFFFF; FT1i = ROTR8( FT0i ); FT2i = ROTR8( FT1i ); FT3i = ROTR8( FT2i ); y = (unsigned c

27、har) RSbi; RT0i = ( (uint32) MUL( 0x0B, y ) ) ( (uint32) MUL( 0x0D, y ) << 8 ) ( (uint32) MUL( 0x09, y ) << 16 ) ( (uint32) MUL( 0x0E, y ) << 24 ); RT0i &= 0xFFFFFFFF; RT1i = ROTR8( RT0i ); RT2i = ROTR8( RT1i ); RT3i = ROTR8( RT2i ); #else/* forward S-box */static const uint32

28、FSb256 = 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x0

29、4, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xA

30、A, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x2

31、2, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB

32、4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x4

33、1, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16;/* forward tables */#define FT V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), V(E7,FE,FE,19), V(B5,D7,D7,62), V

34、(4D,AB,AB,E6), V(EC,76,76,9A), V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), V(75,B7,B7,C2

35、), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C

36、3,5E), V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,

37、5A,5A,EE), V(5B,A0,A0,FB), V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), V(D4,6A,6A,BE), V

38、(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81

39、), V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F

40、3,0E), V(BF,D2,D2,6D), V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), V(C0,60,60,A0), V(19,

41、81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), V

42、(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2

43、), V(49,A9,A9,E0), V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), V(CB,E8,E8,23), V(A1,DD,D

44、D,7C), V(E8,74,74,9C), V(3E,1F,1F,21), V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), V(17,

45、86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V

46、(A5,DF,DF,7A), V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)#define V(a,b,c,d) 0x#a#b#c#dst

47、atic const uint32 FT0256 = FT ;#undef V#define V(a,b,c,d) 0x#d#a#b#cstatic const uint32 FT1256 = FT ;#undef V#define V(a,b,c,d) 0x#c#d#a#bstatic const uint32 FT2256 = FT ;#undef V#define V(a,b,c,d) 0x#b#c#d#astatic const uint32 FT3256 = FT ;#undef V#undef FT/* reverse S-box */static const uint32 RSb

48、256 = 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08,

49、0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB,

50、0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7,

51、0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7,

52、0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1,

53、0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D;/* reverse tables */#define RT V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), V(DE,B1,5A,49),

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論