1997年,美國國家標準技木研究所(NIST)發起徵集AES算法的活動,並專門成立AES工作組,其目的是確定一個非保密的、公開的、全球免費使用的分組密碼算法,用於保護下一世紀政府的敏感信息。
NIST規定候選算法必須滿足下面的要求:
參與AES的候選算法中,Rijndael 提供了安全性、軟件和硬件性能、低內存需求以及靈活性的最好的組合,因此NIST確定選擇Rijndael作爲AES。
2000年選中比利時密碼學家提出的密碼算法Rijndael作爲AES。2001年美國政府正式頒佈AES爲美國國家標準,目前AES已經被一些國際標準化組織採納爲標準。其被選中的原因是安全、性能好效率高、實用、靈活。
Rijndael算法是一個數據塊長度和**長度都可變的分組加密算法,其數據塊長度和**長度都可獨立地選定爲大於等於128位且小於等於256位的32位的任意倍數。美國頒佈AES時規定數據塊的長度爲128位,**長度可分別選擇爲128位、192位或256位。
Rijndael算法採用分組密碼的一種通用結構:對輪函數實施迭代的結構。
Rijndael的輪函數由以下三層組成:
明文分組的長度爲128位即16字節。**長度可以爲16、24、32字節(128、192、256位),根據**的長度,算法被稱爲AES-128,AES-192,AES-256。
輪數依賴於**長度:16、24、32字節分別對應10、12、14輪。
加密和解密算法的輸入是一個128位分組。
AES的加密過程:
字節代替:用一個S盒完成分組的字節到字節的代替;
行移位:一個簡單的置換;
列混淆:利用域GF(28)上的算術特性的一個代替;
輪**加:當前分組和擴展**的一部分進行按位異或。
**擴展算法用來防止已有的密碼分析攻擊,使用與輪相關的輪常量是爲了防止不同輪的輪**產生方式上的對稱性或相似性。
輸入4個字(16字節),輸出一個44個字組成(176字節)的一維線性數組(11輪:爲初始輪**加階段和算法中其他10輪中的每一輪提供4字的輪**)。
輸入**直接被複制到擴展**數組的前4個字,然後每次用4個字填充擴展**數組餘下的部分,每一個新增的字w[i]的值依賴於w[i-1]和w[i-4]。
在四種情形中,三組使用了異或。
對w數組中下標爲4的倍數的元素採用更復雜的函數來計算。
基本原理: