百科解釋
密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來替代原先的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ì)稱密鑰加密中最流行的算法之一。
該算法為比利時(shí)密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計(jì),結(jié)合兩位作者的名字,以Rijdael之命名之,投稿高級(jí)加密標(biāo)準(zhǔn)的甄選流程。(Rijdael的發(fā)音近于 "Rhine doll"。)
Rijndael是由Daemen和Rijmen早期所設(shè)計(jì)的Square改良而來;而Square則是由SHARK發(fā)展而來。
不同于它的前任標(biāo)準(zhǔn)DES, Rijndael使用的是置換-組合架構(gòu),而非Feistel架構(gòu)。AES在軟件及硬件上都能快速地加解密,相對(duì)來說較易于實(shí)作, 且只需要很少的內(nèi)存。 作為一個(gè)新的加密標(biāo)準(zhǔn), 目前正被部署應(yīng)用到更廣大的范圍.<br clear="all" />
嚴(yán)格地說,AES和Rijndael加密法并不完全一樣(雖然在實(shí)際應(yīng)用中二者可以互換),因?yàn)镽ijndael加密法可以支援更大范圍的區(qū)塊和密鑰長(zhǎng)度:AES的區(qū)塊長(zhǎng)度固定為128 位元,密鑰長(zhǎng)度則可以是128,192或256位元;而Rijndael使用的密鑰和區(qū)塊長(zhǎng)度可以是32位元的整數(shù)倍,以128位元為下限,256位元為上限。加密過程中使用的密鑰是由Rijndael密鑰生成方案產(chǎn)生。
大多數(shù)AES計(jì)算是在一個(gè)特別的有限域完成的。
AES加密過程是在一個(gè)4×4的字節(jié)矩陣上運(yùn)作,這個(gè)矩陣又稱為“體(state)”,其初值就是一個(gè)明文區(qū)塊(矩陣中一個(gè)元素大小就是明文區(qū)塊中的一個(gè)Byte)。(Rijndael加密法因支援更大的區(qū)塊,其矩陣行數(shù)可視情況增加)加密時(shí),各輪AES加密循環(huán)(除最后一輪外)均包含4個(gè)步驟:
<tt>AddRoundKey</tt> — 矩陣中的每一個(gè)字節(jié)都與該次循環(huán)的子密鑰(round key)做XOR運(yùn)算;每個(gè)子密鑰由密鑰生成方案產(chǎn)生。
<tt>SubBytes</tt> — 透過一個(gè)非線性的替換函數(shù),用查找表的方式把每個(gè)字節(jié)替換成對(duì)應(yīng)的字節(jié)。
<tt>ShiftRows</tt> — 將矩陣中的每個(gè)橫列進(jìn)行循環(huán)式移位。
<tt>MixColumns</tt> — 為了充分混合矩陣中各個(gè)直行的操作。這個(gè)步驟使用線性轉(zhuǎn)換來混合每行內(nèi)的四個(gè)字節(jié)。
最后一個(gè)加密循環(huán)中省略<tt>MixColumns</tt>步驟,而以另一個(gè)<tt>AddRoundKey</tt>取代。
<tt>AddRoundKey</tt> 步驟
在<tt>AddRoundKey</tt> 步驟中,將每個(gè)狀態(tài)中的字節(jié)與該次回圈的子密鑰做異或(⊕)。
<tt>AddRoundKey</tt>步驟,子密鑰將會(huì)與原矩陣合并。在每次的加密循環(huán)中,都會(huì)由主密鑰產(chǎn)生一把子密鑰(透過Rijndael密鑰生成方案產(chǎn)生),這把子密鑰大小會(huì)跟原矩陣一樣,以與原矩陣中每個(gè)對(duì)應(yīng)的字節(jié)作異或(⊕)加法。
<tt>SubBytes</tt> 步驟
在<tt>SubBytes</tt>步驟中,矩陣中各字節(jié)被固定的8位查找表中對(duì)應(yīng)的特定字節(jié)所替換,S; b<sub>ij</sub> = S(a<sub>ij</sub>).
在<tt>SubBytes</tt>步驟中,矩陣中的各字節(jié)透過一個(gè)8位元的S-box進(jìn)行轉(zhuǎn)換。這個(gè)步驟提供了加密法非線性的變換能力。S-box與GF(28)上的乘法反元素有關(guān),已知具有良好的非線性特性。為了避免簡(jiǎn)單代數(shù)性質(zhì)的攻擊,S-box結(jié)合了乘法反元素及一個(gè)可逆的仿射變換矩陣建構(gòu)而成。 此外在建構(gòu)S-box時(shí),刻意避開了固定點(diǎn)與反固定點(diǎn),即以S-box替換字節(jié)的結(jié)果會(huì)相當(dāng)于錯(cuò)排的結(jié)果。 此條目有針對(duì)S-box的詳細(xì)描述:Rijndael S-box
<tt>ShiftRows</tt> 步驟
在<tt>ShiftRows</tt> 步驟中,矩陣中每一列的各個(gè)字節(jié)循環(huán)向左方位移。位移量則隨著行數(shù)遞增而遞增。
<tt>ShiftRows</tt>是針對(duì)矩陣的每一個(gè)橫列操作的步驟。 在此步驟中,每一列都向左循環(huán)位移某個(gè)偏移量。在AES中(區(qū)塊大小128位元),第一列維持不變,第二列里的每個(gè)字節(jié)都向左循環(huán)移動(dòng)一格。同理,第三列及第四列向左循環(huán)位移的偏移量就分別是2和3。128位元和192位元的區(qū)塊在此步驟的循環(huán)位移模式的模式相同。經(jīng)過<tt>ShiftRows</tt>之后,矩陣中每一直行,都是由輸入矩陣中的每個(gè)不同列中的元素組成。Rijndael算法的版本中,偏移量和AES有少許不同;對(duì)于長(zhǎng)度256位元的區(qū)塊,第一列仍然維持不變,第二列、第三列、第四列的偏移量分別是1字節(jié)、2字節(jié)、4字節(jié)。除此之外,<tt>ShiftRows</tt>操作步驟在Rijndael和AES中完全相同。
<tt>MixColumns</tt> 步驟
在 <tt>MixColumns</tt> 步驟中,每個(gè)直行都在modulo x4 + 1之下,和一個(gè)固定多項(xiàng)式 c(x) 作乘法。
在<tt>MixColumns</tt>步驟,每一直行的四個(gè)字節(jié)透過線性變換互相結(jié)合。每一直行的四個(gè)元素分別當(dāng)作1,x,x2,x3的系數(shù),合并即為GF(28)中的一個(gè)多項(xiàng)式,接著將此多項(xiàng)式和一個(gè)固定的多項(xiàng)式c(x) = 3x3 + x2 + x + 2在modulo x4 + 1下相乘。此步驟亦可視為 Rijndael有限域之下的矩陣乘法。<tt>MixColumns</tt>函數(shù)接受4個(gè)字節(jié)的輸入,輸出4個(gè)字節(jié),每一個(gè)輸入的字節(jié)都會(huì)對(duì)輸出的四個(gè)字節(jié)造成影響。因此<tt>ShiftRows</tt>和<tt>MixColumns</tt>兩步驟為這個(gè)密碼系統(tǒng)提供了擴(kuò)散性。
以下條目有對(duì)<tt>MixColumns</tt>更加詳細(xì)的描述:Rijndael mix columns
加密算法優(yōu)化
使用32或更多位元尋址的系統(tǒng),可以事先對(duì)所有可能的輸入建立對(duì)應(yīng)表,利用查表來實(shí)作<tt>SubBytes</tt>,<tt>ShiftRows</tt> 和 <tt>MixColumns</tt>步驟以達(dá)到加速的效果。 這么作需要產(chǎn)生4個(gè)表,每個(gè)表都有256個(gè)格子,一個(gè)格子記載32位元的輸出;約占去4KB( 4096 字節(jié) )內(nèi)存空間,即每個(gè)表占去 1KB 的內(nèi)存空間。如此一來,在每個(gè)加密循環(huán)中,只需要查16次表,作12次32位元的XOR運(yùn)算,以及<tt>AddRoundKey</tt>步驟中4次32位元XOR運(yùn)算。
若使用的平臺(tái)內(nèi)存空間不足4KB,也可以利用循環(huán)交換的方式一次查一個(gè)256格32位元的表。
截至2006年,針對(duì)AES唯一的成功攻擊是旁道攻擊。美國(guó)國(guó)家安全局審核了所有的參與競(jìng)選AES的最終入圍者(包括Rijndael),認(rèn)為他們均能夠滿足美國(guó)政府傳遞非機(jī)密文件的安全需要。2003年6月,美國(guó)政府宣布AES可以用于加密機(jī)密文件:
<blockquote class="toccolours" style="float: none; padding: 0.3em 1em;">
The design and strength of all key lengths of the AES algorithm (i.e., 128, 192 and 256) are sufficient to protect classified information up to the SECRET level. TOP SECRET information will require use of either the 192 or 256 key lengths. The implementation of AES in products intended to protect national security systems and/or information must be reviewed and certified by NSA prior to their acquisition and use.[3]
</blockquote>
(譯:AES加密算法(使用128,192,和256位元密鑰的版本)的安全性,在設(shè)計(jì)結(jié)構(gòu)及密鑰的長(zhǎng)度上俱已到達(dá)保護(hù)機(jī)密資訊的標(biāo)準(zhǔn)。最高機(jī)密資訊的傳遞,則至少需要192或256位元的密鑰長(zhǎng)度。用以傳遞國(guó)家安全資訊的AES實(shí)作產(chǎn)品,必須先由國(guó)家安全局審核認(rèn)證,方能被發(fā)放使用。)
這標(biāo)志著,由美國(guó)國(guó)家安全局NSA批準(zhǔn)在最高機(jī)密資訊上使用的加密系統(tǒng)首次可以被公開使用。許多大眾化產(chǎn)品只使用128位元密鑰當(dāng)作默認(rèn)值;由于最高機(jī)密文件的加密系統(tǒng)必須保證數(shù)十年以上的安全性,故推測(cè)NSA可能認(rèn)為128位元太短,才以更長(zhǎng)的密鑰長(zhǎng)度為最高機(jī)密的加密保留了安全空間。
通常破解一個(gè)區(qū)塊加密系統(tǒng)最常見的方式,是先對(duì)其較弱版本(加密循環(huán)次數(shù)較少)嘗試各種攻擊。AES中128位元密鑰版本有10個(gè)加密循環(huán),192位元密鑰版本有12個(gè)加密循環(huán),256位元密鑰版本則有14個(gè)加密循環(huán)。至2006年為止,最著名的攻擊是針對(duì)AES 7次加密循環(huán)的128位元密鑰版本,8次加密循環(huán)的192位元密鑰版本,和9次加密循環(huán)的256位元密鑰版本所作的攻擊。[4]
由于已遭破解的弱版的AES,其加密循環(huán)數(shù)和原本的加密循環(huán)數(shù)相差無幾,有些密碼學(xué)家開始擔(dān)心AES的安全性:要是有人能將該著名的攻擊加以改進(jìn),這個(gè)區(qū)塊加密系統(tǒng)就會(huì)被破解。在密碼學(xué)的意義上,只要存在一個(gè)方法,比暴力搜尋密鑰還要更有效率,就能被視為一種“破解”。故一個(gè)針對(duì)AES 128位元密鑰的攻擊若“只”需要2120計(jì)算復(fù)雜度(少于暴力搜尋法 2128),128位元密鑰的AES就算被破解了;即便該方法在目前還不實(shí)用。從應(yīng)用的角度來看,這種程度的破解依然太不切實(shí)際。最著名的暴力攻擊法是distributed.net針對(duì)64位元密鑰RC5所作的攻擊。(該攻擊在2002年完成。根據(jù)摩爾定律,到2005年12月,同樣的攻擊應(yīng)該可以破解66位元密鑰的RC5。)
其他的爭(zhēng)議則著重于AES的數(shù)學(xué)結(jié)構(gòu)。不像其他區(qū)塊加密系統(tǒng),AES具有相當(dāng)井然有序的代數(shù)結(jié)構(gòu)。[3]雖然相關(guān)的代數(shù)攻擊尚未出現(xiàn),但有許多學(xué)者認(rèn)為,把安全性建立于未經(jīng)透徹研究過的結(jié)構(gòu)上是有風(fēng)險(xiǎn)的。Ferguson,Schroeppel 和 Whiting 因此寫道:“...我們很擔(dān)心 Rijndael [AES] 算法應(yīng)用在機(jī)密系統(tǒng)上的安全性。”[5]
2002年,Nicolas Courtois 和 Josef Pieprzyk發(fā)表名為XSL 攻擊的理論性攻擊,試圖展示AES一個(gè)潛在的弱點(diǎn)。但幾位密碼學(xué)專家發(fā)現(xiàn)該攻擊的數(shù)學(xué)分析有點(diǎn)問題,推測(cè)應(yīng)是作者的計(jì)算有誤。因此,這種攻擊法是否對(duì)AES奏效,仍是未解之謎。就現(xiàn)階段而言,XSL攻擊AES的效果不十分顯著,故將之應(yīng)用于實(shí)際情況的可能性并不高。
旁道攻擊
旁道攻擊不攻擊密碼本身,而是攻擊那些實(shí)作于不安全系統(tǒng)(會(huì)在不經(jīng)意間泄漏資訊)上的加密系統(tǒng)。
2005年4月,D.J. Bernstein公布了一種緩存時(shí)序攻擊法,他以此破解了一個(gè)裝載OpenSSL AES加密系統(tǒng)的客戶服務(wù)器。為了設(shè)計(jì)使該服務(wù)器公布所有的時(shí)序資訊,攻擊算法使用了2億多條篩選過的明碼。有人認(rèn)為,對(duì)于需要多個(gè)跳躍的國(guó)際互聯(lián)網(wǎng)而言,這樣的攻擊方法并不實(shí)用。 [4]Bruce Schneier稱此攻擊為“好的時(shí)序攻擊法”。[5]
2005年10月,Adi Shamir和另外兩個(gè)研究員發(fā)表了一篇論文,展示了數(shù)種針對(duì)AES的緩存時(shí)序攻擊法(PDF)。其中一種攻擊法只需要800個(gè)寫入動(dòng)作,費(fèi)時(shí)65毫秒,就能得到一把完整的AES密鑰。但攻擊者必須在執(zhí)行加密的系統(tǒng)上擁有執(zhí)行程式的權(quán)限,方能以此法破解該密碼系統(tǒng)。
高級(jí)加密系統(tǒng)甄選流程