李晨琪 袁國(guó)材 樊 榮
(中國(guó)船舶集團(tuán)有限公司第七二二研究所 武漢 430205)
隨著信息技術(shù)的發(fā)展,信息的傳輸與交互越來越頻繁,由此帶來的信息安全問題也在近年來成為人們關(guān)注的焦點(diǎn)[1]。在實(shí)現(xiàn)信息傳輸?shù)倪^程中,使用密碼技術(shù)對(duì)數(shù)據(jù)進(jìn)行處理是保證信息安全的重要技術(shù)手段。其中,SM4分組密碼算法由我國(guó)自主設(shè)計(jì),于2012年3月由國(guó)家密碼管理局作為我國(guó)采用的一種分組密碼標(biāo)準(zhǔn)發(fā)布。
對(duì)于數(shù)據(jù)加密算法,常見的分組密碼算法有美國(guó)的AES 標(biāo)準(zhǔn)[2]以及中國(guó)的SM4 標(biāo)準(zhǔn),且SM4 的安全特性等效于AES-128[3]。SM4 作為一種分組密碼算法,其分組長(zhǎng)度及密鑰長(zhǎng)度均為128 bit,加密算法與密鑰擴(kuò)展算法均采用32 輪非線性迭代結(jié)構(gòu)。SM4 算法常見的實(shí)現(xiàn)方式有硬件實(shí)現(xiàn)與軟件實(shí)現(xiàn)。其中,基于硬件實(shí)現(xiàn)時(shí),需要將算法部分固化進(jìn)硬件電路,其高性能的表現(xiàn)建立在高資源開銷的基礎(chǔ)上。雖然目前已有諸多降低SM4 算法硬件電路開銷的方法被提出,例如通過部分架構(gòu)重用降低復(fù)雜度[4],通過基于復(fù)合域計(jì)算實(shí)現(xiàn)Sbox來降低存儲(chǔ)Sbox 數(shù)據(jù)所需硬件開銷[5]以及基于異步多米諾邏輯實(shí)現(xiàn)SM4 算法[6],但其總體硬件資源開銷仍較大,且在需要支持多種算法的情況下會(huì)導(dǎo)致成本累加[7]。相比硬件實(shí)現(xiàn),軟件實(shí)現(xiàn)具有成本低、靈活性強(qiáng)的特點(diǎn),但同時(shí)存在性能差的弊端。微處理器指令擴(kuò)展技術(shù)作為一種相對(duì)折中的方式,通過增加SM4算法相關(guān)的微處理器指令,采用硬件實(shí)現(xiàn)影響密碼算法性能的基本操作部件[8],實(shí)現(xiàn)以較低的硬件資源開銷換取使用微處理器實(shí)現(xiàn)算法時(shí)性能的提升。
目前,通過擴(kuò)展處理器指令集的方式實(shí)現(xiàn)對(duì)密碼算法加速的方式已經(jīng)被一定程度地應(yīng)用到了實(shí)際的處理器中。例如,基于x86 指令集架構(gòu)的Intel AES-NI[9],用于改進(jìn)應(yīng)用程序使用AES 算法執(zhí)行加密和解密的速度;基于ARMv8-A 架構(gòu)的密碼指令擴(kuò)展,包括在ARMv8.2-SM 中實(shí)現(xiàn)的面向SM3 以及SM4 算法的擴(kuò)展指令。這些擴(kuò)展指令均已被實(shí)際應(yīng)用于人們?nèi)粘J褂玫挠?jì)算機(jī)等終端設(shè)備中,但卻并不適用于一些小型處理器。RISC-V架構(gòu)的處理器由于其開源、靈活以及資源節(jié)約等特性,更適用于資源有限的環(huán)境,基于RISC-V 的SM4 算法擴(kuò)展指令也不斷地被提出與設(shè)計(jì)實(shí)現(xiàn),如文獻(xiàn)[10]中針對(duì)SM4 算法的擴(kuò)展指令使加密性能提升至少5倍,文獻(xiàn)[11]中使用擴(kuò)展指令形成SM4算法的軟硬件協(xié)同實(shí)現(xiàn)機(jī)制使吞吐率提升至少4.47倍。
本文選擇基于開源指令集RISC-V以及開源小型處理器VexRiscv[12],設(shè)計(jì)實(shí)現(xiàn)一種針對(duì)SM4密碼算法的擴(kuò)展指令,使用Xilinx Artix-7 FPGA 進(jìn)行實(shí)際測(cè)試并對(duì)其硬件資源開銷、加解密性能進(jìn)行分析評(píng)估。通過本文設(shè)計(jì)實(shí)現(xiàn)的擴(kuò)展指令的使用對(duì)比無擴(kuò)展指令的SM4算法軟件方式實(shí)現(xiàn),針對(duì)不同字節(jié)長(zhǎng)度數(shù)據(jù)塊進(jìn)行加密,性能提升約8~14 倍;在增加該擴(kuò)展指令集后,處理器的總體硬件資源開銷相比于不包含SM4 算法擴(kuò)展指令僅增加59LUΤs,遠(yuǎn)低于增加基于硬件實(shí)現(xiàn)的SM4 算法部分帶來的硬件開銷。
本文提出的SM4算法擴(kuò)展指令,是基于已公開國(guó)密算法標(biāo)準(zhǔn)設(shè)計(jì)實(shí)現(xiàn)的硬件擴(kuò)展指令。SM4 算法包括加密算法部分以及密鑰算法擴(kuò)展部分(如圖1),加密算法以及密鑰擴(kuò)展算法均采用32 輪非線性迭代結(jié)構(gòu),因而我們只需減少單次迭代的實(shí)現(xiàn)時(shí)間即可達(dá)到針對(duì)性能的提升。由此,本文針對(duì)密碼算法部分以及密鑰擴(kuò)展部分的輪函數(shù)提出表1 中所示兩條SM4 算法擴(kuò)展指令,指令sm4ed用于實(shí)現(xiàn)加解密算法輪函數(shù)中的部分運(yùn)算,指令sm4ks用于實(shí)現(xiàn)密鑰擴(kuò)展輪函數(shù)中的部分運(yùn)算。
圖1 SM4密碼算法
表1 SM4密碼算法擴(kuò)展指令集
本文設(shè)計(jì)實(shí)現(xiàn)的SM4密碼算法擴(kuò)展指令,使用兩個(gè)源寄存器、一個(gè)目的寄存器以及長(zhǎng)度為1 bit的標(biāo)志位fn用以區(qū)別表示兩條擴(kuò)展指令,即表1 中所列標(biāo)志位取值。指令的執(zhí)行過程,將先獲取源寄存器rs2 中的數(shù)據(jù),根據(jù)fn的值選擇相應(yīng)的運(yùn)算過程進(jìn)行運(yùn)算,并將指令執(zhí)行結(jié)果寫入目的寄存器rd?;谝陨闲枨螅Y(jié)合圖2(a)中所示RV32 主要指令結(jié)構(gòu),本文選擇采用RV32 R-type 指令格式,設(shè)計(jì)SM4算法擴(kuò)展指令編碼格式如圖2(b)所示。
圖2 RV32 R-type及SM4擴(kuò)展指令格式
在傳統(tǒng)的處理器設(shè)計(jì)中,一條指令是分為多個(gè)流水階段執(zhí)行的。流水線階段劃分越多,越能減少流水線每階段所需要的邏輯深度。經(jīng)典的處理器設(shè)計(jì)中常應(yīng)用五階流水線結(jié)構(gòu),即取值、譯碼、執(zhí)行、訪存及寫回階段。在諸多基于傳統(tǒng)硬件描述語(yǔ)言設(shè)計(jì)的開源RISC 處理器中,多階段的流水線結(jié)構(gòu)往往對(duì)應(yīng)多個(gè)硬件描述語(yǔ)言編寫成的模塊,如SCR1[13]以及CV32E40P[14],在實(shí)現(xiàn)對(duì)指令集擴(kuò)展的過程中需要對(duì)流水線各階段的實(shí)現(xiàn)代碼都進(jìn)行一定程度的修改,這對(duì)于實(shí)現(xiàn)擴(kuò)展指令的增加操作并不友好。因此,在諸多開源RISC-V的處理器中,我們選擇了基于VexRiscv 處理器來實(shí)現(xiàn)我們的SM4密碼算法擴(kuò)展指令。
VexRiscv 處理器基于SpinalHDL 語(yǔ)言實(shí)現(xiàn),指令的執(zhí)行過程可根據(jù)需求配置為2~5 級(jí)流水線,同時(shí),它不再以流水線的階段作為模塊的劃分對(duì)象,而是根據(jù)功能劃分實(shí)現(xiàn)處理器各組成部。因此,在實(shí)現(xiàn)指令的增加與擴(kuò)展時(shí),只需要按照功能增加相關(guān)的模塊,而不需要對(duì)原有處理器結(jié)構(gòu)等內(nèi)容做出修改,這為我們的實(shí)現(xiàn)以及優(yōu)化工作提供了便利。
根據(jù)兩條指令的功能,我們將指令的執(zhí)行過程適配于五階流水線結(jié)構(gòu),數(shù)據(jù)的運(yùn)算結(jié)果將在訪存階段運(yùn)算完成并在寫回階段被寫回至目的寄存器rd。依據(jù)圖1 中所示SM4 密碼算法實(shí)現(xiàn)過程并結(jié)合實(shí)際運(yùn)行需要,本文中設(shè)計(jì)實(shí)現(xiàn)的兩條SM4密碼算法擴(kuò)展指令其軟件端的調(diào)用格式在表1 中給出,對(duì)應(yīng)參數(shù)取值及運(yùn)算過程如圖3所示。
SM4 密碼算法的實(shí)現(xiàn)過程包含圖1 中所示32輪次迭代運(yùn)算,單次迭代過程如圖3(a)所示。對(duì)于第i次執(zhí)行輪函數(shù)F,其輸入?yún)?shù)可劃分為圖3(a)中rs1、rs2 框中所示兩部分,對(duì)應(yīng)sm4ed指令調(diào)用格式中所列參數(shù)rs1 與rs2;其輸出結(jié)果如圖3(a)中rd框中所示,對(duì)應(yīng)sm4ed指令調(diào)用格式中rd。實(shí)際應(yīng)用時(shí),本文將每4 次迭代過程視為一組運(yùn)算過程,對(duì)于SM4 密碼算法的整體實(shí)現(xiàn)過程可看作8組運(yùn)算過程,則SM4 加密算法中32 輪迭代可通過如下代碼實(shí)現(xiàn):
圖3 SM4算法擴(kuò)展指令實(shí)現(xiàn)內(nèi)容
上述代碼中,部分異或運(yùn)算可以復(fù)用,因此在實(shí)際實(shí)現(xiàn)過程中,每組運(yùn)算可進(jìn)一步減少兩次異或運(yùn)算,即僅調(diào)用10次異或運(yùn)算指令以及4次sm4ed指令,使得單次迭代指令條數(shù)為3.5 條。密鑰擴(kuò)展部分迭代過程與密碼算法部分基本一致,sm4ks指令的調(diào)用參數(shù)取值及指令執(zhí)行結(jié)果如圖3(b)中rs1,rs2 以及rd框中所示。
為驗(yàn)證SM4 密碼算法擴(kuò)展指令功能并對(duì)其資源開銷以及運(yùn)算性能加以評(píng)估,本文基于開源RISC-V處理器VexRiscv,使用SpinalHDL語(yǔ)言描述實(shí)現(xiàn),并基于Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)進(jìn)行實(shí)際驗(yàn)證與測(cè)試。本文對(duì)硬件資源開銷以及加解密性能方面進(jìn)行了相關(guān)的測(cè)試并給出分析。
為了評(píng)估硬件資源所需的開銷,本文將不包含SM4 算法擴(kuò)展指令與包含SM4 算法擴(kuò)展指令的VexRiscv 處理器分別以100MHz 的時(shí)鐘頻率進(jìn)行綜合,硬件資源開銷數(shù)據(jù)結(jié)果如表2 所示。對(duì)表2中綜合結(jié)果LUΤs 的開銷進(jìn)行分析,在增加SM4 密碼算法擴(kuò)展指令后,處理器整體硬件資源開銷僅增加59 個(gè)LUΤs,相比于不包含SM4 算法擴(kuò)展指令時(shí)處理器整體硬件資源開銷增加約1.60%。文獻(xiàn)[15]中針對(duì)SM4算法使用多種硬件架構(gòu)進(jìn)行實(shí)現(xiàn),本文選取其硬件資源開銷最小的數(shù)據(jù)作為本文硬件資源開銷評(píng)估的參考。通過擴(kuò)展指令集的方式實(shí)現(xiàn)SM4 算法帶來的硬件資源開銷遠(yuǎn)低于基于硬件實(shí)現(xiàn)方式所需的硬件資源開銷。
表2 基于Artix-7 FPGA 綜合結(jié)果
基于SM4算法的軟件實(shí)現(xiàn)過程中,將需要調(diào)用多條基礎(chǔ)指令進(jìn)行運(yùn)算的可重復(fù)過程使用單條擴(kuò)展指令替代,則可以通過大幅減少指令條數(shù)實(shí)現(xiàn)對(duì)性能的提升。文獻(xiàn)[7]中以字節(jié)為單位設(shè)計(jì)實(shí)現(xiàn)SM4算法擴(kuò)展指令,實(shí)現(xiàn)了單次迭代過程指令調(diào)用數(shù)為6.5條;本文設(shè)計(jì)實(shí)現(xiàn)的SM4算法擴(kuò)展指令,單條指令可完成對(duì)4 字節(jié)的運(yùn)算過程,因此能夠?qū)崿F(xiàn)單次迭代過程所需指令數(shù)僅為3.5 條,相較于文獻(xiàn)[7]進(jìn)一步減少。
為進(jìn)一步對(duì)性能表現(xiàn)加以評(píng)估,本文將SM4算法基于VexRiscv 處理器分別采用使用指令集以及不使用指令集進(jìn)行軟件實(shí)現(xiàn),并通過在Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)上實(shí)際測(cè)試得出數(shù)據(jù)結(jié)果見圖4。由于SM4 算法存在密鑰擴(kuò)展部分的特性,在實(shí)現(xiàn)加解密過程中,對(duì)較長(zhǎng)數(shù)據(jù)進(jìn)行加密時(shí),其總體加密性能將優(yōu)于對(duì)短字節(jié)長(zhǎng)度數(shù)據(jù)進(jìn)行加密,且在字節(jié)長(zhǎng)度較大時(shí)密鑰擴(kuò)展部分實(shí)現(xiàn)過程的時(shí)鐘消耗占比極低,則總體吞吐率將趨近于單獨(dú)實(shí)現(xiàn)SM4算法部分的運(yùn)算性能。由此,本文分別對(duì)比不同長(zhǎng)度(16 字節(jié)~16384 字節(jié))的數(shù)據(jù)塊進(jìn)行加密計(jì)算。從圖4 可以看出,本文設(shè)計(jì)的SM4算法擴(kuò)展指令對(duì)比無擴(kuò)展指令的軟件實(shí)現(xiàn),基于不同長(zhǎng)度數(shù)據(jù)性能提升8.96倍~14.33倍,對(duì)于長(zhǎng)數(shù)據(jù)塊進(jìn)行加解密運(yùn)算時(shí)帶來的性能提升程度更大,最大吞吐率可達(dá)81.82Mbit/s。
圖4 SM4算法性能測(cè)試結(jié)果
本文針對(duì)SM4 算法,基于開源RISC-V 指令集以及VexRiscv微處理器,提出了兩條針對(duì)實(shí)現(xiàn)SM4密鑰擴(kuò)展算法以及加解密算法的擴(kuò)展指令,完成了相應(yīng)的硬件電路設(shè)計(jì)與實(shí)現(xiàn),基于Xilinx Artix-7 FPGA進(jìn)行了實(shí)際應(yīng)用及測(cè)試。通過實(shí)際測(cè)試結(jié)果來看,本文設(shè)計(jì)實(shí)現(xiàn)的SM4 算法擴(kuò)展指令,在低硬件資源開銷的同時(shí),與無擴(kuò)展指令的實(shí)現(xiàn)方式相比,減少了算法實(shí)現(xiàn)過程中調(diào)用的指令數(shù),提升了加解密運(yùn)算性能,在100MHz 時(shí)鐘頻率下,對(duì)于長(zhǎng)字節(jié)數(shù)據(jù)塊加解密過程吞吐率提升至無擴(kuò)展指令時(shí)的14.33 倍,達(dá)到81.82Mbit/s。未來我們將繼續(xù)完善基于現(xiàn)有SM4擴(kuò)展指令的優(yōu)化工作,并嘗試實(shí)現(xiàn)針對(duì)其他密碼算法的擴(kuò)展指令來更好地滿足不同使用環(huán)境下對(duì)不同密碼算法實(shí)現(xiàn)性能加速的需求。