張曉磊,戴紫彬,郭朋飛,李 楊
(信息工程大學(xué),河南 鄭州 450001)
隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展,智能穿戴、自動(dòng)駕駛、面部識(shí)別等應(yīng)用場(chǎng)景成為現(xiàn)實(shí),極大改變了人們的生活方式。物聯(lián)網(wǎng)設(shè)備大量使用,人體生理指標(biāo)、車輛行駛軌跡等用戶隱私數(shù)據(jù)[1]也隨之產(chǎn)生。由于大量用戶數(shù)據(jù)需要傳輸?shù)剿懔Ω鼜?qiáng)的計(jì)算終端,傳輸過程中的信息安全隱患[2]逐漸浮現(xiàn)并引起了人們的重視。因?yàn)槭芟抻诰o張的硬件資源,很多物聯(lián)網(wǎng)設(shè)備并未運(yùn)行必要的安全機(jī)制[3]。
密碼技術(shù)[4]作為保障信息安全的核心技術(shù),可在物聯(lián)網(wǎng)設(shè)備中進(jìn)行部署,傳統(tǒng)的部署方案主要有兩種[5],一種是通過運(yùn)行軟件實(shí)現(xiàn)密碼算法,這種方法利用了處理器的通用指令來支持不同的密碼算法,雖然較為靈活,但該方法存在計(jì)算速度慢、代碼密度低的問題;另一種是專用的密碼處理芯片,專用芯片雖然運(yùn)算速度快但存在靈活性低、成本高的問題。由于智能手環(huán)等物聯(lián)網(wǎng)終端存在計(jì)算資源緊張、存儲(chǔ)空間有限和電池容量較低等問題[6],傳統(tǒng)的部署方案不能很好地解決上述問題。擴(kuò)展專用密碼指令方案的出現(xiàn)則克服了上述兩種方案的缺點(diǎn),通過向通用處理器中添加密碼運(yùn)算單元,使處理器在不失通用性的同時(shí),還獲取了較高的密碼運(yùn)算性能。RISC-V 因?yàn)槠涠绦【返募軜?gòu)和模塊化的的設(shè)計(jì)理念已成為專用領(lǐng)域架構(gòu)的首選[7]。
在專用指令擴(kuò)展領(lǐng)域,學(xué)術(shù)界也有很多研究成果,李愛國等人[8]提出了利用MIPS 處理器中的乘法結(jié)果寄存器實(shí)現(xiàn)了對(duì)64 比特?cái)?shù)據(jù)的操作能力,同時(shí)利用處理器的空閑流水周期縮短密碼運(yùn)算的關(guān)鍵路徑,從而提升了密碼運(yùn)算速度,但該方案對(duì)處理器運(yùn)算路徑的修改增加了擴(kuò)展密碼指令的難度和硬件的復(fù)雜性。復(fù)旦大學(xué)的Wang Weizhen 等人[9]設(shè)計(jì)了基于Rocket 處理器的四級(jí)流水密碼協(xié)處理器并通過ROCC 接口擴(kuò)展了密碼指令。該協(xié)處理器采用同時(shí)支持128 位和256 位數(shù)據(jù)路徑的統(tǒng)一流水線結(jié)構(gòu),支持AES、ECC 和SHA 等加密算法。但該方案所集成的Rocket 處理器是通過Chisel 語言構(gòu)造的,目前該語言還未在業(yè)界得到廣泛應(yīng)用,對(duì)只熟悉Verilog 的芯片工程師進(jìn)一步研究和開發(fā)造成了困難。
本文通過分析基于RISC-V 的蜂鳥E203 處理器NICE 擴(kuò)展接口及AES 密碼算法,設(shè)計(jì)了基于蜂鳥E203處理器的密碼加速引擎,并進(jìn)行了仿真和FPGA 驗(yàn)證,實(shí)驗(yàn)結(jié)果表明,本文提出并實(shí)現(xiàn)的密碼加速方案獲得了較好的效能。
本節(jié)主要針對(duì)AES 算法輪函數(shù)運(yùn)算特點(diǎn),結(jié)合蜂鳥E203 處理器結(jié)構(gòu),提出密碼加速引擎設(shè)計(jì)及指令擴(kuò)展方案。
高級(jí)加密標(biāo)準(zhǔn)(AES)[10]是由比利時(shí)密碼專家Daemen J 和Rijmen V 提交的Rijndael 分組密碼算法經(jīng)過近3 年的激烈角逐最后勝出的對(duì)稱密碼加密標(biāo)準(zhǔn)。該算法具有高效能、易實(shí)現(xiàn)和靈活性高等特點(diǎn)。
AES 算法運(yùn)算過程在一個(gè)4 × 4(4 行4 列)的狀態(tài)矩陣上進(jìn)行,狀態(tài)矩陣如式(1)所示:
輪函數(shù)迭代lk輪完成運(yùn)算,算法的分組長度為128比特,密鑰長度Nr可以根據(jù)加密強(qiáng)度的需要設(shè)置為128、192 或256 比特,輪數(shù)lk取決于密鑰長度,兩者滿足關(guān)系式Nr=6 +lk/32。AES 算法加密過程如圖1 所示,輪函數(shù)包括字節(jié)替代變換、行移位變換、列混合變換和圈密鑰加法四個(gè)運(yùn)算,其中字節(jié)替代變換和行移位變換兩步運(yùn)算順序變化不會(huì)影響運(yùn)算結(jié)果,最后一輪輪函數(shù)沒有列混合變換。
圖1 AES 加密算法
Ben Marshall 等人[11]針對(duì)不同架構(gòu)處理器AES 算法加速方案進(jìn)行了分析和對(duì)比,本文針對(duì)物聯(lián)網(wǎng)場(chǎng)景下硬件資源緊湊的特點(diǎn),在文獻(xiàn)[11]的基礎(chǔ)上,采用字節(jié)替代、列混合和行移位融合計(jì)算的方法實(shí)現(xiàn)AES-128 加速。
輪函數(shù)首先對(duì)式(2)中狀態(tài)矩陣進(jìn)行字節(jié)替代(S 盒替代變換用sbox 表示):
隨后進(jìn)行行移位,如式(3)所示:
之后進(jìn)行列混合變換,它將一個(gè)狀態(tài)的每一列視為有限域GF(28) 上的一個(gè)多項(xiàng)式且與一個(gè)固定多項(xiàng)式a(x)={03}x3+{01}x2+{01}x+{02}模x4+1 相乘:
最后與輪密鑰key 相加:
將上述字節(jié)替代、行移位、列混合與輪密鑰相加合并后可得:
針對(duì)AES-128,進(jìn)一步換算后可得:
將式(7)分解為5 部分,即[sbox(a)·02 sbox(a) sbox(a) sbox(a)·03]T、[sbox(a)·03 sbox(a)·02 sbox(a) sbox(a)]T、[sbox(a) sbox(a)·03 sbox(a)·02 sbox(a)]T、[sbox(a) sbox(a) sbox(a)·03 sbox(a)·02]T和keyj。
分解之后發(fā)現(xiàn),除了與密鑰的異或運(yùn)算外,其余四個(gè)部分的計(jì)算可以用4 條自定義指令完成運(yùn)算,每條指令參與運(yùn)算的系數(shù)分別為{2,1,1,3}、{3,2,1,1}、{1,3,2,1}和{1,1,3,2},通過4 條自定義指令完成一次輪函數(shù)中一個(gè)字的運(yùn)算并存儲(chǔ)于32 比特位寬的寄存器中,這樣大大提高了運(yùn)算效率,并且不會(huì)消耗太多的硬件資源,需要注意的是解密運(yùn)算時(shí)參與有限域運(yùn)算的系數(shù)不同,其系數(shù)分別為{b,d,9,e}、{d,9,e,b}、{9,e,b,d}和{e,b,9,d}。
RISC-V 指令集由基礎(chǔ)指令集和擴(kuò)展指令集構(gòu)成,為了便于用戶擴(kuò)展,RISC-V 指令集設(shè)計(jì)之初便為用戶提供了custom-0、custom-1、custom-2 和custom-3 四個(gè)用戶自定義編碼空間,蜂鳥E203 處理器識(shí)別到上述四個(gè)類型的指令編碼后,就會(huì)把自定義擴(kuò)展指令通過擴(kuò)展接口派發(fā)給協(xié)處理器,由協(xié)處理器進(jìn)行譯碼、執(zhí)行和寫回等操作。蜂鳥E203 處理器支持的擴(kuò)展指令編碼格式[12]如圖2 所示,其中xd、xs1 和xs2 用來指示是否需要讀取rd、rs1 和rs2。
圖2 擴(kuò)展指令編碼格式
通過分析輪函數(shù)計(jì)算過程,四次計(jì)算中參與有限域乘法的系數(shù)不同,因此指令編碼中包含的信息應(yīng)當(dāng)能夠區(qū)分乘法系數(shù)的順序;因?yàn)樽詈笠惠嗇喓瘮?shù)僅需要完成字節(jié)替代函數(shù)和行移位運(yùn)算,所以指令編碼中也應(yīng)當(dāng)包括輪數(shù)信息以指示當(dāng)前計(jì)算的輪函數(shù)是否為最后一輪。
綜上所述,密碼擴(kuò)展指令編碼空間使用custom-0,通過funct7 字段區(qū)分系數(shù)順序和是否為最后一圈輪函數(shù),所有指令均為R 型指令,源操作數(shù)rs1 為上一次運(yùn)算結(jié)果,源操作數(shù)rs2 存儲(chǔ)狀態(tài)矩陣,目的寄存器存儲(chǔ)本次運(yùn)算結(jié)果。自定義擴(kuò)展指令根據(jù)運(yùn)算圈數(shù)和加解密狀態(tài)分為四類,具體編碼情況如表1 所示。
表1 自定義指令編碼
AES 狀態(tài)矩陣為一個(gè)4×4 的矩陣,每一個(gè)元素為一個(gè)字節(jié),共16 字節(jié)。蜂鳥E203 處理器為RV32IMAC 架構(gòu),寄存器位寬為32 bit,因此,四個(gè)寄存器可以表示一個(gè)狀態(tài)矩陣。
蜂鳥E203 處理器核的存儲(chǔ)器子系統(tǒng)結(jié)構(gòu)如圖3 所示,通用訪問指令首先通過地址產(chǎn)生單元(AGU)產(chǎn)生讀和寫指令的存儲(chǔ)器訪問地址,隨后通過存儲(chǔ)器訪問控制模塊(LSU)訪問與自定義總線(ICB)相連的存儲(chǔ)器。主處理器的LSU 為協(xié)處理器提供了專用訪存通道,與通用訪存指令類似,專用訪存指令也是將地址信息送到LSU并通過ICB 訪問存儲(chǔ)器。兩種方法不同之處是專用指令需要將主處理器分發(fā)的指令送到協(xié)處理器,協(xié)處理器需要進(jìn)行譯碼后再進(jìn)行訪存操作,針對(duì)執(zhí)行周期大于四個(gè)以上的指令,主處理器流水線會(huì)出現(xiàn)空泡。通過對(duì)訪存過程對(duì)比后發(fā)現(xiàn),一次讀寫多個(gè)數(shù)據(jù)相比一次讀寫一個(gè)數(shù)據(jù)而言,一條指令可以完成盡可能多的操作,但相應(yīng)地增加了協(xié)處理器硬件復(fù)雜度和指令的執(zhí)行周期,影響了主處理器的主頻。因此,本文采用通用訪存指令加載存儲(chǔ)狀態(tài)矩陣。
圖3 蜂鳥E203 處理器核存儲(chǔ)器子系統(tǒng)結(jié)構(gòu)示意
蜂鳥E203 處理器將擴(kuò)展指令通過NICE 接口派發(fā)到加速引擎,加速引擎通過對(duì)擴(kuò)展指令譯碼獲取必要的配置信息,AES 加速單元根據(jù)配置信息計(jì)算并將結(jié)果送至目的寄存器,加速引擎整體硬件結(jié)構(gòu)圖如圖4 所示。
圖4 協(xié)處理器整體結(jié)構(gòu)圖
蜂鳥E203 處理器的NICE 接口由請(qǐng)求通道、響應(yīng)通道、存儲(chǔ)器請(qǐng)求通道和存儲(chǔ)器響應(yīng)通道四個(gè)通道組成,主處理器通過NICE 接口向加速引擎發(fā)起調(diào)用請(qǐng)求。NICE 接口采用valid-ready 機(jī)制實(shí)現(xiàn)同步握手,完成握手后,協(xié)處理器將會(huì)獲得完整的擴(kuò)展指令編碼、源操作數(shù)1和源操作數(shù)2 的值,當(dāng)協(xié)處理器完成運(yùn)算后,將會(huì)通過接口發(fā)送運(yùn)算完成信號(hào),握手時(shí)序如圖5 所示。
圖5 NICE 接口處理時(shí)序圖
通過對(duì)擴(kuò)展指令編碼的func7 字段分析,運(yùn)算系數(shù)順序編碼、是否為最后一輪等編碼信息和原操作數(shù)共同送到配置寄存器。配置寄存器的值只有在完成譯碼后才會(huì)更新,AES 運(yùn)算加速部件根據(jù)配置寄存器的值運(yùn)算并將結(jié)果送到目的寄存器。
AES 加速部件首先根據(jù)加密工作狀態(tài)判斷進(jìn)行S 盒或反S 盒變換,傳統(tǒng)的S 盒查表方法[5]是通過計(jì)算索引地址來加載替換信息,該操作一般需要四條通用指令完成,而本文通過邊計(jì)算邊查表的方式極大地節(jié)省了指令數(shù)目,加快了運(yùn)算速度。完成式(1)即字節(jié)替代操作后將得到的結(jié)果進(jìn)行列混合運(yùn)算,運(yùn)算時(shí)將式(1)得到的字節(jié)與2、3、9、11、13 和14 相乘,根據(jù)加解密工作狀態(tài)選擇相應(yīng)的乘數(shù),隨后依據(jù)系數(shù)順序信息選擇相應(yīng)的運(yùn)算結(jié)果,最后將運(yùn)算的結(jié)果與密鑰異或得到狀態(tài)矩陣一列的運(yùn)算結(jié)果,密碼運(yùn)算部件結(jié)構(gòu)如圖6 所示。
圖6 AES 加速部件結(jié)構(gòu)圖
本文設(shè)計(jì)的密碼加速引擎需要編寫軟件代碼,以自定義指令的形式調(diào)用密碼加速引擎完成密碼運(yùn)算加速。首先使用IC 前端仿真軟件完成對(duì)密碼擴(kuò)展指令的實(shí)現(xiàn)和驗(yàn)證,通過仿真工具仿真處理器密碼運(yùn)算過程,完成協(xié)處理器的功能驗(yàn)證。最后在FPGA 平臺(tái)上進(jìn)行實(shí)現(xiàn)并對(duì)協(xié)處理器資源占用、功耗、性能等做出評(píng)估,圖7 為FPGA 驗(yàn)證環(huán)境。
圖7 FPGA 驗(yàn)證環(huán)境圖
為AES 密碼算法設(shè)計(jì)加密子密鑰生成,解密子密鑰生成、加密運(yùn)算和解密運(yùn)算四個(gè)函數(shù),使用在C 語言中內(nèi)聯(lián)匯編的方式進(jìn)行編程,需要按照GCC 編譯器的規(guī)定將參數(shù)存儲(chǔ)到約定的寄存器中。
如圖8 所示,軟硬件協(xié)同工作的流程如下:以加密運(yùn)算為例,密鑰固定在程序中,待加密的明文通過串口輸入。按照約定的格式從存儲(chǔ)器中加載狀態(tài)矩陣,加載操作需32 條指令完成。調(diào)用自定義密碼運(yùn)算指令完成16輪輪函數(shù),一輪輪函數(shù)需要調(diào)用自定義運(yùn)算指令16 次,完成一次狀態(tài)矩陣更新需要160 條指令完成,因此,加密一次長度為128 比特的明文需要不足200 條指令,可見采用該方法效率較高。
圖8 軟硬件協(xié)同工作數(shù)據(jù)流圖
AES 算法程序的密鑰為0x0f1571c947d9e8590cb7 add6af7f6798,單分組明文輸入為0x0123456789abcdeffedcba9876543210,通過仿真得到加密結(jié)果為0xff0b844a0853bf7c6934ab4364148fb9,與標(biāo)準(zhǔn)向量一致。如圖9 所示,區(qū)域A 為加密密鑰擴(kuò)展過程波形,區(qū)域B 為加密過程波形,區(qū)域C 為解密密鑰擴(kuò)展過程和解密過程波形。
圖9 加速引擎波形圖
如圖10 所示,通過執(zhí)行4 條自定義指令計(jì)算完成了狀態(tài)矩陣其中一列運(yùn)算結(jié)果。
圖10 完整加密過程
根據(jù)表2 所示運(yùn)行結(jié)果可以看出,通過使用自定義指令,程序所需指令和周期數(shù)大幅減少。文獻(xiàn)[7]中,同樣以RISC-V 指令集為基礎(chǔ),通過擴(kuò)展多種密碼指令實(shí)現(xiàn)了多種密碼算法。與本文AES 算法單分組明文加密性能作對(duì)比,如表3 所示,本文提出的加速方案需要更少的周期數(shù),仍然獲得了較好的加密性能。
表2 軟件運(yùn)行情況
表3 單分組明文加密性能
本文使用的 FPGA 驗(yàn)證平臺(tái)為采用 Xilinx XC7A200T-2 FPGA 芯片的FPGA 開發(fā)板。對(duì)FPGA 工作頻率約束在100 MHz,經(jīng)Vivado 軟件綜合、布局布線后,內(nèi)部資源利用情況如表4 所示,實(shí)驗(yàn)結(jié)果證明本文提出的設(shè)計(jì)方案消耗資源較少,適用于硬件資源緊張的場(chǎng)景。
表4 FPGA 資源使用情況
本文分析了AES 輪函數(shù)運(yùn)算過程,本著節(jié)省硬件資源和提高并行性的原則,設(shè)計(jì)了基于蜂鳥E203 的AES加速引擎,運(yùn)行對(duì)比了包含擴(kuò)展指令的程序和不包含擴(kuò)展指令的算法程序,通過對(duì)運(yùn)行結(jié)果分析,本文實(shí)現(xiàn)的密碼加速引擎取得了較好的加速效果。為了充分發(fā)揮蜂鳥處理器低功耗和可擴(kuò)展的特性,下一步將進(jìn)一步分析SM3 密碼算法,提高雜湊運(yùn)算速度,進(jìn)一步完善身份認(rèn)證、安全啟動(dòng)等功能,以構(gòu)建一個(gè)較為完善的安全SoC 驗(yàn)證系統(tǒng)。