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