AES加密算法的一種優(yōu)化的FPGA實(shí)現方法
隨著(zhù)密碼分析水平,芯片處理能力和計算技術(shù)的不斷進(jìn)步,DES的安全強度已經(jīng)難以適應新的安全需要,其實(shí)現速度、代碼大小和跨平臺性均難以繼續滿(mǎn)足應用需求。因此,NIST(美國國家標準與技術(shù)研究所)籌劃AES(高級數據加密標準)算法,旨在取代DES,以保護21世紀敏感政府信息的新型加密標準。Rijndael算法以其簡(jiǎn)潔、高效、安全和原則性的設計被接納為AES,并于2001年11月26日正式公布在FIPS(Federal Information ProcessingStandards)出版的FIPS-PUB 197中。作為DES的繼承者,AES自從被接納為標準之日起就已經(jīng)被工業(yè)界、銀行業(yè)和行政部門(mén)作為事實(shí)上的密碼標準。
隨著(zhù)網(wǎng)絡(luò )傳輸速度提升為gigabits數量級,業(yè)界對算法的執行速度的要求也越來(lái)越高,基于軟件的密碼算法便顯得性能不足,需要采用硬件加密的方式,他采用一些特殊的優(yōu)化技術(shù)(如流水線(xiàn)和查找表等),可極大地提高數據的流量并減少密鑰的生成時(shí)間。另外,用硬件實(shí)現加密算法及與之相關(guān)的密鑰生成過(guò)程,并且封裝到芯片中,因為他們不易被外部攻擊者讀取或更改,會(huì )有較高的物理安全性。因此,基于硬件的密碼算法就受到業(yè)界的普遍關(guān)注。以FPGA為代表的可重構硬件以其自身所固有的特點(diǎn)――既具有硬件的安全性和高速性又有軟件的靈活性和易維護性,已經(jīng)成為分組密碼算法硬件實(shí)現的熱點(diǎn)研究方向。
本文介紹AES加密算法的一種FPGA實(shí)現的方法以及對其加密速度的優(yōu)化處理技巧。
2 AES加密算法簡(jiǎn)介
AES是一種迭代分組密碼,采用的是代替/置換網(wǎng)絡(luò )(SPN)。他將明文分組長(cháng)度固定為128 b,而且僅支持128,196或256 b的密鑰長(cháng)度,本文僅對密鑰長(cháng)度為128 b的情況進(jìn)行討論。
AES加密算法的實(shí)現包括密鑰擴展過(guò)程和加密過(guò)程。加密過(guò)程又包括一個(gè)作為初始輪的初始密鑰加法(AddRoundKey),接著(zhù)進(jìn)行9次輪變換(Round),最后再使用一個(gè)輪變換(FinalRound),如圖1所示。
![]() |
每一次Round均由SubBytes,ShiftRows,MixColumns和AddRoundKey共4個(gè)步驟構成,FinalRound包含除MixColumns這一步外的其他3個(gè)步驟,Round結構如圖2所示。
![]() |
輪變換及其每一步均作用在中間結果上,將該中間結果稱(chēng)為狀態(tài),可以形象地表示為一個(gè)4*4 B的矩陣。
3 AES加密算法的優(yōu)化
3.1 字節代換(SubBytes)
步驟SubBytes是Rijndael密碼中惟一的非線(xiàn)形變換。他是一個(gè)磚匠置換,該置換包含一個(gè)作用在狀態(tài)字節上的S-盒,用SRD表示,他是由字節在GF(28)域中求其乘法逆并外加一個(gè)仿射變換(仿射變換的作用是復雜化S-盒的代數表達式)實(shí)現,假設該步的輸入為a,輸出為b,即b=SRD(a)。由于該步驟是一種非線(xiàn)形面向字節的變換,是將一個(gè)8位二進(jìn)制數據轉換為另一個(gè)不同的8位二進(jìn)制數據,這里要求一一對應,并且替換結果不能超出8位,可以通過(guò)構造可逆的S-盒來(lái)實(shí)現。
根據字節代換的要求和特點(diǎn),具體實(shí)現時(shí),可以將S-盒用一個(gè)16*16 B的置換表來(lái)表示,通過(guò)查表即可實(shí)現該步變換,避免了復雜的乘法運算。
3.2 行移變換(ShiftRows)
ShiftRows是線(xiàn)形變換,他和列混合運算相互影響,在多輪變換后,使密碼信息達到充分的混亂,提高非線(xiàn)形度。
行變換是在狀態(tài)的每個(gè)行間進(jìn)行的,是狀態(tài)中的行按照不同的偏移量進(jìn)行循環(huán)左移運算,在明文分組長(cháng)度為128 b,密鑰長(cháng)度為128 b時(shí),ShiftRows對狀態(tài)的每行作用如下列表達式所示:
![]() |
顯而易見(jiàn),可以通過(guò)對每個(gè)字節的移位簡(jiǎn)單實(shí)現該步變換。
3.3 列混合變換(MixColumns)
MixColumns是線(xiàn)形變換,是以狀態(tài)的列為單位進(jìn)行的操作。假設該步的一列的輸入為a,輸出為b,MixColumns對狀態(tài)的每列作用如下列表達式:
![]() |
上述矩陣乘法為GF(28)有限域中的乘法運算,并且有一個(gè)因子為常數。由于GF(28)有限域中的每一個(gè)元素都能夠寫(xiě)成02的不同冪次的和(例如:15=01○+022 ○+024),因此,乘以任何常數的乘法都可以通過(guò)反復的乘以02和異或運算來(lái)實(shí)現??蓪⒕仃嚦朔ㄖ械某狄蜃臃纸鉃?2的不同冪次和,矩陣乘法轉換為與02的乘法和異或運算。將GF(28)域中的每一個(gè)元素與02的乘積存儲在一張16*16 B查找表中,記作xtime(?)(例如:02*a=xtime(a))。所以,該步驟可以通過(guò)查表和異或運算實(shí)現,表達式如下(假設該步的一列的輸入為a,輸出為b):
![]() |
3.4 密鑰加法(AddRoundKey)
AddRoundKey是將輪密鑰中的各個(gè)字節與狀態(tài)中的各個(gè)字節逐位異或,實(shí)現密碼和密鑰的混合。輪密鑰是由初始密鑰通過(guò)密鑰擴展得到的。
3.5 密鑰擴展(ExpandedKey)
以明文分組長(cháng)度為128 b,密鑰長(cháng)度為128 b為例,ExpandedKey將初始密碼密鑰(初始密鑰可以形象的排列成一個(gè)4*4 B的矩陣)作為初始密鑰加法的密鑰,以后的各輪輪密鑰是經(jīng)過(guò)下列表達式的密鑰擴展函數得到的(K[i][j]表示初始密鑰狀態(tài)的第i行第j列,W[i][j]表示擴展后密鑰狀態(tài)的第i行第j列,Nk表示密鑰分組的列數,Nr表示輪數,Nb表示明文分組的列數,這里Nk=4,Nr=10,Nb=4):
當Nk≤6時(shí):
![]() |
其中,SRD(?)是S-盒的置換表,RC(j/Nk)是一個(gè)輪常量,用于消除對稱(chēng),可以通過(guò)查輪常量的表來(lái)得到。
密鑰的選?。旱趇輪的輪密鑰就是由矩陣W中第Nb*i列到Nb*(i+1)-1列給出。
3.6 流水線(xiàn)結構
流水線(xiàn)結構是實(shí)現流程中加入寄存器和相應的邏輯電路,將整個(gè)過(guò)程劃分為前后相連的多級實(shí)體,每一級只完成數據處理的一個(gè)步驟,一個(gè)時(shí)鐘周期完成一級數據處理,然后在下一個(gè)時(shí)鐘到來(lái)時(shí)將處理后的數據傳遞給下一級;第一組數據進(jìn)入流水線(xiàn)后,經(jīng)過(guò)一個(gè)時(shí)鐘周期傳遞到第二級,同時(shí)第二組數據進(jìn)入笫一級,數據隊列依次前進(jìn)。使一個(gè)時(shí)鐘內有多個(gè)數據塊同時(shí)在各級中處理。雖然每組數據都要經(jīng)過(guò)整個(gè)流水線(xiàn)后才能得到最后的計算結果,但是作為整個(gè)流水線(xiàn),每個(gè)時(shí)鐘周期都能計算出一組結果,所以平均計算一組數據幾乎只需要一個(gè)時(shí)鐘周期的時(shí)間,大大提高了數據處理速度,保證了整個(gè)系統以較高的頻率工作。
流水線(xiàn)技術(shù)通過(guò)同時(shí)處理多個(gè)數據塊的方法提高吞吐量,其代價(jià)是硬件資源的增加。流水線(xiàn)結構只能用于非反饋加密模式。
4 實(shí)現及仿真
整體的系統結構如圖3所示。圖中粗線(xiàn)代表數據線(xiàn),細線(xiàn)代表控制線(xiàn)??刂菩盘枏妮斎虢涌谶M(jìn)入,數據和密鑰通過(guò)數據總線(xiàn)進(jìn)入,根據控制模塊來(lái)進(jìn)行數據傳輸,更換密鑰和加密運算。
![]() |
從第3節的分析可以看出,AES算法可以通過(guò)對SRD表,xtime表和RC表的查詢(xún)和通過(guò)組合邏輯實(shí)現的移位和異或運算來(lái)實(shí)現。這些實(shí)現方法代替了繁瑣的乘法運算,提高了加密速度。
采用了流水線(xiàn)結構來(lái)同時(shí)處理多個(gè)數據塊,提高吞吐量。
使用輪函數完全展開(kāi)的開(kāi)環(huán)結構,將輪函數劃分成4級流水線(xiàn),輪函數中的每一個(gè)步驟都是一級,并在級與級之間加入寄存器暫存中間狀態(tài)的數據以消除競爭,從而實(shí)現了輪函教內部的完全流水,如圖4所示。
![]() |
其中,控制信號sel1,sel2.sel3干sel4分別是每一級(每一步數據)處理是否完成的標志。
在輪函數的外部,將每一輪函數都作為外部流水中的一級,從而實(shí)現了算法內部外部的完全流水結構,如圖5所示。
![]() |
其中,控制信號sel0~sel10分別是每一輪數據處理是否完成的標志。
由于采用流水線(xiàn)結構只能用于非反饋加密模式,所以AES算法的實(shí)現使用的是電碼本模式(ECB)的工作方式。
密鑰擴展這一步放在所有加密步驟之前進(jìn)行。再先輸入初始密鑰,然后通過(guò)對SRD表和RC表的查詢(xún)和通過(guò)組合邏輯實(shí)現的移位和異或運算完成密鑰的擴展,并將結果存儲在一個(gè)176 B的寄存器中。在密鑰擴展完成后再進(jìn)行以后的數據加密,在進(jìn)行每一輪的密鑰法時(shí),將直接在該寄存器中選擇輪密鑰。
針對AFS算法和FPGA的特點(diǎn),對每一步的處理都采用以字節為單位的對寄存器進(jìn)行操作的方式。往QuartusII5.0中,用VHDL硬件描述語(yǔ)言實(shí)現了該算法,經(jīng)過(guò)仿真,結果如下:
![]() |
5 擴展及應用
迎過(guò)FPGA來(lái)實(shí)現AES的解密算法(在此僅討論分組長(cháng)度為128 b,密鑰長(cháng)度為128 b時(shí)的情況),同樣可以用查找表和簡(jiǎn)單的組合邏輯來(lái)實(shí)現??紤]到使用等價(jià)解密算法沒(méi)有多少好處,所以選用直接解密算法,依舊可以采用輪函數內部外部完全流水的流水線(xiàn)技術(shù)來(lái)提高解密速度。
注意:
(1)解密算法中的逆字節代換這一步驟可通過(guò)查逆SRD表實(shí)現。
(2)解密算法中的逆行移變換這一步驟可直接將狀態(tài)的每一行循環(huán)右移實(shí)現,如下列表達式所示:
![]() |
也可以將狀態(tài)的第二行和第四行互換后進(jìn)行加密算法中的行移變換,然后再將變換后的狀態(tài)的第二行和第四行互換來(lái)實(shí)現解密算法中的逆行移變換這一步驟。這樣就利用了加密算法中的行移變換的模塊(此方法僅適用于分組長(cháng)度為128 b的情況)。
(3)解密算法中的逆列混合變換這一步驟中,由于矩陣乘法的系數為09,0E,0B,0D,如下列表達式所示(假設該步的一列的輸入為a,輸出為b):
![]() |
可以通過(guò)一個(gè)預處理步驟和一個(gè)列混合變換步驟來(lái)實(shí)現,頇處理步驟如下列表達式所示(a是一列):
![]() |
這樣就利用了加密算法中的列混合變換的模塊。
在同時(shí)支持加解密的模塊中,密鑰擴展和密鑰加法的部分可以同時(shí)用于這兩種模式,密鑰擴展部分只須輸入對應的肌密的初始密鑰后做和加密同樣的密鑰擴展,然后按照解密所需要使用的輪密鑰的順序重新排列,存入寄存器等待使用即可,這樣可以節約資源。
由此,可以將AES的加解密算法統一起來(lái),在一個(gè)FPGA模塊中實(shí)現。通過(guò)AVR或ARM等處理器的控制來(lái)選擇FPGA是執行加密過(guò)程還是解密過(guò)程以及是否更換新的初始密鑰,形成完整的加解密模塊,可作為單獨的密碼機使用或通過(guò)各種接口與計算機,工控機等其他主控設備連接完成對數據的加解密。
AES加解密算法可以應用于虛擬專(zhuān)用網(wǎng)、SONET、遠程訪(fǎng)問(wèn)服務(wù)器、高速ATM、以太路由器、移動(dòng)通信、衛星通信、電子金融業(yè)務(wù)等領(lǐng)域,為其提供安全、可靠、快速的解決方案。
fpga相關(guān)文章:fpga是什么
評論