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