防空系統(tǒng)中AES加密算法的應(yīng)用

熟悉防空系統(tǒng)的朋友們都知道,防空系統(tǒng)中的大量數(shù)據(jù)一般都是以明文形式存儲于數(shù)據(jù)庫和文件中。為了保障防空系統(tǒng)中重要數(shù)椐的安全性,需要對這些數(shù)據(jù)進(jìn)行加密后再存儲。經(jīng)過多方對比,我們選擇了高安全性能的AES算法作為加密算法。該方法具有較高的安全性能,同時又易于實(shí)現(xiàn),具有良好的推廣價值。

一、AES加密算法基本原理

AES加密算法把一個分組看成是4x4的二維字節(jié)(1字節(jié)8bit)數(shù)組,稱此數(shù)組為State狀態(tài)矩陣。加密解密就是對State進(jìn)行多次變換以獲得密文或明文的過程。該加密算法主要由KeyExpansion(密鑰擴(kuò)展)和輪循環(huán)組成,每輪由SubBytes(字節(jié)變換)、ShiftRows(行移位)、MixColumns(列混合變換)和AddRoundKey(輪密鑰加)組成。解密算法是加密算法的逆過程,每輪由InvSubBytes(逆字節(jié)變換)、InvShiftRows(逆行移位)、Inv-MixColumns(逆列混合變換)和AddRoundKey(輪密鑰加)組成。AES-128、AES-192,AES-256對應(yīng)的輪循環(huán)次數(shù)分別為10,12和14次。

(1) SubBytes(字節(jié)變換)

字節(jié)變換是一個非線性的字節(jié)替代變換。由于其運(yùn)算比較復(fù)雜,在編程時通常采用查S盒列表的方式,輸入為8 bit,輸出仍為8 bit。字節(jié)變換的逆向變換相應(yīng)的在一個逆S盒中進(jìn)行查表操作。

(2) ShiftRows(行移位)

行移位是對State矩陣的移位操作。State矩陣的第l行保持不變,第2行循環(huán)左移l位,第3行循環(huán)左移2位,第4行循環(huán)左移3位。逆行移位將左移改為右移。

(3) MixColumns(列混合變換)

在列混合變換中,把State矩陣的每一列都看作有限域上的多項式,與一個固定的矩陣相乘。逆列混合變換為正矩陣變換的逆變換。

(4) AddRoundKey(輪密鑰加)

將State矩陣中的每個字節(jié)和輪密鑰的對應(yīng)字節(jié)進(jìn)行按位異或操作。

(5) KeyExpansion(密鑰擴(kuò)展)

密鑰擴(kuò)展的輸入是16字節(jié)的密鑰,輸出是156字節(jié)的線性數(shù)組,每16個字節(jié)組成一組用于算法中初始輪密鑰加和另外10輪中每輪的輪密鑰加操作。

AES加密算法的解密過程與加密過程類似,但輪循環(huán)的步驟順序不一樣。AES-128的加密和解密流程如圖1所示。與DES加密算法相比,AES加密算法的實(shí)現(xiàn)更簡單。同時由于AES加密算法具備很強(qiáng)的擴(kuò)散性能,最終形成的密碼有很高的隨機(jī)性,抗分析攻擊能力強(qiáng)。

二、加密模塊設(shè)計

在數(shù)據(jù)庫中存儲的字段,無論字符、數(shù)字還是時間類型,均可以看做一組字符串。每個字符在電腦中均是以8bit的數(shù)字所表征,那么對于128 bit長度的分組,一個分組就有16個字符。對于長度不滿16個字符的字符串,需要在尾部填充字符,并標(biāo)記原字符和填充字符;對于超過16個字符的則需要分組進(jìn)行加密處理。

在本文中采用‘/0’作為字符串的結(jié)尾符。而對于填充字符,如果全部采用一種字符來填充,則浪費(fèi)了填充字符的作用。因為對于AES算法來說,輸入的明文是定長的,完全可以利用填充字符來增加明文之間的差異性,令加密后的密文更難破解。因此本文設(shè)計了使用隨機(jī)字符的方法來填充字符串。首先申請一段16個字符的字符數(shù)組,但不做初始化。然后將明文復(fù)制到數(shù)組中,并以‘/O’結(jié)尾。那么剩余的數(shù)組字符就是內(nèi)存中的隨機(jī)數(shù)。這樣即使對于同一段明文,每次加密的密文都會不一樣,增加了破解難度和猜測的可能性。

