AES 加密演算法基本原理

AES 是 Advanced Encryption Standard 的縮寫,是最常見的對稱加密演算法。AES 在密碼學中又稱 Rijndael 加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的 DES,已經被多方分析且廣為全世界所使用。

AES基本原理

AES 的加密公式為 C=E(K,P),其中 K 為密鑰,P 為明文,C 為密文。

AES 加密明文的過程是,首先對明文進行分組,每組的長度都是 128 位,然後一組一組地加密,直到所有明文都已加密。密鑰的長度可以是 128、192 或 256 位。

在加密函數 E 中,會執行一個輪函數,除最後一次執行不同外,前面幾輪的執行是相同的。以 AES-128 為例,推薦加密輪數為 10 輪,即前 9 輪執行的操作相同,第 10 輪執行的操作與前面不同。不同的密鑰長度推薦的加密輪數是不一樣的,具體見下面的表格。

Advertisements

加密時,明文按照 128 位為單位進行分組,每組包含 16 個位元組,按照從上到下、從左到右的順序排列成一個 4 × 4 的矩陣,稱為明文矩陣。AES 的加密過程在一個大小同樣為 4 × 4 的矩陣中進行,稱為狀態矩陣,狀態矩陣的初始值為明文矩陣的值。每一輪加密結束后,狀態矩陣的值變化一次。輪函數執行結束后,狀態矩陣的值即為密文的值,從狀態矩陣得到密文矩陣,依次提取密文矩陣的值得到 128 位的密文。

以 128 位密鑰為例,密鑰長度為 16 個位元組,也用 4 × 4 的矩陣表示,順序也是從上到下、從左到右。AES 通過密鑰編排函數把密鑰矩陣擴展成一個包含 44 個字的密鑰序列,其中的前 4 個字為原始密鑰用於初始加密,後面的 40 個字用於 10 輪加密,每輪使用其中的 4 個字。密鑰遞歸產生規則如下:

Advertisements

(1) 如果 i 不是 4 的倍數,那麼由等式 w[i] = w[i-4] ⊕ w[i-1] 確定;

(2) 如果 i 是 4 的倍數,那麼由等式 w[i] = w[i-4] ⊕ T(w[i-1]) 確定。

加密的第 1 輪到第 9 輪的輪函數一樣,包括 4 個操作:位元組代換、行位移、列混合和輪密鑰加。最後一輪迭代不執行列混合。另外,在第一輪迭代之前,先將明文和原始密鑰進行一次異或加密操作。

解密過程仍為 10 輪,每一輪的操作是加密操作的逆操作。由於 AES 的 4 個輪操作都是可逆的,因此,解密操作的一輪就是順序執行逆行移位、逆位元組代換、輪密鑰加和逆列混合。同加密操作類似,最後一輪不執行逆列混合,在第 1 輪解密之前,要執行 1 次密鑰加操作。

AES 加密的輪函數操作

位元組代換 SubBytes

矩陣中的各位元組通過一個 8 位的 S-box 進行轉換。這個步驟提供了加密法非線性的變換能力。S-box 與 GF(2^8)上的乘法反元素有關,已知具有良好的非線性特性。為了避免簡單代數性質的攻擊,S-box 結合了乘法反元素及一個可逆的仿射變換矩陣建構而成。此外在建構 S-box 時,刻意避開了固定點與反固定點,即以 S-box 替換位元組的結果會相當於錯排的結果。

行位移 ShiftRows

在此步驟中,每一行都向左循環位移某個偏移量。在 AES 中(區塊大小 128位 ),第一行維持不變,第二行里的每個位元組都向左循環移動一格。同理,第三行及第四行向左循環位移的偏移量就分別是 2 和 3。128 位和 192 位的區塊在此步驟的循環位移的模式相同。經過 ShiftRows 之後,矩陣中每一豎列,都是由輸入矩陣中的每個不同列中的元素組成。Rijndael 演算法的版本中,偏移量和 AES 有少許不同;對於長度 256 比特的區塊,第一行仍然維持不變,第二行、第三行、第四行的偏移量分別是 1 位元組、2 位元組、3 位元組。除此之外,ShiftRows 操作步驟在 Rijndael 和 AES 中完全相同。

列混合 MixColumns

在 MixColumns 步驟,每一列的四個位元組通過線性變換互相結合。每一列的四個元素分別當作 1 , x , x^2 , x^3 的係數,合併即為GF(2^8)中的一個多項式,接著將此多項式和一個固定的多項式 c(x)=3x^3+x^2+x+2 在 modulo x^4 + 1 下相乘。此步驟亦可視為 Rijndael 有限域之下的矩陣乘法。MixColumns 函數接受 4 個位元組的輸入,輸出 4 個位元組,每一個輸入的位元組都會對輸出的四個位元組造成影響。因此 ShiftRows 和 MixColumns 兩步驟為這個密碼系統提供了擴散性。

輪密鑰加 AddRoundKey

回合密鑰將會與原矩陣合併。在每次的加密循環中,都會由主密鑰產生一把回合密鑰(通過 Rijndael 密鑰生成方案產生),這把密鑰大小會跟原矩陣一樣,以與原矩陣中每個對應的位元組作異或(⊕)加法。

分享學習筆記和技術總結,內容涉及 Java 進階、架構設計、前沿技術、演算法與數據結構、資料庫、中間件等多個領域,歡迎關注。本文首發於微信公眾號「後端開發那點事兒」。

Advertisements

你可能會喜歡