陳 銳,李 冰,劉向東
(1.南京工業(yè)職業(yè)技術(shù)大學(xué)計(jì)算機(jī)與軟件學(xué)院,江蘇 南京210012;2.東南大學(xué)微電子學(xué)院,江蘇 南京210035)
近年來(lái),物聯(lián)網(wǎng)(Internet of Things,IoT)已被廣泛應(yīng)用于各個(gè)領(lǐng)域,特別是在工業(yè)領(lǐng)域[1]。 越來(lái)越多的物聯(lián)網(wǎng)設(shè)備被安裝在車間、廠房、機(jī)械裝置和工業(yè)裝備上[2]。 工業(yè)物聯(lián)網(wǎng)不僅提高了生產(chǎn)效率,而且降低了生產(chǎn)成本[3]。 隨著聯(lián)網(wǎng)設(shè)備的增多,物聯(lián)網(wǎng)面臨的安全問題也越來(lái)越嚴(yán)峻[4]。 造成這一問題的主要原因是三個(gè)。 首先,出于成本方面的考慮,物聯(lián)網(wǎng)設(shè)備資源受限,無(wú)法提供先進(jìn)的安全技術(shù)保障[5]。 其次,物聯(lián)網(wǎng)設(shè)備數(shù)量的增多,導(dǎo)致探索潛在安全漏洞的機(jī)會(huì)增多。 最后,物聯(lián)網(wǎng)設(shè)備產(chǎn)生、處理和交換大量對(duì)公共安全至關(guān)重要的數(shù)據(jù)以及對(duì)隱私敏感的信息[6],這些數(shù)據(jù)和信息對(duì)攻擊者具有一定的吸引性。 一般而言,物聯(lián)網(wǎng)設(shè)備采集的數(shù)據(jù)會(huì)通過網(wǎng)絡(luò)傳遞到云端服務(wù)器進(jìn)行分析和處理[7]。這些數(shù)據(jù)在傳輸過程中,可能被中間人篡改、刪除,從而破壞了數(shù)據(jù)的完整性、可靠性和機(jī)密性。 考慮到這些數(shù)據(jù)可能對(duì)公共安全至關(guān)重要或者對(duì)隱私敏感,應(yīng)該在傳輸數(shù)據(jù)之前,對(duì)這些數(shù)據(jù)進(jìn)行加密處理。
對(duì)稱密碼算法可用于數(shù)據(jù)加密。 常見的對(duì)稱密碼算法有美國(guó)的AES 標(biāo)準(zhǔn)、中國(guó)的SM4 標(biāo)準(zhǔn)等。SM4(也稱為SMS4)已成為中國(guó)國(guó)家標(biāo)準(zhǔn),與AES相比,SM4 具有以下特點(diǎn),使其更適合于資源受限的環(huán)境:(1)SM4 的安全特性等效于AES-128[8];(2)加密和解密的結(jié)構(gòu)相同;(2)用于加密和解密的Sbox 相同;(4)輪函數(shù)僅需要4 個(gè)Sbox(每個(gè)具有256×8 位),而在AES 中則需要16 個(gè)。 SM4 算法的實(shí)現(xiàn)可以通過軟件、硬件或者軟硬協(xié)同的方式。 軟件實(shí)現(xiàn)的性能較低,特別是對(duì)于性能和延時(shí)比較敏感的工業(yè)場(chǎng)景,軟件執(zhí)行引入的延時(shí)是難以滿足工業(yè)場(chǎng)景對(duì)于性能和延時(shí)的需求。 因此,相關(guān)研究工作主要關(guān)注于硬件電路實(shí)現(xiàn)。 雖然SM4 算法本身已具備適合于資源受限環(huán)境的眾多優(yōu)勢(shì),但是考慮到物聯(lián)網(wǎng)設(shè)備成本方面的因素,需要盡可能地降低SM4 算法硬件實(shí)現(xiàn)時(shí)帶來(lái)的資源開銷。 目前已經(jīng)有不少參考文獻(xiàn)致力于降低SM4 算法的硬件電路資源開銷,比如基于復(fù)合域算術(shù)實(shí)現(xiàn)Sbox[8-9],降低了Sbox 導(dǎo)致的資源開銷;基于異步多米諾邏輯實(shí)現(xiàn)SM4[10],降低功耗的同時(shí)也降低了面積開銷。 然而,從物聯(lián)網(wǎng)設(shè)備成本方面考慮,SM4 算法硬件電路資源開銷還需進(jìn)一步地降低。
為了降低SM4 硬件資源開銷,本文提出以軟硬件協(xié)同設(shè)計(jì)的方式實(shí)現(xiàn)SM4 算法。 首先,分析了SM4 軟件實(shí)現(xiàn)的性能瓶頸。 其次,基于軟件分析結(jié)果,在開源指令集RISC-V[11]的基礎(chǔ)上,提出了兩條自定義指令,分別用于實(shí)現(xiàn)SM4 算法的加解密算法和密鑰擴(kuò)展算法的輪函數(shù)。 最后,提出一種復(fù)用RISC-V 處理器寄存器資源的方法,以減少SM4 存儲(chǔ)資源開銷,并設(shè)計(jì)了一款低開銷的SM4 指令功能單元電路結(jié)構(gòu)。 實(shí)驗(yàn)結(jié)果顯示,相對(duì)于軟件實(shí)現(xiàn)的性能,本文方法能夠?qū)⑼掏侣侍嵘?.47 倍,延時(shí)縮短81.72%。 在SMIC 180nm 工藝下的綜合結(jié)果顯示,與參考文獻(xiàn)相比,本文方法的硬件資源開銷至少降低38.9%。
該算法由加解密算法(如圖1(a)所示算法1)和密鑰擴(kuò)展算法(如圖1(b)所示算法2)兩部分組成,分組長(zhǎng)度和密鑰長(zhǎng)度均為128 bit。 加解密算法與密鑰擴(kuò)展算法均采用32 輪非線性迭代結(jié)構(gòu)。 從算法1 可以看出,加密算法和密鑰擴(kuò)展算法都需要32 輪的計(jì)算才能得到最終結(jié)果,因而每輪計(jì)算所消耗的時(shí)間決定了整個(gè)算法所消耗的時(shí)間。 為了評(píng)估SM4 軟件實(shí)現(xiàn)的性能,本文以Linux 內(nèi)核中的SM4算法源代碼為基礎(chǔ),在一款商業(yè)級(jí)的開源RISC-V處理器SCR1[12]上運(yùn)行,以獲取時(shí)鐘周期精確的仿真結(jié)果,然后對(duì)其進(jìn)行了性能剖析。
圖1 SM4 加密算法和密鑰擴(kuò)展算法
圖2 SM4 算法子函數(shù)性能分析
分析結(jié)果如圖2 所示,僅通過Sbox 完成一個(gè)字節(jié)的非線性變換就消耗了6 個(gè)時(shí)鐘周期,而密鑰擴(kuò)展和加密算法輪函數(shù)的單次迭代分別需要41 和49個(gè)時(shí)鐘周期。 值得注意的是,完成32 次輪函數(shù)迭代,密鑰擴(kuò)展和加解密分別需要1 802 和2 178 個(gè)時(shí)鐘周期,而這兩個(gè)值并不等于41×32 和49×32。 造成這一現(xiàn)象的主要原因是,每次輪函數(shù)的迭代都需要通過多個(gè)訪存指令從存儲(chǔ)器中將數(shù)據(jù)載入到寄存器中。 基于上述的分析,得出的結(jié)論是,為了消除SM4 軟件性能瓶頸,提升SM4 性能,降低時(shí)延,必須做到:(1)降低Sbox 非線性變換消耗時(shí)間;(2)降低輪函數(shù)單次迭代消耗時(shí)間;(3)減少輪函數(shù)中的訪存指令以減少訪問存儲(chǔ)器消耗時(shí)間。
從算法1 中的4~7 行和算法2 的3 ~7 行可以發(fā)現(xiàn),輪函數(shù)中包含的運(yùn)算較多,如果能將這些運(yùn)算通過一條指令完成,則可以達(dá)到降低輪函數(shù)單次迭代消耗時(shí)間的目的,而Sbox 非線性變換已然包含在輪函數(shù)中了,因此上述結(jié)論(1)也可以通過擴(kuò)展指令來(lái)消除或掩蓋。 考慮到開源指令RISC-V 指令集定義了32 個(gè)通用寄存器,如果能夠借用部分通用寄存器用于存放加解密或者密鑰擴(kuò)展算法運(yùn)算過程中產(chǎn)生的中間數(shù)據(jù),則可以減少不必要的存儲(chǔ)器訪問從而消除存儲(chǔ)器訪問消耗時(shí)間。
基于上述的分析,依據(jù)開源RISC-V 指令規(guī)范,本文定義了兩條自定義指令,SM4.KEY.RF 和SM4.ENC.RF。 擴(kuò)展指令SM4.KEY.RF 用于實(shí)現(xiàn)密鑰擴(kuò)展算法輪函數(shù)單次迭代中所有運(yùn)算,包括異或、Sbox 非線性變換、線性變換,如算法2 中4 ~7 行所示。 擴(kuò)展指令SM4.ENC.RF 用于實(shí)現(xiàn)加解密算法輪函數(shù)單次迭代中的所有運(yùn)算,如算法1 中4 ~7 行所示。 二者指令編碼格式如圖3 所示。 依據(jù)RISC-V指令規(guī)范,選取7 位二進(jìn)制數(shù)0001011 作為SM4 擴(kuò)展指令的操作碼,以便于與其他類型指令進(jìn)行區(qū)分。在擴(kuò)展指令SM4.KEY.RF 中,目標(biāo)寄存器由編譯器決定,可以為任意寄存器,源寄存器只需要1 個(gè),用于載入CK 參數(shù)。 在擴(kuò)展指令SM4.ENC.RF 中,將指定目標(biāo)寄存器為x28,以減少不必要的存儲(chǔ)器訪問,而源寄存器用于載入密鑰擴(kuò)展算法生成的輪密鑰。
圖3 本文提出的兩條RISC-V 擴(kuò)展指令
依據(jù)兩條擴(kuò)展指令的功能,本文設(shè)計(jì)了一款低開銷的SM4 指令功能單元,并對(duì)RISC-V 處理器的寄存器堆的電路結(jié)構(gòu)進(jìn)行了修改,具體結(jié)構(gòu)如圖4所示。 從圖4 可以看出,SM4 指令功能單元有6 個(gè)輸入和1 個(gè)輸出端口,其中5 個(gè)輸入用于傳遞輪函數(shù)單次迭代所需的數(shù)據(jù),而這5 個(gè)輸入直接從寄存器堆引入。 需要注意的是,這5 個(gè)從寄存器堆直接引入的輸入,有4 個(gè)是固定連接到某一個(gè)寄存器,剩余1 個(gè)由指令傳遞的rs1 選取。 之所以這樣設(shè)計(jì),主要原因有3 個(gè):(1)由于輪函數(shù)單次迭代需要5個(gè)32 位的數(shù)據(jù),固定連接寄存器后,數(shù)據(jù)直接從寄存器中讀取,無(wú)需等待,提升指令執(zhí)行效率;(2)借用處理器的4 個(gè)通用寄存器存放輪函數(shù)每次迭代產(chǎn)生的臨時(shí)數(shù)據(jù),無(wú)需再通過存儲(chǔ)器訪問指令從存儲(chǔ)器中載入數(shù)據(jù),減少訪問存儲(chǔ)器次數(shù),縮短算法延時(shí);(3)輪函數(shù)計(jì)算結(jié)果直接寫入固定寄存器,無(wú)需編譯器指定存放位置,省去讀取寄存器時(shí)間,提升指令執(zhí)行效率。
圖4 本文提出的SM4 指令功能單元
如圖4 所示,當(dāng)處理器執(zhí)行到SM4.ENC.RF 或者SM4.KEY.RF 指令時(shí),寄存器堆中的寄存器t0-t3構(gòu)成移位寄存器,數(shù)據(jù)可以從t3移入,然后通過移位從t0移出。 之所以這樣設(shè)計(jì),是為了在輪函數(shù)單次迭代結(jié)束之后,能夠自動(dòng)進(jìn)行為移位,為下一次的迭代準(zhǔn)備數(shù)據(jù),從而不需要再通過指令從其他位置加載數(shù)據(jù),因而可以提升效率。
SM4 指令功能單元僅完成輪函數(shù)單次迭代計(jì)算,完成整個(gè)加密算法或者密鑰擴(kuò)展算法,還需要軟件的配合,軟件主要負(fù)責(zé)算法流程的控制。 為了節(jié)省擴(kuò)展密鑰所占用的資源開銷,本文不采用在線密鑰擴(kuò)展,而是在加解密之前預(yù)先執(zhí)行密鑰擴(kuò)展算法,并將生成的32 個(gè)32 位的擴(kuò)展密鑰存放到數(shù)據(jù)存儲(chǔ)器中。 如圖5(a)所示,在調(diào)用SM4.KEY.RF 指令進(jìn)行密鑰擴(kuò)展之前,需要先將128 位的用戶密鑰存放到指定的4 個(gè)寄存器中,然后才能開始循環(huán)迭代。每次迭代都會(huì)生成一個(gè)32 位的輪密鑰,這些密鑰交由編譯器指定存放位置。 在32 個(gè)輪密鑰生成完畢之后,可以開始數(shù)據(jù)加解密。
如圖5(b)所示,在調(diào)用SM4.ENC.RF 指令進(jìn)行加解密之前,需要先將128 位的明文或者密文存放到指定的4 個(gè)寄存器中,然后才能開始循環(huán)迭代計(jì)算。 每次迭代均會(huì)先載入一個(gè)輪密鑰,然后執(zhí)行SM4.ENC.RF,每次迭代計(jì)算的結(jié)果直接寫入到寄存器t3(x28),32 次迭代結(jié)束之后,直接從寄存器t0-t3讀取數(shù)據(jù)即可。
圖5 SM4 算法軟硬件協(xié)同工作流程
圖6 SM4 指令功能單元嵌入到開源RISC-V 處理器SCR1 中
為了驗(yàn)證擴(kuò)展指令的功能,評(píng)估指令功能單元的資源開銷,本文采用Verilog HDL 對(duì)其進(jìn)行了描述,然后將其集成到商業(yè)級(jí)開源RISC-V 處理器SCR1 中。 如圖6 所示,SCR1 配置成了二級(jí)流水線結(jié)構(gòu),而SM4 指令功能單元嵌入到流水線的第二級(jí),與算術(shù)運(yùn)算單元ALU 處于同一個(gè)流水級(jí)。
為了評(píng)估資源開銷,本文將未修改的SCR1 以及修改之后的SCR1 分別以100 MHz 的時(shí)鐘頻率在SMIC 180 nm 工藝下,通過Synopsys Design Compiler進(jìn)行綜合,綜合結(jié)果如表1 所示。 從表1 可以看出,SM4 引入的硬件資源開銷只有1684 等效門。
表1 SMIC 180nm 工藝下的100MHz 綜合結(jié)果
為了評(píng)估性能,本文將SM4 算法分別采用有指令集擴(kuò)展和沒有指令集擴(kuò)展的方式進(jìn)行軟件實(shí)現(xiàn),并通過RISC-V 處理器提供的CYCLE 計(jì)數(shù)器對(duì)算法消耗的時(shí)鐘周期數(shù)進(jìn)行計(jì)數(shù)。 軟件實(shí)現(xiàn)通過修改之后的RISC-V GCC 交叉編譯器進(jìn)行編譯,然后將編譯輸出的Hex 文件以測(cè)試激勵(lì)的方式載入到Synopsys VCS 仿真平臺(tái),以獲得時(shí)鐘周期精確的仿真結(jié)果。 如表2 所示,添加指令集擴(kuò)展之后,密鑰擴(kuò)展、加密和解密所需的時(shí)鐘周期分別縮減了81.72%、87.69%、82.40%,而吞吐率分別提升了4.47 倍、7.12倍和4.68 倍。
表2 有/無(wú)擴(kuò)展指令延時(shí)(時(shí)鐘周期)對(duì)比
表3 有/無(wú)擴(kuò)展指令100 MHz 時(shí)鐘頻率下的吞吐率對(duì)比
表4 羅列了本文與參考文獻(xiàn)的比較結(jié)果。 雖然本文在延時(shí)和吞吐率方面的優(yōu)勢(shì)都不明顯,但是面積和等效門數(shù)優(yōu)勢(shì)突出,造成這一現(xiàn)象的主要是原因各個(gè)設(shè)計(jì)的設(shè)計(jì)目標(biāo)可能不一致,比如文獻(xiàn)[13]瞄準(zhǔn)的是高吞吐率,而本文的設(shè)計(jì)目標(biāo)是低開銷。從表4 中數(shù)據(jù)可以看出,與參考文獻(xiàn)相比,面積開銷(等效門數(shù))至少降低38.9%。
表4 與參考文獻(xiàn)資源開銷的比較結(jié)果
面向低成本物聯(lián)網(wǎng)終端領(lǐng)域數(shù)據(jù)加密需求,針對(duì)SM4 算法,本文基于開源RISC-V 指令集,提出了兩條SM4 擴(kuò)展指令,設(shè)計(jì)了一款低開銷的SM4 指令功能單元硬件電路結(jié)構(gòu),以軟硬件協(xié)同工作的方式實(shí)現(xiàn)SM4 密鑰擴(kuò)展算法和加解密算法,并在性能和硬件資源開銷之間取得平衡。 本文提出2 條擴(kuò)展指令分別用于實(shí)現(xiàn)SM4 密鑰擴(kuò)展算法和加密算法輪函數(shù)中的所有運(yùn)算。 從時(shí)鐘周期精確的仿真結(jié)果來(lái)看,與無(wú)擴(kuò)展指令的實(shí)現(xiàn)方式相比,延時(shí)至少降低81.72%,吞吐率至少提升4.47 倍。 從SMIC 180 nm工藝下的綜合結(jié)果來(lái)看,與參考文獻(xiàn)相比,硬件資源開銷至少降低38.9%。 本文提出的方法能夠兼顧性能和資源開銷,因而較為適合于資源受限成本低廉的物聯(lián)網(wǎng)場(chǎng)景。