本帖最后由 lanneret_sky 于 2011-03-03 07:59 編輯
1、AES加密算法簡(jiǎn)介
AES(The Advanced Encryption Standard),又稱Rijndael加密法,該演算法為比利時(shí)密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計(jì),結(jié)合兩位作者的名字,以Rijdael命名。是美國(guó)聯(lián)邦政府采用的一種分塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院 (NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的演算法之一。它被預(yù)期能成為人們公認(rèn)的加密包括金融、電信和政府?dāng)?shù)字信息的方法。美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所(NIST)在2002年5月26日建立了新的高級(jí)數(shù)據(jù)加密標(biāo)準(zhǔn)(AES)規(guī)范。
AES 是一個(gè)新的可以用于保護(hù)電子數(shù)據(jù)的加密算法。明確地說(shuō),AES 是一個(gè)迭代的、對(duì)稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對(duì)不同,對(duì)稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個(gè)循環(huán)結(jié)構(gòu),在該循環(huán)中重復(fù)置換(permutations )和替換(substitutions)輸入數(shù)據(jù)。
2、AES加密算法描述
AES 算法是基于置換和代替的。置換是數(shù)據(jù)的重新排列,而代替是用一個(gè)單元數(shù)據(jù)替換另一個(gè)。AES 使用了幾種不同的技術(shù)來(lái)實(shí)現(xiàn)置換和替換,包括:S盒置換(SubBytes),行循環(huán)移位(ShiftRows),伽洛瓦域多項(xiàng)式運(yùn)算,列混合預(yù)算。
2.1、分組(State)
密碼運(yùn)算的中間結(jié)果稱為狀態(tài)(State)。
State的表示:狀態(tài)用以字節(jié)為基本構(gòu)成元素的矩陣陣列來(lái)表示,該陣列有4行,列數(shù)記為Nb.
Nb=分組長(zhǎng)度(bits)÷ 32
Nb可以取的值為4,6,8,對(duì)應(yīng)的分組長(zhǎng)度為128, 192, 256 bits。
2.2、密鑰(Cipher Key)
Cipher Key類似地用一個(gè)4行的矩陣陣列來(lái)表示,列數(shù)記為Nk. Nk=密鑰長(zhǎng)度(bits)÷32
Nk可以取的值為4,6,8,對(duì)應(yīng)的密鑰長(zhǎng)度為128, 192, 256 bits.
密鑰擴(kuò)展:密鑰bit的總數(shù)=分組長(zhǎng)度×(輪數(shù)Round+1)例如當(dāng)分組長(zhǎng)度為128bits和輪數(shù)Round為10時(shí),輪密鑰長(zhǎng)度為128×(10+1)=1408bits。密鑰的長(zhǎng)度是夠使用的,所以必須將密碼密鑰擴(kuò)展成一個(gè)擴(kuò)展密鑰。擴(kuò)展算法:第i-1輪的分組長(zhǎng)度個(gè)字節(jié)的子密鑰被分成4組來(lái)處理,每組4個(gè)字節(jié)。最后一組的4個(gè)字節(jié)先執(zhí)行一個(gè)字節(jié)的循環(huán)左移,由S盒(這個(gè)S盒與字節(jié)替代時(shí)的S盒是一樣的)來(lái)進(jìn)行替代處理,然后這4個(gè)字節(jié)結(jié)果中的第一個(gè)字節(jié)和輪常數(shù)相異或,這個(gè)輪常數(shù)是預(yù)先定義的,并且固定值。最后,為了得到第i輪密鑰,把得到的4個(gè)字節(jié)的結(jié)果和輪密鑰的最初4個(gè)字節(jié)按位相異或,得到i輪密鑰的最初4個(gè)字節(jié),然后又和密鑰的下面的4個(gè)字節(jié)按位相異或,得到i輪密鑰的下面4個(gè)字節(jié),以此類推。
2.2、SBox置換(SubBytes)
SBox稱為S盒,它是一個(gè)16×16的固定值的矩陣。sbox置換法則:將需要置換的矩陣的每個(gè)字節(jié)的低4位作為s盒的縱坐標(biāo),將其高4位作為s盒的橫坐標(biāo),使用這兩個(gè)值取得對(duì)應(yīng)的S盒中的值,作為置換后的值。
bytes[0] = AseSbox[ bytes[0] >> 4][bytes[0] & 0x0f ];
bytes[1] = AseSbox[ bytes[1] >> 4][bytes[1] & 0x0f ];
bytes[2] = AseSbox[ bytes[2] >> 4][bytes[2] & 0x0f ];
bytes[3] = AseSbox[ bytes[3] >> 4][bytes[3] & 0x0f ];
2.3、行循環(huán)移位(ShiftRows)
在行循環(huán)移位(ShiftRows)變換中,狀態(tài)陣列的后3行循環(huán)移位不同的偏移量。第1行循環(huán)移位C1字節(jié),第2行循環(huán)移位C2字節(jié),第3行循環(huán)移位C3字節(jié)。
偏移量C1、C2、C3與分組長(zhǎng)度Nb有關(guān),如下表所示:
NB
| C1 | C2
| C3
| 4 | 1 | 2 | 3 | 6 | 1
| 2 | 3 | 8 | 1 | 3 | 4 |
2.4、伽洛瓦域運(yùn)算(GF2
在GF(2 中用0x01的乘法是特殊的;它相當(dāng)于普通算術(shù)中用1做乘法并且結(jié)果也同樣—任何值乘0x01等于其自身,F(xiàn)在讓我們看看用0x02做乘法。和加法的情況相同,理論是深?yuàn)W的,但最終結(jié)果十分簡(jiǎn)單。只要被乘的值小于0x80,這時(shí)乘法的結(jié)果就是該值左移1比特位。如果被乘的值大于或等于0x80,這時(shí)乘法的結(jié)果就是用值0x1b異或后的值再左移1比特位。它防止了“域溢出”并保持乘法的乘積在范圍以內(nèi)。
一旦你在GF(2 中用0x02建立了加法和乘法,你就可以用任何常量去定義乘法。用0x03做乘法時(shí),你可以將 0x03 分解為2的冪之和。為了用 0x03 乘以任意字節(jié)b,
因?yàn)?0x03 = 0x02 + 0x01,
因此:
b * 0x03 = b * (0x02 + 0x01)
= (b * 0x02) + (b * 0x01)
這是可以行得通的,因?yàn)槟阒廊绾斡?0x02 和 0x01 相乘和相加。
在AES加密中用到的計(jì)算代碼如下:
Byte gfmultby01(const Byte b) { return b; } Byte gfmultby02(const Byte b) { return (b<< 1) ^ ff_tab[b >> 7]; } Byte gfmultby03(const Byte b) { return gfmultby02(b) ^ b ; } Byte gfmultby09(const Byte b) { return (gfmultby02(gfmultby02(gfmultby02(b))) ^b); }
Byte gfmultby0b(const Byte b) { return (gfmultby02(gfmultby02(gfmultby02(b))) ^gfmultby02(b) ^b ); }
Byte gfmultby0d(const Byte b) { return (gfmultby02(gfmultby02(gfmultby02(b))) ^gfmultby02(gfmultby02(b))^(b)); }
Byte gfmultby0e(const Byte b) { return(gfmultby02(gfmultby02(gfmultby02(b)))^gfmultby02(gfmultby02(b))^gfmultby02(b)); }
2.5、列混合運(yùn)算(MixColumn)
MixColumn(列混合運(yùn)算)將狀態(tài)(State)的列看作是有限域GF(2 上的多項(xiàng)式a(x),與多項(xiàng)式c(x) = 03 x3 + 01 x2 + 01 x +02相乘(模x4+1)。
令b(x) = c(x) × a(x),寫成矩陣形式為:
![]()
2.6、流程
3、AES加密的實(shí)現(xiàn)
代碼加上后,系統(tǒng)告訴我內(nèi)容過長(zhǎng),沒法只好略去,想知道代碼實(shí)現(xiàn)的請(qǐng)?jiān)L問 http://www.greewater.com/view.asp?id=18
我的微博:http://t.sina.com.cn/kingbir 歡迎大家交流。 |