基于MC9S08JS16和AES的USB Key設計
AES的主循環對State矩陣執行4個不同的操作,規范中被稱為SubBytes(字節替換)、ShifiRows(行位移變換)、MixColumns(列混合變換)和AddRoundKey(輪密鑰加)。AES加密算法使用了一個由種子密鑰字節數組生成的密鑰調度表,AES規范中稱之為密鑰擴展例程(KeyExpans-ion)。
下面簡單分析AES(128 bits密鑰)的加密過程:
SubBytes例程是一個代替操作,它將State矩陣中的每個字節替換成一個由Sbox決定的新字節,Sbox是初始化的1個16x16的矩陣。比如State[0,1]的值為0xXY,則被替換為Sbox表中Sbox[X,Y]的值。
ShifiRows是一個置換操作,它將State矩陣中的字節向左旋轉。State的第0行向左旋轉0個位置,State的第1行向左旋轉1個位置,State的第2行向左旋轉2個位置,而第3行則向左旋轉3個位置。
MixColumns列混合變換過程,在該變換中將狀態的每列視為有限域GF(28)中的多項式且被一個固定的多項式
,GF代表伽羅瓦域,將其用矩陣形式表示為:
乘積矩陣中的每個元素是系數矩陣中第i行元素與State矩陣第j列元素State[j]的乘積之和。這里的加法和乘法都定義在有限域GF(28)上;加法即按位異或,乘法遵循GF(28)上的多項式乘法規則。
AddRoundKey輪密鑰加過程,State矩陣中的元素通過與一個輪密鑰進行逐位異或而得。
KeyExpansion密鑰擴展例程,用于產生密鑰調度表W[]。例程用到了2個子例程RotWord和SubWord以及1個輪常數表Rcon。RotWord將接收1個4字節的數組并將它們向左旋轉1位,SubWord例程使用替代Sbox對給定的一行密鑰調度表進行逐字節替換。該過程的循環為:
2.3 AES加密算法的優化
從式(1)矩陣函數可以看出,在軟件實現過程中,只需關注如何實現State矩陣元素在GF(28)中與OxO1,0x02,0x03的乘法和加法。GF(2 8)中用0x01的乘法相當于普通算數中用l做乘法并且結果也同樣,任何值乘以0x01等于其自身;用0x02做乘法,只要被乘的值小于0x80,這時乘法的結果就是該值左移一比特位,如果被乘的值大于或等于Ox80,這時乘法的結果就是左移一比特位再用值Ox1b異或,它防止了”域溢出”并保持乘法的乘積在范圍以內;用0x03做乘法時可以分解為2的冪之和,即0x03=0x02+Ox01。對程序進行優化,采用查表法,將16x16的Sbox表分別與Ox01,0x02,0x03相乘產生與Sbox相對應的3個256字節表:XtimeSbox[256]=Sbox[256],Xtime2Sbox[256],Xtime3Sbox[256]。將產生的表存儲于code區。MixColumns過程與SubByte操作可通過以下程序完成:
評論