,,
(火箭軍工程大學 基礎部,西安 710025)
某控制系統各節點間通過CAN總線互連通信,而在CAN的協議規范中只對物理層和數據鏈路層做了明確的規定,其應用層協議用戶可自行根據具體的應用系統自主定義[1]。為了保證總線在通信過程中的安全性,在應用層協議里進行了數據加密,并采用了改進的AES加密算法。AES加密算法是1998年由Rijndael提出,其安全性目前仍在深入研究與討論中,但普遍認為其具有良好的安全性。本文對AES加密算法進行了改進,且只改進了其非線性部分S-Box的構造,其余線性變換的結構并未改變。S-Box是一個預先計算好的字節替換表,因此算法的執行時間不會有所改變,不存在參考文獻[2]提出的由于改進算法而導致影響通信效率的問題。本文通過對比改進前后的AES加密算法的仿射變換對周期、代數表達式項數、嚴格雪崩距離等各項指標來說明算法的安全性,并通過實驗驗證了可行性。
AES加密算法為分組密碼,分組長度為128位即16個字節,密匙長度有128、192或256位,根據密匙長度的不同,加密的輪數也不同,本文采用長度為128位的密匙,加密輪數為10輪。AES加密算法不僅編碼緊湊、設計簡單而且可抵抗多種類型的攻擊,其基本結構包括4個部分。
(1)字節替換(SubBytes)
字節替換也就是通過S-Box對字節元素進行非線性的變換,S-Box由有限域GF(28)上的乘法求逆運算和仿射變換運算而來,通過查表的方式即可直接得到變換前后的字節元素,替換后字節元素至少有兩位發生變換,能充分打亂原來的字節元素,本文所介紹的AES加密算法就是對S-Box進行改進而來。具體替換規則為假設一字節為xy,則S-Box中第x行第y列所對應的元素就是替換后的元素。
(2)行位移(ShiftRows)
行位移是AES加密算法中的一個簡單線性運算,即在4×4的狀態矩陣中,把第i行循環左移i個字節(i=0,1,2,3)。
(3)列混合(MixColumns)
列混合是將狀態矩陣中的每一列看成一個多項式,讓其與一個固定的多項式a(x)相乘,再做模多項式m(x)=x4+1的運算,其中a(x)=03x3+01x2+01x+02。
(4)輪密匙加(AddRoundKey)
輪密匙加變換就是讓狀態矩陣與經過密匙擴展得到的子密匙做異或運算,因此輪密匙加變換的逆變換就是其本身,其中子密匙是原始密匙通過密匙擴展算法得到的。
AES加密算法先將128位的明文進行分組,得到一個4×4的明文狀態矩陣作為算法的輸入,然后選取密匙矩陣先對明文狀態矩陣做一次輪密匙加變換,再經過10輪的輪函數加密,輪函數操作依次為字節替換、行位移、列混合和輪密匙加,其中由于最后一輪的列混合不僅不會提高安全性,反而會拉低算法運算速度,故該輪丟棄列混合變換。解密算法仍為10輪,由于算法的4個輪操作均為可逆變換,因此解密過程就是用與加密過程同樣的密匙對每一輪的加密操作進行逆運算。算法的流程圖如圖1所示,其代碼實現如下:
void aes(char *p, int plen, char *key){
int keylen = strlen(key);
int pArray[4][4];
int k,i;
… …
extendKey(key);//擴展密鑰
for(k = 0; k < plen; k += 16) {
convertToIntArray(p + k, pArray);
addRoundKey(pArray, 0);
//第一次輪密鑰加
for(i = 1; i < 10; i++){
subBytes(pArray);//字節代換
shiftRows(pArray);//行移位
mixColumns(pArray);//列混合
addRoundKey(pArray, i);//輪密匙加
}
subBytes(pArray);//字節代換
shiftRows(pArray);//行移位
addRoundKey(pArray, 10);//輪密匙加
convertArrayToStr(pArray, p + k);
}
}

圖1 AES加密算法流程圖
S-Box作為AES加密算法中唯一的非線性部分,是一個作用于狀態字節的非線性變換,對于128位的明文加密,一次加密過程就要用到S-Box 160次[3],因此其構造對算法的安全性起關鍵性作用。S-Box的構造由兩個可逆的復合變換而成,即先在有限域GF(28)上求乘法逆元變換,其中00沒有乘法逆元,規定其變換后依然是00,再在GF(2)上做仿射變換運算。參考文獻[4]給出了S-Box的代數表達式只有9項:S(x)=05x254+09x253+f9x251+25x247+f4x239+01x223+b5x191+8fx127+63。
(1)定義1


(2)定義2
(3)定義3
迭代輸出周期[6]:從其中一元素開始對S-Box做連續替換直到回到該元素所經過的元素數。S-Box具有5個迭代輸出周期且均小于88,分別是87、81、59、27、2,其短周期現象給密碼分析提供了可能性,增大迭代輸出周期有利于提高算法的安全性。
(4)定義4

