陳 銳,李 冰,劉向東
(1.南京工業職業技術大學計算機與軟件學院,江蘇 南京210012;2.東南大學微電子學院,江蘇 南京210035)
近年來,物聯網(Internet of Things,IoT)已被廣泛應用于各個領域,特別是在工業領域[1]。 越來越多的物聯網設備被安裝在車間、廠房、機械裝置和工業裝備上[2]。 工業物聯網不僅提高了生產效率,而且降低了生產成本[3]。 隨著聯網設備的增多,物聯網面臨的安全問題也越來越嚴峻[4]。 造成這一問題的主要原因是三個。 首先,出于成本方面的考慮,物聯網設備資源受限,無法提供先進的安全技術保障[5]。 其次,物聯網設備數量的增多,導致探索潛在安全漏洞的機會增多。 最后,物聯網設備產生、處理和交換大量對公共安全至關重要的數據以及對隱私敏感的信息[6],這些數據和信息對攻擊者具有一定的吸引性。 一般而言,物聯網設備采集的數據會通過網絡傳遞到云端服務器進行分析和處理[7]。這些數據在傳輸過程中,可能被中間人篡改、刪除,從而破壞了數據的完整性、可靠性和機密性。 考慮到這些數據可能對公共安全至關重要或者對隱私敏感,應該在傳輸數據之前,對這些數據進行加密處理。
對稱密碼算法可用于數據加密。 常見的對稱密碼算法有美國的AES 標準、中國的SM4 標準等。SM4(也稱為SMS4)已成為中國國家標準,與AES相比,SM4 具有以下特點,使其更適合于資源受限的環境:(1)SM4 的安全特性等效于AES-128[8];(2)加密和解密的結構相同;(2)用于加密和解密的Sbox 相同;(4)輪函數僅需要4 個Sbox(每個具有256×8 位),而在AES 中則需要16 個。 SM4 算法的實現可以通過軟件、硬件或者軟硬協同的方式。 軟件實現的性能較低,特別是對于性能和延時比較敏感的工業場景,軟件執行引入的延時是難以滿足工業場景對于性能和延時的需求。 因此,相關研究工作主要關注于硬件電路實現。 雖然SM4 算法本身已具備適合于資源受限環境的眾多優勢,但是考慮到物聯網設備成本方面的因素,需要盡可能地降低SM4 算法硬件實現時帶來的資源開銷。 目前已經有不少參考文獻致力于降低SM4 算法的硬件電路資源開銷,比如基于復合域算術實現Sbox[8-9],降低了Sbox 導致的資源開銷;基于異步多米諾邏輯實現SM4[10],降低功耗的同時也降低了面積開銷。 然而,從物聯網設備成本方面考慮,SM4 算法硬件電路資源開銷還需進一步地降低。
為了降低SM4 硬件資源開銷,本文提出以軟硬件協同設計的方式實現SM4 算法。 首先,分析了SM4 軟件實現的性能瓶頸。 其次,基于軟件分析結果,在開源指令集RISC-V[11]的基礎上,提出了兩條自定義指令,分別用于實現SM4 算法的加解密算法和密鑰擴展算法的輪函數。 最后,提出一種復用RISC-V 處理器寄存器資源的方法,以減少SM4 存儲資源開銷,并設計了一款低開銷的SM4 指令功能單元電路結構。 實驗結果顯示,相對于軟件實現的性能,本文方法能夠將吞吐率提升4.47 倍,延時縮短81.72%。 在SMIC 180nm 工藝下的綜合結果顯示,與參考文獻相比,本文方法的硬件資源開銷至少降低38.9%。
該算法由加解密算法(如圖1(a)所示算法1)和密鑰擴展算法(如圖1(b)所示算法2)兩部分組成,分組長度和密鑰長度均為128 bit。 加解密算法與密鑰擴展算法均采用32 輪非線性迭代結構。 從算法1 可以看出,加密算法和密鑰擴展算法都需要32 輪的計算才能得到最終結果,因而每輪計算所消耗的時間決定了整個算法所消耗的時間。 為了評估SM4 軟件實現的性能,本文以Linux 內核中的SM4算法源代碼為基礎,在一款商業級的開源RISC-V處理器SCR1[12]上運行,以獲取時鐘周期精確的仿真結果,然后對其進行了性能剖析。

