孫海燕,谷子茜
(北方工業大學,北京,100091)
美國國家標準技術研究所(NIST)在2001年發布了高級加密標準(Advanced Encryption Standard,AES)。AES是一種迭代分組加密算法,具有安全性能高、加密效率高等優點,廣泛應用于現代社會的信息安全加密中。目前國內外大量文獻研究了AES的安全性能和實現緊湊AES的方案,隨著AES廣泛應用于可穿戴設備、消費電子、移動通訊終端等需要低功耗的場景,對其低功耗的研究也越來越受到關注。
國內外對AES算法的低功耗、小面積等的研究主要集中在對S-盒的研究上,其主要的實現方案有:查找表(Look-up table,LUT)方案[1]、基于有限域GF(28)上實現的運算方案[2-6]、專用硬件加密的解碼-置換-編碼(Decode Switching Encode, DSE)方案[7]等;以及通過改變數據路徑位寬[5,8]來減小AES的面積。少有論文從密鑰擴展的角度來優化以提升綜合性能。
本文在AES-128加解密算法中的三種常用鏈接算法(ECB、CBC、CTR)[9]的使用條件下,提出了采用40x32 SRAM對密鑰進行存儲的方案,以使其在使用同一密鑰對一個明文塊加密或對一個密文塊解密的計算過程中,無需重復進行密鑰擴展,既提升了運算速度,又能有效降低功耗。此方案適用于含ECB/CBC/CTR鏈接算法的AES加密和解密運算中。
電子密碼本(ECB)模式是最簡單的加密/解密模式。每次加密/解密時,首先輸入密鑰,然后使用相同的密鑰加密一整個明文塊。每個明文塊/密文塊可以分成若干個128位的明文/密文分組,依次輸入進行數據加密/解密。其加密/解密過程可以用公式(1)表示。

其中K為密鑰,j為加密/解密的數據塊序數,Cj為第j塊的密文,Pj為第j塊的明文,Enc表示加密運算,Dec表示解密運算。
密碼塊鏈接(CBC)模式的加密/解密過程可以用公式(2)表示。

其中,IV為初始向量值,IV與明文/密文分組長度一致。CBC鏈接算法與ECB的不同之處在于其在每一次加密之前或解密之后需要與向量值進行異或操作,提升了AES數據塊加密/解密的安全性。
計數器模式(CTR)也是常用的提高安全性的鏈接算法。其加密/解密過程可以用公式(3)表示。

其中,T為含計數器的IV值。與CBC模式不同的是,CTR模式的初始向量的低32位作為計數器,每完成一次加密/解密運算,計數器的值加一,其高96位的值保持不變;且該鏈接算法只需用到加密算法,加密或解密后的值與IV值進行異或即可得到密文/明文。
AES-128的每次加密/解密運算包括10次輪變換運算和10次密鑰擴展運算,其變換形式為矩陣變換。加密運算的每輪變換過程依次為:字節替換、行移位、列混淆、輪密鑰加;解密運算的每輪變換過程依次為:逆列混淆、逆行移位、逆字節替換、輪密鑰加。其中,第一輪運算之前會進行一次輪密鑰加運算,最后一輪運算不會進行列混淆/逆列混淆運算[9]。本文的設計中,由于后續采用改進的32bit數據路徑的AES輪變換運算,為便于進行分時復用,將解密運算模塊采用了另一種等效的運算方式——解密的過程依次為:逆字節替換、逆行移位、逆列混淆、輪密鑰加。并在第1至9輪的輪密鑰加運算中,將密鑰進行逆列混淆運算后再用于輪密鑰加運算,詳細過程及原理如文獻[9]中第六章所闡述。
由第二節可知,在ECB/CBC/CTR的鏈接算法中,對一個數據塊進行加密或解密時使用的是給定的同一個密鑰,若每次加密/解密均進行密鑰擴展,則會產生不必要的能量消耗,并且降低運算速度。因此,本設計的AES加密解密器,對加密和解密的密鑰擴展模塊通過分時復用的方式進行了結合使用。在一個數據塊的加密/解密過程中,進行第一次加密/解密之前完成密鑰擴展,并將密鑰存儲起來。后續的加密/解密可直接取用密鑰,從而省去了后續的每次加密/解密中的密鑰擴展過程,減少了能量消耗并提升了整個數據塊加解密的運算速度。
每一組密鑰均有128位的位寬,而完成一次AES加密/解密運算一共需要(包括初始密鑰在內)的11組密鑰。若用寄存器來存儲密鑰,則至少需要1280個寄存器用于存儲擴展之后的密鑰,每個寄存器上時鐘的翻轉都會產生動態功耗,寄存器數量較大會導致功耗較高,因此可以采用SRAM來代替寄存器用于存儲密鑰。
由于SRAM IP核的結構限制,最小應選擇32字的SRAM,若采用32x128的SRAM會導致大量的資源浪費,因此本文設計了采用40x32的SRAM,不僅可以充分利用SRAM的資源,而且其面積更小。更重要的是,其所需的線更少,因而寄生電容更小,功耗也就相對更低。40x32 SRAM在加密/解密時對密鑰的寫入和讀取過程如圖1所示。