基于以上的設(shè)計,加密步驟如下:

(1)獲得需要加密的明文和設(shè)定的密鑰Key。

(2)根據(jù)明文長度進(jìn)行處理。大于16個字符的明文按16個字符分組,最后一組如果長度小于16則在尾部加上‘/o’做結(jié)尾,剩余的填充隨機(jī)字符;對于長度小于16個字符的明文,直接按照上述最后一組的方法處理。

(3)對每個16字符分組進(jìn)行加密,得到密文。

(4)將密文組合,按照8 bit的分法輸出字符,或是按照4 bit的分法輸出16進(jìn)制數(shù)值;

(5)將密文保存到數(shù)據(jù)庫或文件中。

對于分組加密后的密文,其長度也是128 bit。如果按照8 bit劃分并轉(zhuǎn)化為字符輸出,是16個字符。但是這8 bit的數(shù)值可能超過ASCH碼的范圍,因此顯示出來的密文就是亂碼,可讀性較差,但是能保證密文長度不變D如果按照4 bit劃分,則可以用16進(jìn)制的方式顯示,但是顯示出來的密文長度是32個字符,比明文多了一倍。在應(yīng)用中可以根據(jù)情況選擇不同的密文輸出方式。不同的密文輸出方式在解密時需要做相應(yīng)的處理。

三、解密模塊設(shè)計

解密時,需要根據(jù)密文的顯示形式做出處理。亂碼形式的密文,按16個字符的長度分組然后解密;16進(jìn)制的密文,按32個字符的長度分組,對每個分組將32個字符轉(zhuǎn)化成16個字符的密文,然后再解密。解密步驟如下:

(1)從數(shù)據(jù)庫或文件中獲得密文和與加密時相同的密鑰Key。

(2)對密文進(jìn)行處理,亂碼形式的密文直接按16個字符的長度分組;16進(jìn)制的密文按32個字符分組,然后將每組的32個字符轉(zhuǎn)化成16字符密文。

(3)對每個16字符密文進(jìn)行解密,獲得明文。

(4)將明文組合,并根據(jù)‘/O’字符去掉多余的填充字符;

(5)輸出明文。

四、防空系統(tǒng)中AES加密算法的應(yīng)用

本文采用C++語言編寫了AES-128的加密和解密函數(shù),并生成了Cipher.dll動態(tài)庫。采用C++語言的優(yōu)點(diǎn)是高效和可跨平臺,生成動態(tài)庫則可以方便地被VC++或QT開發(fā)的軟件所調(diào)用。

1、防空系統(tǒng)數(shù)據(jù)庫加密

在防空系統(tǒng)的數(shù)據(jù)庫中,用戶密碼是一個關(guān)鍵的數(shù)據(jù)項。如果一旦密碼被泄漏,他人就可以冒充用戶進(jìn)行操作,造成嚴(yán)重后果,因此用戶密碼必須加密。用戶的密碼長度設(shè)定在4-15個字符,不超過16個字符,因此無需分組。對于密文,采用16進(jìn)制的方式顯示。數(shù)據(jù)庫中存儲的密文如圖2所示。

這些密碼的原文均是“1234”,但是由于隨機(jī)字符的填充,導(dǎo)致加密后的密文完全不一樣,避免了猜測的可能性,有效隱藏了密碼的長度和相同密碼。

2、防空系統(tǒng)文件加密實(shí)例

在防空系統(tǒng)中,連接數(shù)據(jù)庫需要參數(shù),而這些參數(shù)都要保存在配置文件中,因此需要對配置文件進(jìn)行加密。配置文件通常很小,所以采用全文件加密的方式,并且以字符形式保存密文。原文件如圖3所示,加密后的文件如圖4所示。

從加密后的文件可以看出,密文完全隱藏了原文件的格式和內(nèi)容,不具備可讀性。

小知識之QtQt是一個1991年由奇趣科技開發(fā)的跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,易于擴(kuò)展,允許組件編程。