圖1 SM4 加密算法和密鑰擴展算法

圖2 SM4 算法子函數性能分析
分析結果如圖2 所示,僅通過Sbox 完成一個字節的非線性變換就消耗了6 個時鐘周期,而密鑰擴展和加密算法輪函數的單次迭代分別需要41 和49個時鐘周期。 值得注意的是,完成32 次輪函數迭代,密鑰擴展和加解密分別需要1 802 和2 178 個時鐘周期,而這兩個值并不等于41×32 和49×32。 造成這一現象的主要原因是,每次輪函數的迭代都需要通過多個訪存指令從存儲器中將數據載入到寄存器中。 基于上述的分析,得出的結論是,為了消除SM4 軟件性能瓶頸,提升SM4 性能,降低時延,必須做到:(1)降低Sbox 非線性變換消耗時間;(2)降低輪函數單次迭代消耗時間;(3)減少輪函數中的訪存指令以減少訪問存儲器消耗時間。
從算法1 中的4~7 行和算法2 的3 ~7 行可以發現,輪函數中包含的運算較多,如果能將這些運算通過一條指令完成,則可以達到降低輪函數單次迭代消耗時間的目的,而Sbox 非線性變換已然包含在輪函數中了,因此上述結論(1)也可以通過擴展指令來消除或掩蓋。 考慮到開源指令RISC-V 指令集定義了32 個通用寄存器,如果能夠借用部分通用寄存器用于存放加解密或者密鑰擴展算法運算過程中產生的中間數據,則可以減少不必要的存儲器訪問從而消除存儲器訪問消耗時間。
基于上述的分析,依據開源RISC-V 指令規范,本文定義了兩條自定義指令,SM4.KEY.RF 和SM4.ENC.RF。 擴展指令SM4.KEY.RF 用于實現密鑰擴展算法輪函數單次迭代中所有運算,包括異或、Sbox 非線性變換、線性變換,如算法2 中4 ~7 行所示。 擴展指令SM4.ENC.RF 用于實現加解密算法輪函數單次迭代中的所有運算,如算法1 中4 ~7 行所示。 二者指令編碼格式如圖3 所示。 依據RISC-V指令規范,選取7 位二進制數0001011 作為SM4 擴展指令的操作碼,以便于與其他類型指令進行區分。在擴展指令SM4.KEY.RF 中,目標寄存器由編譯器決定,可以為任意寄存器,源寄存器只需要1 個,用于載入CK 參數。 在擴展指令SM4.ENC.RF 中,將指定目標寄存器為x28,以減少不必要的存儲器訪問,而源寄存器用于載入密鑰擴展算法生成的輪密鑰。

圖3 本文提出的兩條RISC-V 擴展指令
依據兩條擴展指令的功能,本文設計了一款低開銷的SM4 指令功能單元,并對RISC-V 處理器的寄存器堆的電路結構進行了修改,具體結構如圖4所示。 從圖4 可以看出,SM4 指令功能單元有6 個輸入和1 個輸出端口,其中5 個輸入用于傳遞輪函數單次迭代所需的數據,而這5 個輸入直接從寄存器堆引入。 需要注意的是,這5 個從寄存器堆直接引入的輸入,有4 個是固定連接到某一個寄存器,剩余1 個由指令傳遞的rs1 選取。 之所以這樣設計,主要原因有3 個:(1)由于輪函數單次迭代需要5個32 位的數據,固定連接寄存器后,數據直接從寄存器中讀取,無需等待,提升指令執行效率;(2)借用處理器的4 個通用寄存器存放輪函數每次迭代產生的臨時數據,無需再通過存儲器訪問指令從存儲器中載入數據,減少訪問存儲器次數,縮短算法延時;(3)輪函數計算結果直接寫入固定寄存器,無需編譯器指定存放位置,省去讀取寄存器時間,提升指令執行效率。