圖1 采用40x32 SRAM的密鑰存儲和讀取過程
其中,aes_key3、aes_key2、aes_key1、aes_key0為輸入的初始密鑰,數據位寬為32,存儲于密鑰寄存器中,故不需要占用SRAM的空間;key_cnt為密鑰擴展的輪數,每一輪擴展的密鑰分4次依次寫入至SRAM中;round_cnt為加密/解密的輪數,加密時按加密輪數以0~39的地址順序取出密鑰用于輪密鑰加模塊的運算,解密時按解密輪數以39~0的地址順序取出密鑰,密鑰經逆列混淆運算后用于輪密鑰加運算。
本設計由于選用了40x32 SRAM,每次讀取的密鑰為32bit,故本設計采用32bit數據路徑進行加密/解密更為合適,讀取的密鑰可直接用于加解密運算。本文參考文獻[8]提出的32bit數據路徑實現的AES并對其進行了優化,設計了加密和解密兩種模式分時復用的AES運算模塊。密鑰擴展模塊仍然采用40x32 SRAM來存儲密鑰,如圖2所示。

圖2 采用32bit數據路徑的加解密輪變換結構
狀態寄存器由16個8位的寄存器組成,也稱為“狀態矩陣”,這些寄存器又被進一步分為4個4級移位寄存器。在本設計中,基于行移位的原理,在加密中,通過選擇狀態矩陣第[127:120]、[87:80]、[47:40]、[7:0]位(解密中選擇[127:120]、[23:16]、[47:40]、[71:64]位)作為每次移位后的輸出,輸出后直接進行S-盒運算,然后依次進行列混淆運算和輪密鑰加運算。這種方式徹底消除了行移位操作,從而可以節省面積和降低功耗。
同時,本設計的密鑰擴展模塊與輪變換模塊共用了1個S-盒,整個設計只采用了4個S盒和1個列混淆,可以大大地節省面積;本設計的S-盒采用了文獻[7]提出的解碼-交換-編碼方案實現的S-盒,有效降低了S-盒的功耗,并通過對AES中的大量寄存器采用時鐘門控技術,大大降低了AES的整體功耗。
對不同方案實現的AES加密解密器,使用Verilog硬件描述語言編寫RTL代碼,通過Modelsim平臺仿真驗證其功能,采用Synopsys Design Compiler綜合工具,SMIC 55nm工藝庫,選用ss工藝角,電壓1.08V,溫度125℃,將RTL代碼轉換成網表文件并生成SDC文件,通過IC Compiler進行布局布線,生成帶有時鐘樹的.output.v網表文件,經過PrimeTime對其進行時序約束并生成SDF文件,在testbench中添加該SDF文件,并通過VCS對.output.v網表文件進行后端仿真,生成FSDB文件,查看FSDB文件的波形是否正確并選取一段相同的運算過程,生成相應的SAIF文件,通過PrimeTime PX工具對該SAIF文件進行功耗分析。在50MHz頻率下的面積和功耗分析結果如表1所示。

表1 分析結果
性能分析的結果顯示,優化后的AES加密解密器的面積為24880μm2,在50MHz的頻率下,加密器的功耗為197uW,解密器的功耗為199uW;優化后的AES加密解密器的面積比未優化的AES降低了46.4%,加密運算時的功耗降低了42.4%,解密運算時的功耗降低了37.8%。由此可知,改進的AES的面積和功耗均大幅度降低。
將本文的AES與其它一些論文的AES的綜合性能進行了比較,結果如表2所示。

表2 比較結果
與采用其它設計的文獻[8,10-12]相比,雖然工藝的改進可以有效降低功耗,但是本文提出的方案仍然明顯低于其它論文的功耗。
本文針對ECB、CBC、CTR鏈接算法采用同一密鑰對一個數據塊進行加解密的情況,提出了采用40x32 SRAM對擴展后的密鑰進行存儲的方案,并采用32bit的數據路徑實現了改進的AES運算模塊。改進后的AES相比未改進的AES,功耗和面積均大幅度降低。與其它文獻中設計的低功耗AES方法相比,本文的設計也具有更低的功耗。