AES算法簡記

1997年,美國國家標準技木研究所(NIST)發起徵集AES算法的活動,並專門成立AES工作組,其目的是確定一個非保密的、公開的、全球免費使用的分組密碼算法,用於保護下一世紀政府的敏感信息。

NIST規定候選算法必須滿足下面的要求:

  • 密碼必須是沒有密級的,絕不能像商業祕密那樣來保護它
  • 算法的全部描述必須公開披露
  • 密碼必須可以在世界範圍內免費使用
  • 密碼系統支持至少128比特長的分組
  • 密碼支持的**長度至少爲128、192和256比特

參與AES的候選算法中,Rijndael 提供了安全性、軟件和硬件性能、低內存需求以及靈活性的最好的組合,因此NIST確定選擇Rijndael作爲AES。

2000年選中比利時密碼學家提出的密碼算法Rijndael作爲AES。2001年美國政府正式頒佈AES爲美國國家標準,目前AES已經被一些國際標準化組織採納爲標準。其被選中的原因是安全、性能好效率高、實用、靈活。

Rijndael算法是一個數據塊長度和**長度都可變的分組加密算法,其數據塊長度和**長度都可獨立地選定爲大於等於128位且小於等於256位的32位的任意倍數。美國頒佈AES時規定數據塊的長度爲128位,**長度可分別選擇爲128位、192位或256位。

Rijndael算法採用分組密碼的一種通用結構:對輪函數實施迭代的結構。

Rijndael的輪函數由以下三層組成:

  1. 非線性層:進行非線性S盒變換ByteSub,由16個S盒並置而成,起混淆的作用。
  2. 線性混合層:進行行移位變換和列混合變換以確保多圈之上的高度擴散;
  3. **加層:進行圈**加變換,將圈**簡單地異或到中間狀態上,實現**的加密控制作用。

AES的結構

明文分組的長度爲128位即16字節。**長度可以爲16、24、32字節(128、192、256位),根據**的長度,算法被稱爲AES-128,AES-192,AES-256。

輪數依賴於**長度:16、24、32字節分別對應10、12、14輪。

加密和解密算法的輸入是一個128位分組。

AES的加密過程:

在這裏插入圖片描述

AES的參數:

在這裏插入圖片描述

AES加密和解密

在這裏插入圖片描述

  • AES的顯著特徵是它不是Feistel結構,在每一輪都使用代替和混淆將整個數據分組作爲一個單一的矩陣處理。
  • 輸入的**被擴展成44個32位字節所組成的數組
  • 由4個不同的階段組成,包括一個置換和三個代替:

字節代替:用一個S盒完成分組的字節到字節的代替;

行移位:一個簡單的置換;

列混淆:利用域GF(28)上的算術特性的一個代替;

輪**加:當前分組和擴展**的一部分進行按位異或。

  • 算法結構簡單:對加解密操作,算法由輪**加開始,執行9輪迭代運算,每輪包含所有四個階段的代替,接着是第10輪的3個階段
  • 僅在輪**加階段使用**
  • 算法以輪**加開始,以輪**加結束
  • 輪**加實質上是一種Vernam密碼形式,就其本身是不難破譯的,另外三個階段(沒有提供算法的安全性)一起提供了混淆、擴散以及非線性功能
  • 每個階段均可逆
  • 解密算法按逆序方式利用了擴展**。解密算法和加密算法不一樣,這是由AES的特定結構決定。加密和解密中**擴展的形式一樣,但在解密中變換的順序與加密中變換的順序不同,缺點:對同時需要加解密的應用而言,需要兩個不同的軟件或固件模塊。
  • 加密和解密過程的最後一輪只包含3個階段,由AES的特定結構決定的,也是密碼算法可逆性的要求。

AES的**擴展

**擴展算法用來防止已有的密碼分析攻擊,使用與輪相關的輪常量是爲了防止不同輪的輪**產生方式上的對稱性或相似性。

輸入4個字(16字節),輸出一個44個字組成(176字節)的一維線性數組(11輪:爲初始輪**加階段和算法中其他10輪中的每一輪提供4字的輪**)。

輸入**直接被複制到擴展**數組的前4個字,然後每次用4個字填充擴展**數組餘下的部分,每一個新增的字w[i]的值依賴於w[i-1]和w[i-4]。

在四種情形中,三組使用了異或。

對w數組中下標爲4的倍數的元素採用更復雜的函數來計算。

基本原理:

  • 知道**或輪**的部分位不能計算出輪**的其他位
  • 是一個可逆的變換
  • 能夠在各種處理器上有效的執行
  • 使用輪變量來消除對稱性
  • 將**的差異性擴散到輪**中
  • 足夠的非線性以防止輪**的差異完全由**的差異決定
  • 易於描述