圖4 本文提出的SM4 指令功能單元
如圖4 所示,當處理器執行到SM4.ENC.RF 或者SM4.KEY.RF 指令時,寄存器堆中的寄存器t0-t3構成移位寄存器,數據可以從t3移入,然后通過移位從t0移出。 之所以這樣設計,是為了在輪函數單次迭代結束之后,能夠自動進行為移位,為下一次的迭代準備數據,從而不需要再通過指令從其他位置加載數據,因而可以提升效率。
SM4 指令功能單元僅完成輪函數單次迭代計算,完成整個加密算法或者密鑰擴展算法,還需要軟件的配合,軟件主要負責算法流程的控制。 為了節省擴展密鑰所占用的資源開銷,本文不采用在線密鑰擴展,而是在加解密之前預先執行密鑰擴展算法,并將生成的32 個32 位的擴展密鑰存放到數據存儲器中。 如圖5(a)所示,在調用SM4.KEY.RF 指令進行密鑰擴展之前,需要先將128 位的用戶密鑰存放到指定的4 個寄存器中,然后才能開始循環迭代。每次迭代都會生成一個32 位的輪密鑰,這些密鑰交由編譯器指定存放位置。 在32 個輪密鑰生成完畢之后,可以開始數據加解密。
如圖5(b)所示,在調用SM4.ENC.RF 指令進行加解密之前,需要先將128 位的明文或者密文存放到指定的4 個寄存器中,然后才能開始循環迭代計算。 每次迭代均會先載入一個輪密鑰,然后執行SM4.ENC.RF,每次迭代計算的結果直接寫入到寄存器t3(x28),32 次迭代結束之后,直接從寄存器t0-t3讀取數據即可。

圖5 SM4 算法軟硬件協同工作流程

圖6 SM4 指令功能單元嵌入到開源RISC-V 處理器SCR1 中
為了驗證擴展指令的功能,評估指令功能單元的資源開銷,本文采用Verilog HDL 對其進行了描述,然后將其集成到商業級開源RISC-V 處理器SCR1 中。 如圖6 所示,SCR1 配置成了二級流水線結構,而SM4 指令功能單元嵌入到流水線的第二級,與算術運算單元ALU 處于同一個流水級。
為了評估資源開銷,本文將未修改的SCR1 以及修改之后的SCR1 分別以100 MHz 的時鐘頻率在SMIC 180 nm 工藝下,通過Synopsys Design Compiler進行綜合,綜合結果如表1 所示。 從表1 可以看出,SM4 引入的硬件資源開銷只有1684 等效門。

表1 SMIC 180nm 工藝下的100MHz 綜合結果
為了評估性能,本文將SM4 算法分別采用有指令集擴展和沒有指令集擴展的方式進行軟件實現,并通過RISC-V 處理器提供的CYCLE 計數器對算法消耗的時鐘周期數進行計數。 軟件實現通過修改之后的RISC-V GCC 交叉編譯器進行編譯,然后將編譯輸出的Hex 文件以測試激勵的方式載入到Synopsys VCS 仿真平臺,以獲得時鐘周期精確的仿真結果。 如表2 所示,添加指令集擴展之后,密鑰擴展、加密和解密所需的時鐘周期分別縮減了81.72%、87.69%、82.40%,而吞吐率分別提升了4.47 倍、7.12倍和4.68 倍。

表2 有/無擴展指令延時(時鐘周期)對比

表3 有/無擴展指令100 MHz 時鐘頻率下的吞吐率對比
表4 羅列了本文與參考文獻的比較結果。 雖然本文在延時和吞吐率方面的優勢都不明顯,但是面積和等效門數優勢突出,造成這一現象的主要是原因各個設計的設計目標可能不一致,比如文獻[13]瞄準的是高吞吐率,而本文的設計目標是低開銷。從表4 中數據可以看出,與參考文獻相比,面積開銷(等效門數)至少降低38.9%。

表4 與參考文獻資源開銷的比較結果
面向低成本物聯網終端領域數據加密需求,針對SM4 算法,本文基于開源RISC-V 指令集,提出了兩條SM4 擴展指令,設計了一款低開銷的SM4 指令功能單元硬件電路結構,以軟硬件協同工作的方式實現SM4 密鑰擴展算法和加解密算法,并在性能和硬件資源開銷之間取得平衡。 本文提出2 條擴展指令分別用于實現SM4 密鑰擴展算法和加密算法輪函數中的所有運算。 從時鐘周期精確的仿真結果來看,與無擴展指令的實現方式相比,延時至少降低81.72%,吞吐率至少提升4.47 倍。 從SMIC 180 nm工藝下的綜合結果來看,與參考文獻相比,硬件資源開銷至少降低38.9%。 本文提出的方法能夠兼顧性能和資源開銷,因而較為適合于資源受限成本低廉的物聯網場景。