李晨琪 袁國材 樊 榮
(中國船舶集團有限公司第七二二研究所 武漢 430205)
隨著信息技術的發展,信息的傳輸與交互越來越頻繁,由此帶來的信息安全問題也在近年來成為人們關注的焦點[1]。在實現信息傳輸的過程中,使用密碼技術對數據進行處理是保證信息安全的重要技術手段。其中,SM4分組密碼算法由我國自主設計,于2012年3月由國家密碼管理局作為我國采用的一種分組密碼標準發布。
對于數據加密算法,常見的分組密碼算法有美國的AES 標準[2]以及中國的SM4 標準,且SM4 的安全特性等效于AES-128[3]。SM4 作為一種分組密碼算法,其分組長度及密鑰長度均為128 bit,加密算法與密鑰擴展算法均采用32 輪非線性迭代結構。SM4 算法常見的實現方式有硬件實現與軟件實現。其中,基于硬件實現時,需要將算法部分固化進硬件電路,其高性能的表現建立在高資源開銷的基礎上。雖然目前已有諸多降低SM4 算法硬件電路開銷的方法被提出,例如通過部分架構重用降低復雜度[4],通過基于復合域計算實現Sbox來降低存儲Sbox 數據所需硬件開銷[5]以及基于異步多米諾邏輯實現SM4 算法[6],但其總體硬件資源開銷仍較大,且在需要支持多種算法的情況下會導致成本累加[7]。相比硬件實現,軟件實現具有成本低、靈活性強的特點,但同時存在性能差的弊端。微處理器指令擴展技術作為一種相對折中的方式,通過增加SM4算法相關的微處理器指令,采用硬件實現影響密碼算法性能的基本操作部件[8],實現以較低的硬件資源開銷換取使用微處理器實現算法時性能的提升。
目前,通過擴展處理器指令集的方式實現對密碼算法加速的方式已經被一定程度地應用到了實際的處理器中。例如,基于x86 指令集架構的Intel AES-NI[9],用于改進應用程序使用AES 算法執行加密和解密的速度;基于ARMv8-A 架構的密碼指令擴展,包括在ARMv8.2-SM 中實現的面向SM3 以及SM4 算法的擴展指令。這些擴展指令均已被實際應用于人們日常使用的計算機等終端設備中,但卻并不適用于一些小型處理器。RISC-V架構的處理器由于其開源、靈活以及資源節約等特性,更適用于資源有限的環境,基于RISC-V 的SM4 算法擴展指令也不斷地被提出與設計實現,如文獻[10]中針對SM4 算法的擴展指令使加密性能提升至少5倍,文獻[11]中使用擴展指令形成SM4算法的軟硬件協同實現機制使吞吐率提升至少4.47倍。
本文選擇基于開源指令集RISC-V以及開源小型處理器VexRiscv[12],設計實現一種針對SM4密碼算法的擴展指令,使用Xilinx Artix-7 FPGA 進行實際測試并對其硬件資源開銷、加解密性能進行分析評估。通過本文設計實現的擴展指令的使用對比無擴展指令的SM4算法軟件方式實現,針對不同字節長度數據塊進行加密,性能提升約8~14 倍;在增加該擴展指令集后,處理器的總體硬件資源開銷相比于不包含SM4 算法擴展指令僅增加59LUΤs,遠低于增加基于硬件實現的SM4 算法部分帶來的硬件開銷。
本文提出的SM4算法擴展指令,是基于已公開國密算法標準設計實現的硬件擴展指令。SM4 算法包括加密算法部分以及密鑰算法擴展部分(如圖1),加密算法以及密鑰擴展算法均采用32 輪非線性迭代結構,因而我們只需減少單次迭代的實現時間即可達到針對性能的提升。由此,本文針對密碼算法部分以及密鑰擴展部分的輪函數提出表1 中所示兩條SM4 算法擴展指令,指令sm4ed用于實現加解密算法輪函數中的部分運算,指令sm4ks用于實現密鑰擴展輪函數中的部分運算。

圖1 SM4密碼算法

表1 SM4密碼算法擴展指令集
本文設計實現的SM4密碼算法擴展指令,使用兩個源寄存器、一個目的寄存器以及長度為1 bit的標志位fn用以區別表示兩條擴展指令,即表1 中所列標志位取值。指令的執行過程,將先獲取源寄存器rs2 中的數據,根據fn的值選擇相應的運算過程進行運算,并將指令執行結果寫入目的寄存器rd。基于以上需求,結合圖2(a)中所示RV32 主要指令結構,本文選擇采用RV32 R-type 指令格式,設計SM4算法擴展指令編碼格式如圖2(b)所示。

