資訊與網路安全技術第 二章 傳統秘密鑰匙系統  上一頁      下一頁

 

2-10 AES 密碼標準

內容:

美國 NISTNational Institute of Standards and Technology有鑒於 DES 密碼系統在未來幾年內有可能被破解的危機(許多破解技巧皆是針對 DES 系統而設計的),於 1997 年發表公開甄求『進階加密標準』(Advanced Encryption Standard, AES)的提案。這裡僅簡單介紹 AES 的編碼技術,如讀者有興趣更進一步了解的話,可參考 AES 的官方網站:

 http://csrc.nist.gov/encryption/aes

網站內除了有詳細的規範文件可供參考之外,亦有相關原始程式(Source Program)可供下載使用,如 AES 加密/解密的原始程式及可執行檔。

首先將 AES 演算法的特點歸類如下:

  • 區塊長度:原來 Rijndael 演算法是提供可變長度的加密區塊,可任選 128192256 個位元區塊,AES 為了簡化其複雜度,只提供 128 位元區塊的加密演算法。

  • 鑰匙長度:因為鑰匙長度可選擇 128192256 個位元長度,因此密碼系統有 AES-128AES-192AES-256的分別。

  • 編碼演算法:Rijndael的編碼架構是採用『反覆區段編碼』(Iterated Block Cipher, IBC)方法。IBC 是將各區塊以陣列格式排列,以位元組(Byte)為單位,陣列之間反覆排列與取代來達到編碼的目的。

2-10-1 AES 基本架構

Rijndael 演算法是利用 3 個參數決定加密與解密的處理架構,而其中一個參數是由另兩個參數演變而來的,如下說明:

  •  明文區段數目(Nb):表示 32 bits 加密區段的數目,此參數為輸入的明文區塊可區分為多少個加密區段,以 ASE 標準而言,輸入明文區塊為 128 bits,因此可區分為四個加密區段(Nb = 4)。

  • 鑰匙區塊數目(Nk):此參數為加密鑰匙可區分為多少個鑰匙區段,每一區段的大小也是 32 bits。如 AES-128,則 Nk = 4AES-192,則 Nk = 6;而 AES-256,則 Nk = 8

  • 重覆次數(Nr):此參數表示加密(或解密)編碼所需重覆的次數。到底需要重覆幾次,這與明文以及鑰匙的複雜度有關,必須取捨兩者之間較複雜的作為重覆次數的依據;也就是說,取明文與鑰匙之間較長者(或稱區段數目較多者),作為重覆次數的標準,如此,才能將資料(明文或鑰匙)完全的混合,此為 Rijndael 演算法較特殊的地方,計算方式為:Nr = 6 + max(Nb, Nr)。譬如 AES-128,則 Nr = 10AES-192,則 Nr = 12;而 AES-256,則 Nr = 14;如表 2-1 所示。

2-1 Rijndael 參數關係

Nr

Nb = 4

Nb = 6

Nb = 8

Nk = 4

10

12

14

Nk = 6

12

12

14

Nk = 8

14

14

14

註:明文區塊數 Nb,鑰匙區塊數 Nk,回合次數Nr

基本上,Rijndael 是利用上述三個參數來建立加密(或解密)編碼的架構,不同的明文區塊與鑰匙長度都會衍生不同的架構。但 NIST 只採用鑰匙長度為 128192 256 位元,並規定明文區塊長度為 128 位元(Nb = 4),因此產生了 AES-128AES-192 AES-256 等三種標準規範,表 3-2 NIST就這三種規範所制定的相關參數值。圖 2-11 AES-128 的基本架構,其中輸入明文區塊為 128 bitsAES 標準),鑰匙長度為 128 bitsAES-128 標準)的加密處理架構;其中 Nk = 4Nb = 4、以及 Nr = 10

2-2 AES 三種標準規範

 

明文區塊 Nb

鑰匙區塊 Nk

回合次數Nr

AES-128

4

4

10

AES-192

4

6

12

AES-256

4

8

14

2-11 AES-128 加密演算法之架構

2-11 AES-128 加密演算法的架構,其它 AES 系統亦屬雷同,甚至解密演算法的基本架構亦是依照此模型製作。值得注意的是,AES 演算法已不再沿用 Festel 的基本架構,Rijndael 提出一套數學模型(如 GF(28))推導出其加密與解密演算法。為使讀者能對AES有較通盤的瞭解,在介紹其演算法之前,有必要先就其數學基礎作簡單的說明。

2-10-2 AES 加密演算法

依照 AES 標準規範,明文區塊限制於 128 bits,也就是說,Nb固定為 4(如表 3-2 所示),又各種規範(AES-128AES-192AES-256)之間不同的是 Nk(鑰匙長度)與 Nr(回合次數,Nr = 6 + max(Nb, Nr))的數值。圖 3-11 AES 加密演算法的虛擬碼(請參考圖 3-9),其中包含下列四個主要函數:

    • 回合鑰匙加法運算:AddRoundKey()

    • 位元組取代運算:SubBytes()

    • 列移位運算:ShiftRows()

    • 混合行運算:MixColumns()

Cipher (byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])

/* in 為輸入陣列、out = 輸出陣列、w = 鑰匙字元陣列 */

Begin

Byte state[4, Nb]

/* 明文陣列複製到狀態陣列上 */

state = in

/* 0 回合編碼 */

AddRoundKey(state, w[0, Nb-1])

/* 1 Nr – 1 回合編碼 */

for round = 1 step 1 to Nr-1

SubBytes(state)

ShiftRows(state)

MixColumns(state)

AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])

end for

/* Nr回合編碼 */

SubBytes(state)

ShiftRows(state)

AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])

/* 密文陣列輸出 */

out = state

end

2-12 AES 加密演算法

針對圖 3-11 AES 加密演算法說明如下:

(1) 首先將明文區塊(in 陣列,128 bits)依照圖3-10 方式填入狀態陣列(state)之中。

(2) 狀態陣列與子鑰匙做相加運算(AddRoundKey(),容後說明)。

(3) 接下來,執行回合加密,每一回合執行編碼處理的順序為 SubBytes()ShiftRows()MixColumns(),以及 AddRoundKey(),至於執行的回合次數則依照不同規範而定;以 AES-128Nb = 4Nk = 4)為例,回合次數為 10(計算為 Nr = 6 + max(Nb, Nr) = 6 + max(4, 4) = 10),但在迴圈中只執行 9 次(= Nr – 1)。

(4) 回合加密後,緊接著再執行 SubBytes()ShiftRows()、以及 AddRoundKey(),最後再將狀態陣列(state)填入輸出陣列中(如圖 3-10 所示),並完成該區塊的加密處理;另外,密文輸出如同明文一樣,皆是 128 bits 長度。

3-11 中可以發現兩個重點,一者為進入回合加密之前,先執行一次 AddRoundKey() 函數(為了方便說明,將其稱為第 0 回合編碼),因此子鑰匙的數目必須是回合次數加一(即是 Nr + 1);另一者為最後編碼回合(第 Nr回合)並沒有執行 MixColumns() 函數,因此,沒有在迴圈裡運算。以下介紹上述中四個加密函數,以及鑰匙擴充函數。

 

翻轉工作室:粘添壽

 

 

資訊與網路安全技術

 

 

 

翻轉電子書系列: