沈 俊
[摘要]AES是一種對稱分組密碼算法,它是廣泛應用的新標準。首先介紹AES加密算法的基本操作和流程。隨后討論AES加密算法的實現(xiàn)。最后,闡述一個基于AES加密算法的消息系統(tǒng)的設計方案。
[關鍵詞]AES加密 消息系統(tǒng) 網(wǎng)絡安全
中圖分類號:TP3 文獻標識碼:A 文章編號:1671-7597(2009)0110052-02
一、引言
美國國家標準技術協(xié)會(NIST)在2001年發(fā)布了高級加密標準(AES)。AES是一種對稱分組密碼算法,用以取代DES的商業(yè)應用,從而成為廣泛使用的新標準。其分組長度為128位,密鑰長度為128位,192位或256位,其中128位的密鑰長度最常用。以下各節(jié)介紹了一個基于AES加密算法的消息系統(tǒng)的設計。
二、AES加密算法簡介
AES加密算法1、2中128位密鑰是最常用的,故以128位密鑰為例介紹。AES加密算法有四種基本的操作:
1.字節(jié)代換:用一個S盒完成分組中的按字節(jié)代換。
2.行移位:一個簡單的基于行的置換。
3.列混淆:一個利用在域GF(28)上算術特性的代換。
4.輪密鑰加:用當前分組和擴展密鑰的一部分進行按位異或。
AES加密、解密算法的流程如圖1所示:
圖1中,輸入的密鑰將被擴展成由44個32位字組成的數(shù)組W[i],在每輪加解密過程中有四個字(128位)的密鑰。
AES加密算法的詳細內(nèi)容請參考文獻[1]。
三、AES加密算法實現(xiàn)
AES加密算法中,S盒的初始化和列混淆變換都要用到有限域GF(28)上的運算乘法和加法。因此先闡述有限域GF(28)上運算的實現(xiàn),再介紹AES加密算法的實現(xiàn)。
(一)有限域GF(28)上運算實現(xiàn)
一個專門的GF2NOP_1B類被用來進行一字節(jié)(8位)的加法、乘法和循環(huán)左右移位運算,類的主要方法在AES加密算法中會被調用。
1.加法
GF(28)上的加法實際上就是按位異或運算。代碼如下:
GF2NOP_1B GF2NOP_1B::operator+(ubyte ubV)//typedef unsigned
char ubyte;
{
GF2NOP_1B gfR;
gfR = this->ubValue ^ ubV; //XOR
return gfR;
}
2.乘法
乘法要稍微復雜一些,不能只用簡單的異或運算。但是可以使用一種合理而容易實現(xiàn)的技巧,原理請見參考文獻[2],這里只給出實現(xiàn):
GF2NOP_1B GF2NOP_1B::operator * (ubyte ubV)
{
GF2NOP_1B gfR = 0;
ubyte ubMulN = ubV;
ubyte ubMN = (ubyte)iMODNUM_8; //iMODNUM_8 = 00011011b
ubyte ubTmp;
int i;
for (i = 0; ubMulN; ubMulN >>= 1, i++) {
if (i == 0)
ubTmp = this->ubValue;
else {
if (ubTmp &0x80) {
ubTmp <<= 1;
ubTmp ^= ubMN;
}
else
ubTmp <<= 1;
}
if (ubMulN & 1) {
gfR = gfR + ubTmp;
}
}
return gfR;
}
代碼中還有一個類GF2NOP_4B是實現(xiàn)有限域GF(28)上4字節(jié)的運算,使得AES算法在32位機上用32位字操作會更緊湊更高效。
(二)AES加解密算法及實現(xiàn)
一個AESCrypt類被用來實現(xiàn)AES加解密,其主要方法有:密鑰擴展、輪密鑰加、字節(jié)代換、行移位、列混淆。其中,字節(jié)代換是用查表法實現(xiàn)的,列混淆是矩陣的乘法實現(xiàn)的,其它幾個方法也比較容易實現(xiàn)。
圖1所示AES加密算法和解密算法不同,采取兩處改進[2]可以使解密算法的結構和加密算法的結構一致。分別是,在解密輪中,交換逆向行移位和逆向字節(jié)代換,交換輪密鑰加和逆向列混淆。
逆向行移位影響字節(jié)的順序,但不更改字節(jié)的內(nèi)容,也不依賴字節(jié)的內(nèi)容來進行它的變換。逆向字節(jié)代換影響字節(jié)的內(nèi)容,但不更改字節(jié)的順序同時也不依賴字節(jié)的順序來進行它的變換。因此,這兩個操作可以交換。如對一個給定的State Si:
逆向行移位[逆向字節(jié)代換(Si)]=逆向字節(jié)代換[逆向行移位(Si)] (1)
類似的第二處改進也可以用一個算式表示,即對給定的State Si和給定的輪密鑰wj:
InvMixColumns(Si^wj)= [InvMixColumns(Si)]^[InvMixColumns(wj)] (2)
其中“^”符號表示異或,上式的證明見文獻[2]。至此,加、解密的輪函數(shù)已經(jīng)統(tǒng)一起來了,輪函數(shù)的C++聲明如下:
int AESCrypt::RoundFun(int iRound, int iEDFlag);
參數(shù)iRound是輪數(shù),加密時是1到10,解密時是9到0;iEDFlag是加、解密標志,真值為解密。輪函數(shù)的UML[3]活動圖如圖2所示:
圖2清楚地描繪了AES加、解密算法的輪函數(shù),圖中最后一個分支處當解密并且iRound!=0時有三步操作:ExpandKey[iRound]列逆混淆、輪密鑰加、ExpandKey[iRound]列混淆。第一、二步與前面的States[iRound]列逆混淆完成了上述式(2)等號右邊的運算,而第三步則是為了還原ExpandKey[iRo
und]。
四、消息系統(tǒng)的設計
這里設計的消息系統(tǒng)是C/S結構的,客戶端通過服務器與另一個客戶端聯(lián)系。服務器端的主要功能是:接受管理客戶端的連接請求,存儲轉發(fā)客戶端的消息。其UML構件圖如圖3。
TCP/IP接口構件是對Socket API的封裝,為上層構件提供接口;數(shù)據(jù)庫接口構件是對數(shù)據(jù)庫訪問操作的封裝,為上層構件提供接口。客戶端連接請求到達時,經(jīng)由AES加解密構件解密后由連接管理構件管理,并反饋以密鑰生成構件隨機生成的密鑰;當有消息到達時,AES加解密構件對其解密后,由消息處理構件進行處理,由消息存檔構件存入數(shù)據(jù)庫,并由消息分發(fā)構件向連接管理構件查詢目標地址后交由TCP/IP接口構件發(fā)送。
客戶端程序比較簡單,主要的流程如圖4的UML活動圖。
圖4中請求連接時的請求數(shù)據(jù)是用默認密鑰進行加密的,服務器響應后會返回新密鑰,以后的會話都使用新密鑰進
行。監(jiān)聽和等待發(fā)送是由兩個線程同時執(zhí)行的。這兩個線程一般都是在等待睡眠中,所以CPU占用率很低。
五、結束語
以上由介紹AES加密算法開始闡述了一個基于AES加密算法的消息系統(tǒng)的設計。這里介紹的這個系統(tǒng)是一個初步的雛形,尚只在局域網(wǎng)內(nèi)應用。此系統(tǒng)存在的缺陷是用默認的AES密鑰加密來傳輸AES新密鑰,很容易被黑客破解。為了使系統(tǒng)更安全,下一步的工作是將AES密鑰用RSA算法加密后再傳輸。
參考文獻:
[1]Deamen,j.and Rijmen,V.“Rijndael: The Advanced Encryption Standard.”Dr.Dobb's Journal, March 2001.
[2]孟慶樹、王麗娜、傅建明等譯,William Stallings.密碼編碼學與網(wǎng)絡安全:原理與實踐[M].第四版.北京:電子工業(yè)出版社,2006:66-125.
[3]李洋、鄭龑等譯,Larman,C.UML和模式應用[M].第三版.北京:機械工業(yè)出版社,2006.
作者簡介:
沈俊,男,浙江省湖州人,同濟大學碩士研究生,主要從事網(wǎng)絡化測試平臺通信安全的研究。