圖2 RV32 R-type及SM4擴展指令格式
在傳統的處理器設計中,一條指令是分為多個流水階段執行的。流水線階段劃分越多,越能減少流水線每階段所需要的邏輯深度。經典的處理器設計中常應用五階流水線結構,即取值、譯碼、執行、訪存及寫回階段。在諸多基于傳統硬件描述語言設計的開源RISC 處理器中,多階段的流水線結構往往對應多個硬件描述語言編寫成的模塊,如SCR1[13]以及CV32E40P[14],在實現對指令集擴展的過程中需要對流水線各階段的實現代碼都進行一定程度的修改,這對于實現擴展指令的增加操作并不友好。因此,在諸多開源RISC-V的處理器中,我們選擇了基于VexRiscv 處理器來實現我們的SM4密碼算法擴展指令。
VexRiscv 處理器基于SpinalHDL 語言實現,指令的執行過程可根據需求配置為2~5 級流水線,同時,它不再以流水線的階段作為模塊的劃分對象,而是根據功能劃分實現處理器各組成部。因此,在實現指令的增加與擴展時,只需要按照功能增加相關的模塊,而不需要對原有處理器結構等內容做出修改,這為我們的實現以及優化工作提供了便利。
根據兩條指令的功能,我們將指令的執行過程適配于五階流水線結構,數據的運算結果將在訪存階段運算完成并在寫回階段被寫回至目的寄存器rd。依據圖1 中所示SM4 密碼算法實現過程并結合實際運行需要,本文中設計實現的兩條SM4密碼算法擴展指令其軟件端的調用格式在表1 中給出,對應參數取值及運算過程如圖3所示。
SM4 密碼算法的實現過程包含圖1 中所示32輪次迭代運算,單次迭代過程如圖3(a)所示。對于第i次執行輪函數F,其輸入參數可劃分為圖3(a)中rs1、rs2 框中所示兩部分,對應sm4ed指令調用格式中所列參數rs1 與rs2;其輸出結果如圖3(a)中rd框中所示,對應sm4ed指令調用格式中rd。實際應用時,本文將每4 次迭代過程視為一組運算過程,對于SM4 密碼算法的整體實現過程可看作8組運算過程,則SM4 加密算法中32 輪迭代可通過如下代碼實現:


圖3 SM4算法擴展指令實現內容
上述代碼中,部分異或運算可以復用,因此在實際實現過程中,每組運算可進一步減少兩次異或運算,即僅調用10次異或運算指令以及4次sm4ed指令,使得單次迭代指令條數為3.5 條。密鑰擴展部分迭代過程與密碼算法部分基本一致,sm4ks指令的調用參數取值及指令執行結果如圖3(b)中rs1,rs2 以及rd框中所示。
為驗證SM4 密碼算法擴展指令功能并對其資源開銷以及運算性能加以評估,本文基于開源RISC-V處理器VexRiscv,使用SpinalHDL語言描述實現,并基于Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)進行實際驗證與測試。本文對硬件資源開銷以及加解密性能方面進行了相關的測試并給出分析。
為了評估硬件資源所需的開銷,本文將不包含SM4 算法擴展指令與包含SM4 算法擴展指令的VexRiscv 處理器分別以100MHz 的時鐘頻率進行綜合,硬件資源開銷數據結果如表2 所示。對表2中綜合結果LUΤs 的開銷進行分析,在增加SM4 密碼算法擴展指令后,處理器整體硬件資源開銷僅增加59 個LUΤs,相比于不包含SM4 算法擴展指令時處理器整體硬件資源開銷增加約1.60%。文獻[15]中針對SM4算法使用多種硬件架構進行實現,本文選取其硬件資源開銷最小的數據作為本文硬件資源開銷評估的參考。通過擴展指令集的方式實現SM4 算法帶來的硬件資源開銷遠低于基于硬件實現方式所需的硬件資源開銷。

表2 基于Artix-7 FPGA 綜合結果
基于SM4算法的軟件實現過程中,將需要調用多條基礎指令進行運算的可重復過程使用單條擴展指令替代,則可以通過大幅減少指令條數實現對性能的提升。文獻[7]中以字節為單位設計實現SM4算法擴展指令,實現了單次迭代過程指令調用數為6.5條;本文設計實現的SM4算法擴展指令,單條指令可完成對4 字節的運算過程,因此能夠實現單次迭代過程所需指令數僅為3.5 條,相較于文獻[7]進一步減少。
為進一步對性能表現加以評估,本文將SM4算法基于VexRiscv 處理器分別采用使用指令集以及不使用指令集進行軟件實現,并通過在Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)上實際測試得出數據結果見圖4。由于SM4 算法存在密鑰擴展部分的特性,在實現加解密過程中,對較長數據進行加密時,其總體加密性能將優于對短字節長度數據進行加密,且在字節長度較大時密鑰擴展部分實現過程的時鐘消耗占比極低,則總體吞吐率將趨近于單獨實現SM4算法部分的運算性能。由此,本文分別對比不同長度(16 字節~16384 字節)的數據塊進行加密計算。從圖4 可以看出,本文設計的SM4算法擴展指令對比無擴展指令的軟件實現,基于不同長度數據性能提升8.96倍~14.33倍,對于長數據塊進行加解密運算時帶來的性能提升程度更大,最大吞吐率可達81.82Mbit/s。

圖4 SM4算法性能測試結果
本文針對SM4 算法,基于開源RISC-V 指令集以及VexRiscv微處理器,提出了兩條針對實現SM4密鑰擴展算法以及加解密算法的擴展指令,完成了相應的硬件電路設計與實現,基于Xilinx Artix-7 FPGA進行了實際應用及測試。通過實際測試結果來看,本文設計實現的SM4 算法擴展指令,在低硬件資源開銷的同時,與無擴展指令的實現方式相比,減少了算法實現過程中調用的指令數,提升了加解密運算性能,在100MHz 時鐘頻率下,對于長字節數據塊加解密過程吞吐率提升至無擴展指令時的14.33 倍,達到81.82Mbit/s。未來我們將繼續完善基于現有SM4擴展指令的優化工作,并嘗試實現針對其他密碼算法的擴展指令來更好地滿足不同使用環境下對不同密碼算法實現性能加速的需求。