2-10 AES 密碼標準
內容:
美國 NIST ( National 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 演算法是提供可變長度的加密區塊,可任選 128 、 192 、 256 個位元區塊, AES 為了簡化其複雜度,只提供 128 位元區塊的加密演算法。
鑰匙長度: 因為鑰匙長度可選擇 128 、 192 、 256 個位元長度,因此密碼系統有 AES-128 、 AES-192 、 AES-256 的分別。
編碼演算法: Rijndael 的編碼架構是採用『反覆區段編碼』( Iterated Block Cipher, IBC )方法。 IBC 是將各區塊以陣列格式排列,以位元組( Byte )為單位,陣列之間反覆排列與取代來達到編碼的目的。
2-10-1 AES 基本架構
VIDEO
Rijndael 演算法是利用 3 個參數決定加密與解密的處理架構,而其中一個參數是由另兩個參數演變而來的,如下說明:
明文區段數目( Nb ): 表示 32 bits 加密區段的數目,此參數為輸入的明文區塊可區分為多少個加密區段,以 ASE 標準而言,輸入明文區塊為 128 bits ,因此可區分為四個加密區段( Nb = 4 )。
鑰匙區塊數目( Nk ): 此參數為加密鑰匙可區分為多少個鑰匙區段,每一區段的大小也是 32 bits 。如 AES-128 ,則 Nk = 4 ; AES-192 ,則 Nk = 6 ;而 AES-256 ,則 Nk = 8 。
重覆次數( Nr ): 此參數表示加密(或解密)編碼所需重覆的次數。到底需要重覆幾次,這與明文以及鑰匙的複雜度有關,必須取捨兩者之間較複雜的作為重覆次數的依據;也就是說,取明文與鑰匙之間較長者(或稱區段數目較多者),作為重覆次數的標準,如此,才能將資料(明文或鑰匙)完全的混合,此為 Rijndael 演算法較特殊的地方,計算方式為: Nr = 6 + max(Nb, Nr) 。譬如 AES-128 ,則 Nr = 10 ; AES-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 只採用鑰匙長度為 128 、 192 與 256 位元,並規定明文區塊長度為 128 位元( Nb = 4 ),因此產生了 AES-128 、 AES-192 與 AES-256 等三種標準規範,表 3-2 為 NIST 就這三種規範所制定的相關參數值。圖 2-11 為 AES-128 的基本架構,其中輸入明文區塊為 128 bits ( AES 標準),鑰匙長度為 128 bits ( AES-128 標準)的加密處理架構;其中 Nk = 4 、 Nb = 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-128 、 AES-192 、 AES-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
/*
第 N r 回合編碼 */
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-128 ( Nb = 4 、 Nk = 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() 函數,因此,沒有在迴圈裡運算。以下介紹上述中四個加密函數,以及鑰匙擴充函數。