,,
(火箭軍工程大學(xué) 基礎(chǔ)部,西安 710025)
某控制系統(tǒng)各節(jié)點(diǎn)間通過CAN總線互連通信,而在CAN的協(xié)議規(guī)范中只對物理層和數(shù)據(jù)鏈路層做了明確的規(guī)定,其應(yīng)用層協(xié)議用戶可自行根據(jù)具體的應(yīng)用系統(tǒng)自主定義[1]。為了保證總線在通信過程中的安全性,在應(yīng)用層協(xié)議里進(jìn)行了數(shù)據(jù)加密,并采用了改進(jìn)的AES加密算法。AES加密算法是1998年由Rijndael提出,其安全性目前仍在深入研究與討論中,但普遍認(rèn)為其具有良好的安全性。本文對AES加密算法進(jìn)行了改進(jìn),且只改進(jìn)了其非線性部分S-Box的構(gòu)造,其余線性變換的結(jié)構(gòu)并未改變。S-Box是一個預(yù)先計算好的字節(jié)替換表,因此算法的執(zhí)行時間不會有所改變,不存在參考文獻(xiàn)[2]提出的由于改進(jìn)算法而導(dǎo)致影響通信效率的問題。本文通過對比改進(jìn)前后的AES加密算法的仿射變換對周期、代數(shù)表達(dá)式項數(shù)、嚴(yán)格雪崩距離等各項指標(biāo)來說明算法的安全性,并通過實(shí)驗(yàn)驗(yàn)證了可行性。
AES加密算法為分組密碼,分組長度為128位即16個字節(jié),密匙長度有128、192或256位,根據(jù)密匙長度的不同,加密的輪數(shù)也不同,本文采用長度為128位的密匙,加密輪數(shù)為10輪。AES加密算法不僅編碼緊湊、設(shè)計簡單而且可抵抗多種類型的攻擊,其基本結(jié)構(gòu)包括4個部分。
(1)字節(jié)替換(SubBytes)
字節(jié)替換也就是通過S-Box對字節(jié)元素進(jìn)行非線性的變換,S-Box由有限域GF(28)上的乘法求逆運(yùn)算和仿射變換運(yùn)算而來,通過查表的方式即可直接得到變換前后的字節(jié)元素,替換后字節(jié)元素至少有兩位發(fā)生變換,能充分打亂原來的字節(jié)元素,本文所介紹的AES加密算法就是對S-Box進(jìn)行改進(jìn)而來。具體替換規(guī)則為假設(shè)一字節(jié)為xy,則S-Box中第x行第y列所對應(yīng)的元素就是替換后的元素。
(2)行位移(ShiftRows)
行位移是AES加密算法中的一個簡單線性運(yùn)算,即在4×4的狀態(tài)矩陣中,把第i行循環(huán)左移i個字節(jié)(i=0,1,2,3)。
(3)列混合(MixColumns)
列混合是將狀態(tài)矩陣中的每一列看成一個多項式,讓其與一個固定的多項式a(x)相乘,再做模多項式m(x)=x4+1的運(yùn)算,其中a(x)=03x3+01x2+01x+02。
(4)輪密匙加(AddRoundKey)
輪密匙加變換就是讓狀態(tài)矩陣與經(jīng)過密匙擴(kuò)展得到的子密匙做異或運(yùn)算,因此輪密匙加變換的逆變換就是其本身,其中子密匙是原始密匙通過密匙擴(kuò)展算法得到的。
AES加密算法先將128位的明文進(jìn)行分組,得到一個4×4的明文狀態(tài)矩陣作為算法的輸入,然后選取密匙矩陣先對明文狀態(tài)矩陣做一次輪密匙加變換,再經(jīng)過10輪的輪函數(shù)加密,輪函數(shù)操作依次為字節(jié)替換、行位移、列混合和輪密匙加,其中由于最后一輪的列混合不僅不會提高安全性,反而會拉低算法運(yùn)算速度,故該輪丟棄列混合變換。解密算法仍為10輪,由于算法的4個輪操作均為可逆變換,因此解密過程就是用與加密過程同樣的密匙對每一輪的加密操作進(jìn)行逆運(yùn)算。算法的流程圖如圖1所示,其代碼實(shí)現(xiàn)如下:
void aes(char *p, int plen, char *key){
int keylen = strlen(key);
int pArray[4][4];
int k,i;
… …
extendKey(key);//擴(kuò)展密鑰
for(k = 0; k < plen; k += 16) {
convertToIntArray(p + k, pArray);
addRoundKey(pArray, 0);
//第一次輪密鑰加
for(i = 1; i < 10; i++){
subBytes(pArray);//字節(jié)代換
shiftRows(pArray);//行移位
mixColumns(pArray);//列混合
addRoundKey(pArray, i);//輪密匙加
}
subBytes(pArray);//字節(jié)代換
shiftRows(pArray);//行移位
addRoundKey(pArray, 10);//輪密匙加
convertArrayToStr(pArray, p + k);
}
}
圖1 AES加密算法流程圖
S-Box作為AES加密算法中唯一的非線性部分,是一個作用于狀態(tài)字節(jié)的非線性變換,對于128位的明文加密,一次加密過程就要用到S-Box 160次[3],因此其構(gòu)造對算法的安全性起關(guān)鍵性作用。S-Box的構(gòu)造由兩個可逆的復(fù)合變換而成,即先在有限域GF(28)上求乘法逆元變換,其中00沒有乘法逆元,規(guī)定其變換后依然是00,再在GF(2)上做仿射變換運(yùn)算。參考文獻(xiàn)[4]給出了S-Box的代數(shù)表達(dá)式只有9項:S(x)=05x254+09x253+f9x251+25x247+f4x239+01x223+b5x191+8fx127+63。
(1)定義1
(2)定義2
(3)定義3
迭代輸出周期[6]:從其中一元素開始對S-Box做連續(xù)替換直到回到該元素所經(jīng)過的元素數(shù)。S-Box具有5個迭代輸出周期且均小于88,分別是87、81、59、27、2,其短周期現(xiàn)象給密碼分析提供了可能性,增大迭代輸出周期有利于提高算法的安全性。
(4)定義4
(5)定義5
(6)定義6
非線性度[6]:設(shè)F(x)=(f1(x),…,fn(x))是GF(2)n到GF(2)n的多輸出布爾置換,則稱
(7)定義7
抗代數(shù)攻擊阻力[7]:在有限域GF(28)上有t項的r個方程,定義Γ為S-Box的抗代數(shù)攻擊阻力,有Γ=((t-r)/n)[(t-r)/n],對于AES加密算法中的S-Box,參考文獻(xiàn)[6]給出t=81,r=23,n=8,帶入上式可得Γ≈222.9。該指標(biāo)主要與求乘法逆元運(yùn)算有關(guān),因此對于改進(jìn)后的S-Box抗代數(shù)攻擊阻力仍為?!?22.9。
(8)定義8
雪崩效應(yīng)[8]:設(shè)F(x)=(f1(x),…,fn(x))是GF(2)n到GF(2)n的多輸出布爾置換,若對任意的α∈GF(2)n且W(α)=1,即α的漢明重量為1時,有w(fi(x+a)+fi(x))=2n-1(1≤i≤n),則稱F(x)滿足嚴(yán)格的雪崩準(zhǔn)則SAC,稱
改進(jìn)的AES加密算法主要是對S-Box進(jìn)行重構(gòu),通過上述對S-Box的代數(shù)性質(zhì)分析,增大仿射變換周期和迭代輸出周期有利于提高算法的安全性,且S-Box的代數(shù)表達(dá)式項數(shù)較少只有9項,代數(shù)復(fù)雜度低則算法抵御代數(shù)攻擊性能弱。筆者通過大量的對比試驗(yàn)發(fā)現(xiàn),S-Box的代數(shù)表達(dá)式項數(shù)與構(gòu)造S-Box的求乘法逆元素運(yùn)算和仿射變換運(yùn)算的順序有關(guān),且為滿足S-Box和逆S-Box均具有較復(fù)雜的代數(shù)多項式,可多做一次仿射變換運(yùn)算,因此重構(gòu)的S-Box可先對字節(jié)元素做仿射變換運(yùn)算,再求乘法逆元素運(yùn)算,最后再做一次仿射變換運(yùn)算。而仿射變換周期和迭代輸出周期與仿射變換對的選取有關(guān),根據(jù)定義2得到仿射變換周期為16的仿射變換對共有8 192對,按照新S-Box的構(gòu)造原理選出其中91對,使得Lu,v具有唯一一個周期256的置換表,根據(jù)定義8分別計算所有仿射變換對的嚴(yán)格雪崩準(zhǔn)則距離,得到仿射變換對(79,51)的DSAC(F)最小為372。因此,重構(gòu)的S-Box具體步驟如下:
① 首先選取仿射變換對(79,51)做仿射變換,運(yùn)算過程如下
x=L79,51(x)=Lb×x+51=
② 求乘法逆元運(yùn)算
③ 最后依然用仿射變換對(79,51)再做一次仿射變換L79,51
y=L79,51(x")=Lb×x"+51
表1 改進(jìn)后的S-Box替換表
表2 改進(jìn)后的逆S-Box替換表
根據(jù)定義4~7,改進(jìn)后的AES加密算法S-Box在平衡性、差分均勻度、非線性結(jié)構(gòu)和抗代數(shù)攻擊阻力上均不變。由于重構(gòu)S-Box時改變了求乘法逆元和仿射變換運(yùn)算的順序,并增加了一次仿射變換運(yùn)算,S-Box的代數(shù)復(fù)雜度有所提高,S-Box的代數(shù)項數(shù)由原來的9項增加到255項,而逆S-Box的代數(shù)項數(shù)也只由原來的255項降到253項。選取仿射變換周期為16的仿射變換對(79,51),使得S-Box的嚴(yán)格雪崩準(zhǔn)則距離由432下降到372,具有更好的雪崩效應(yīng)。改進(jìn)前后S-Box性能對比如表3所列。
表3 改進(jìn)前后S-Box性能對比表
圖2 加密算法驗(yàn)證界面
實(shí)驗(yàn)首先對改進(jìn)后的加密算法進(jìn)行驗(yàn)證,選取明文為{01,02,03,04,…,0f,00},密匙為{2b,7e,15,16;28,ae,d2,a6;ab,f7,15,88;09,cf,4f,3c},用C語言編寫程序,并在VC6.0編譯環(huán)境下運(yùn)行后得到如圖2所示的界面,加密后的密文為{de,0f,43,e7,…,a6,57}。
其次在CAN開發(fā)板的通信中進(jìn)行驗(yàn)證,開發(fā)板主控芯片采用穩(wěn)定性較好的STC89C52RC單片機(jī),CAN控制器和收發(fā)器分別為SJA1000和TJA1050,且開發(fā)板上有一個4位的數(shù)碼管可用于顯示加密后的數(shù)據(jù)。將3塊CAN開發(fā)板以總線型的拓?fù)浣Y(jié)構(gòu)連成網(wǎng)絡(luò),并把CAN_H、CAN_L、VCC、GND端對應(yīng)相連,其中的一塊開發(fā)板設(shè)為主節(jié)點(diǎn),用于發(fā)送數(shù)據(jù),其余兩塊設(shè)為從節(jié)點(diǎn),用于接收數(shù)據(jù),主節(jié)點(diǎn)與USB-CAN轉(zhuǎn)換模塊相連,USB-CAN分析儀可以通過USB接口把CAN網(wǎng)絡(luò)與電腦的上位機(jī)軟件EmbededDebug v2.0相連,便于數(shù)據(jù)的采集、處理以及對數(shù)據(jù)的收發(fā)進(jìn)行實(shí)時監(jiān)控。本實(shí)驗(yàn)輸入的明文為{01,02,03,04,…,0f,00},得到的密文為{de,0f,43,e7,…,a6,57},在CAN通信實(shí)驗(yàn)的程序中只寫入加密函數(shù)而不進(jìn)行解密,并讓加密后的密文通過數(shù)碼管顯示,由于數(shù)碼管只有4位,只能顯示密文的前4位即{de,0f,43,e7},實(shí)驗(yàn)現(xiàn)場圖如圖3所示。
圖3 CAN總線通信實(shí)驗(yàn)現(xiàn)場圖
由圖可以直觀看出,數(shù)碼管在第二位正常顯示了數(shù)字0f,其余三位是由于在數(shù)碼管函數(shù)中未作定義而隨機(jī)生成的段選。再把解密函數(shù)寫入實(shí)驗(yàn)程序中,數(shù)碼管正常顯示了發(fā)送的數(shù)據(jù)01,02,03,04,并打開上位機(jī)軟件EmbededDebug v2.0,可以實(shí)時看到數(shù)據(jù){01,02,03,04,…,0f,00}進(jìn)行正常的收發(fā),如圖4所示。
圖4 上位機(jī)軟件監(jiān)控數(shù)據(jù)圖