(5)定義5

(6)定義6
非線性度[6]:設F(x)=(f1(x),…,fn(x))是GF(2)n到GF(2)n的多輸出布爾置換,則稱

(7)定義7
抗代數攻擊阻力[7]:在有限域GF(28)上有t項的r個方程,定義Γ為S-Box的抗代數攻擊阻力,有Γ=((t-r)/n)[(t-r)/n],對于AES加密算法中的S-Box,參考文獻[6]給出t=81,r=23,n=8,帶入上式可得?!?22.9。該指標主要與求乘法逆元運算有關,因此對于改進后的S-Box抗代數攻擊阻力仍為Γ≈222.9。
(8)定義8
雪崩效應[8]:設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)滿足嚴格的雪崩準則SAC,稱

改進的AES加密算法主要是對S-Box進行重構,通過上述對S-Box的代數性質分析,增大仿射變換周期和迭代輸出周期有利于提高算法的安全性,且S-Box的代數表達式項數較少只有9項,代數復雜度低則算法抵御代數攻擊性能弱。筆者通過大量的對比試驗發現,S-Box的代數表達式項數與構造S-Box的求乘法逆元素運算和仿射變換運算的順序有關,且為滿足S-Box和逆S-Box均具有較復雜的代數多項式,可多做一次仿射變換運算,因此重構的S-Box可先對字節元素做仿射變換運算,再求乘法逆元素運算,最后再做一次仿射變換運算。而仿射變換周期和迭代輸出周期與仿射變換對的選取有關,根據定義2得到仿射變換周期為16的仿射變換對共有8 192對,按照新S-Box的構造原理選出其中91對,使得Lu,v具有唯一一個周期256的置換表,根據定義8分別計算所有仿射變換對的嚴格雪崩準則距離,得到仿射變換對(79,51)的DSAC(F)最小為372。因此,重構的S-Box具體步驟如下:
① 首先選取仿射變換對(79,51)做仿射變換,運算過程如下
x=L79,51(x)=Lb×x+51=
② 求乘法逆元運算
③ 最后依然用仿射變換對(79,51)再做一次仿射變換L79,51
y=L79,51(x")=Lb×x"+51


表1 改進后的S-Box替換表

表2 改進后的逆S-Box替換表
根據定義4~7,改進后的AES加密算法S-Box在平衡性、差分均勻度、非線性結構和抗代數攻擊阻力上均不變。由于重構S-Box時改變了求乘法逆元和仿射變換運算的順序,并增加了一次仿射變換運算,S-Box的代數復雜度有所提高,S-Box的代數項數由原來的9項增加到255項,而逆S-Box的代數項數也只由原來的255項降到253項。選取仿射變換周期為16的仿射變換對(79,51),使得S-Box的嚴格雪崩準則距離由432下降到372,具有更好的雪崩效應。改進前后S-Box性能對比如表3所列。

表3 改進前后S-Box性能對比表

圖2 加密算法驗證界面
實驗首先對改進后的加密算法進行驗證,選取明文為{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編譯環境下運行后得到如圖2所示的界面,加密后的密文為{de,0f,43,e7,…,a6,57}。
其次在CAN開發板的通信中進行驗證,開發板主控芯片采用穩定性較好的STC89C52RC單片機,CAN控制器和收發器分別為SJA1000和TJA1050,且開發板上有一個4位的數碼管可用于顯示加密后的數據。將3塊CAN開發板以總線型的拓撲結構連成網絡,并把CAN_H、CAN_L、VCC、GND端對應相連,其中的一塊開發板設為主節點,用于發送數據,其余兩塊設為從節點,用于接收數據,主節點與USB-CAN轉換模塊相連,USB-CAN分析儀可以通過USB接口把CAN網絡與電腦的上位機軟件EmbededDebug v2.0相連,便于數據的采集、處理以及對數據的收發進行實時監控。本實驗輸入的明文為{01,02,03,04,…,0f,00},得到的密文為{de,0f,43,e7,…,a6,57},在CAN通信實驗的程序中只寫入加密函數而不進行解密,并讓加密后的密文通過數碼管顯示,由于數碼管只有4位,只能顯示密文的前4位即{de,0f,43,e7},實驗現場圖如圖3所示。

圖3 CAN總線通信實驗現場圖
由圖可以直觀看出,數碼管在第二位正常顯示了數字0f,其余三位是由于在數碼管函數中未作定義而隨機生成的段選。再把解密函數寫入實驗程序中,數碼管正常顯示了發送的數據01,02,03,04,并打開上位機軟件EmbededDebug v2.0,可以實時看到數據{01,02,03,04,…,0f,00}進行正常的收發,如圖4所示。

圖4 上位機軟件監控數據圖
