朱麒瑾,陳小文,魯建壯
(1.國防科技大學計算機學院,湖南 長沙 410073;2.先進微處理器芯片與系統重點實驗室,湖南 長沙 410073;3.電子科技大學集成電路科學與工程學院,四川 成都 610054)
隨著現代科學技術的進步,計算機科學行業蓬勃發展,人類社會已然進入信息化時代。通過網絡進行信息交互已經成為人們獲取信息的主要方式,隨之而來的網絡信息安全問題就顯得愈發重要。因此,發展保護信息安全的相關技術對于個人和國家而言都有著十分重要的現實意義。
加密技術可以分為硬件加密和軟件加密。相對于硬件加密而言,軟件加密具有更高的靈活性和自主性。但是,隨著集成電路行業的發展,日常生活中信息傳輸的數據量也變得越來越大,用戶對信息交互速度的要求也越來越高,軟件加密逐漸不能滿足實際的應用需求。因此,利用專用集成電路(ASIC)的硬件加密方式便成為了主流。使用傳統集成電路芯片,可以在特定的加密算法下,高速地進行加解密運算,可在短時間內完成大量數據的加解密與傳輸。我國在2006年發布了國際無線網絡安全標準WAPI(Wireless LAN Authentication and Privacy Infrastructure),SMS4是該標準的重要組成部分,SMS4加解密算法的出現標志著我國首個商用密碼算法的誕生。后續我國國家密碼管理局相繼公布了SM1、SM2、SM3、SM4、SM7和SM9等一系列國密算法。SM4算法具有算法結構簡單易實現、加解密速度快和安全性高等優點,迅速獲得了業界認可,被廣泛應用在數據加密存儲和信息通信等領域中[1]。
本文為提高SM4加解密算法的效率,在設計上采用流水線結構,將輪密鑰拓展和每一輪加解密分成若干小段,使得每一小段都能并行操作,從而提高吞吐率,當運算過程穩定后達到連續每個時鐘周期輸入128位明文數據,同時輸出128位密文數據的效果。其次,為增強設計的通用性,本文將流水線設計拓展為可變流水線級設計,使其能根據不同的使用場景選擇最合適的流水線級數進行工作。除此之外,本文還將SM4加解密算法進行IP封裝,利用FPGA特性搭建了SoC(System on Chip),并對其進行了硬件測試。測試結果表明,該設計具有很強的通用性,在實際工程應用中有著十分重要的意義。
SM4算法是一個對稱式分組加解密算法,其主體采用了非平衡的Feistel網絡[2]。該算法輸入的明文與密鑰都為128 bit。主體結構可分為輪密鑰拓展算法和加解密算法,2種算法都采用了非線性迭代結構,都需要進行32輪迭代才能生成最終數據。SM4加密算法與解密算法幾乎完全一致,唯一的不同點在于輸入輪密鑰的順序互為逆序,對于加密算法所使用輪密鑰順序與輪密鑰拓展順序相同,而解密算法使用密鑰的順序與輪密鑰拓展順序相反[3-6]。
SM4加解密算法的原理如圖1所示,輪密鑰拓展原理如圖2所示。

Figure 1 Principles of SM4 encryption and decryption

Figure 2 Principle of SM4-round key expansion
輸入密鑰信息后,經過系統參數異或后,送入函數F′,將輸出數據與前96位數據重新組合后再次送入函數F′,反復迭代32輪便可得到32輪輪密鑰數據。而加密模塊將輸入數據與輪密鑰數據共同送入函數F,同樣將得到的32位數據與前96位數據重新組合后再次送回到函數F迭代32次,最后做一個逆序操作便可得到最終的密文數據。
本節主要介紹可變流水級SM4加解密算法硬件設計,并增加了帶有APB(Advanced Peripheral Bus)接口的配置寄存器模塊接受處理器給出的配置信息,還設計了帶有AXI(Advanced eXtensible Interface)接口的數據接口模塊,用于控制數據讀寫。
根據SM4輪密鑰拓展原理,將輸入密鑰與系統參數FK異或之后送入輪函數F′迭代32次。所以,本文設置了一個大小為128 bit的密鑰暫存寄存器,用于存儲每次迭代后的數據和最開始送入輪函數F′的信息。設置了一個32進制計數器,用于確定迭代次數,從而選取對應的固定參數CK和確定何時完成32輪輪密鑰拓展。將每次由函數F′生成的32 bit數據存儲到輪密鑰寄存器組中,同時將密鑰暫存寄存器中的數據左移32位,并將新生成的32 bit數據放入密鑰暫存寄存器的低32位,將新得到的128位數據作為輸入送入輪函數F′。如此循環32次便可得到32輪輪密鑰數據。當32輪輪密鑰完全生成后將輸出密鑰有效信號置1并開始輸出輪密鑰信息。因為該設計是為了縮短大批量數據的加密時間,相對而言輪密鑰生成和傳輸時間可忽略不計,所以為節約資源,在這里采取串行傳輸的方式將輪密鑰信息送入到加解密模塊中。
該模塊主要負責對數據進行加解密。當輪密鑰拓展模塊向加解密模塊發送完輪密鑰信息后,根據模式選擇信息select信號,所有的輪密鑰信息將會分組存入rki_rg[0:31]的寄存器組中。若select為0表示加密,輪密鑰按順序存儲;若select為1表示解密,輪密鑰按逆序存儲。當全部存入后,將表示輪密鑰傳輸完成的信號置1,表示該模塊已經存儲完所有輪密鑰,可以開始接收數據。外部接受到該信號后便可以開始向內部傳送數據。
在加密時對加密算法進行流水線設計。流水線技術實際上是將大規模組合邏輯電路進行分級,在每一級當中插入一個流水寄存器用于存儲每個流水段處理的中間數據。在設計中使用流水線可以大大提高電路的吞吐率,使得每個流水段都能得到有效利用。流水線技術還減少了組合邏輯中的級數,縮短了存儲器之間的組合邏輯路徑,從而使得電路能在更高的時鐘頻率下工作。但是,流水線實際上是一種使用資源空間換取時間的方法,在電路設計中插入流水線勢必會加大電路的開銷,增加電路的面積。所以,對于流水線級數的設計并不代表級數越多越好,需要在面積和速度之間根據使用場景進行折衷選擇。下面根據不同流水線級數分別介紹設計方法:
32級流水線設計相對簡單,它由32個流水寄存器的時序邏輯電路和32個輪函數F的組合邏輯電路構成。采用32級流水線可以在速度上得到最大的提升,但是電路面積也是最大的。當明文數據被采集后送入第1級輪函數F電路中,對明文數據進行合成置換后得到下一個32位數據,將其和前96位數據重新組合后送入對應流水段的流水寄存器當中。數據輸入端每個時鐘周期接收一個數據,加解密電路每個時鐘周期依次進行加解密,當經過32個時鐘周期后,便可以得到一個密文數據。為保證能及時捕捉到輸出數據,本設計將輸入有效信號invalid同時送入到流水線當中。該有效信號在流水寄存器中傳遞,每經過一個時鐘周期向后一個流水寄存器傳輸數據。所以,在密文生成后,有效信息也同時從第32個流水寄存器中傳出,表示數據有效,將此時的有效信號作為輸出有效信號,就可以使輸出信號成功地被及時捕捉。同時,如果在輸出過程中由于某些原因導致輸入明文數據有一個或多個時鐘周期的間隙,在加密到該間隙時間時,數據輸出無效,不會影響到加解密結果。而4級、8級、16級流水線設計的區別僅僅在于流水寄存器數目的不同,如對于16級流水線而言,采用了16個流水寄存器,每2個輪函數F構成一個流水段。同理,8級流水線中每4個輪函數F構成一個流水段,4級流水線中每8個輪函數F構成一個流水段。
所以,要實現可變流水級,需要在32級流水線設計的基礎上,在每一個流水寄存器后加上一個多路復用器,用于選擇輸入到下一個輪函數F組合邏輯電路的輸入是來自于流水寄存器還是上一個輪函數F組合邏輯電路,具體示意圖如圖3所示。控制信號給出流水線級數信息,多路復用器根據控制信號信息選擇輸出信號,如16級流水線時,從前往后計數為奇數的多路復用器選擇組合邏輯信號作為輸出信號,計數為偶數的多路復用器選擇流水寄存器作為輸出信號。

Figure 3 Design of variable pipeline stage
配置寄存器擁有一個APB接口[7],用于接收處理器發出的配置信息。在設計APB接口時,需要對內部寄存器進行偏移地址分配,便于APB總線對內部寄存器的讀寫。配置寄存器需要接受的信息為:加解密模式選擇信息、讀地址信息、寫地址信息、密鑰信息和數據長度信息。為確保信息讀取成功,在每一個信息對應的寄存器旁都加入一個標志位寄存器,當接收到數據后使標志位置為1。每次數據傳輸都只能傳輸32 bit數據,所以密鑰信息要分4次才能完整傳輸。當數據全部輸入后,所有信息標志位都置為1,所以將準備標志位置1表示配置完成,當寄存器檢測到該數據從0變到1后,且表示SM4加解密核工作的寄存器數值為0時,將SM4加解密核啟動信號置1,啟動SM4加解密核,將密鑰信息和加解密模式選擇信息發送到加解密核中,將讀/寫地址信息發送到AXI接口模塊。由于AXI接口每次傳輸最大只支持傳輸256個數據,所以在配置寄存器中要根據輸入的數據長度信息判斷需要傳輸的次數,利用一個寄存器暫存剩余數據長度信息,一個寄存器用于控制每次讀數據突發長度。在每一次讀數據突發后判斷剩余數據長度,如果大于最大突發長度,則讀數據以最大突發長度讀取數據,當剩余數據長度信息小于最大突發長度時,表示為最后一次突發,最后一次突發的標志位置1,并以剩余數據長度進行讀數據突發。每次突發后讀地址寄存器也同樣增加突發長度乘以16的偏移量,以新地址作為每次突發的首地址。當最后一次突發的標志位為高后,便不再啟動讀數據信號,標志著讀數據處理完成。當SM4工作狀態從1重新變為0后,所有寄存器復位。
AXI接口[8]負責控制加解密數據的讀寫,當該模塊收到配置寄存器模塊傳來的讀啟動信號后,根據讀突發長度信息,從存儲器讀取數據。并且設置2個計數器用于計數讀啟動和寫啟動次數。當數據加密完成后,需要寫回存儲器時,根據輸出有效信號,每當該信號從0跳變為1時,啟動寫啟動信號,并將寫啟動寄存器加1。當寫啟動次數與讀啟動次數不等時,每次的寫突發長度為最大突發長度;當寫啟動次數與讀啟動次數相等時,寫突發長度為最后一次讀突發長度。這樣就可以完成大數據量的加解密處理[9]。
為驗證設計的可行性,本文將SM4設計封裝為IP。搭建了小型SoC,通過模擬IP在計算機中實際的運行方式對設計進行驗證。驗證SoC所用的開發平臺為XILINX ZYNQ-7000系列[10-14]。
整體設計如圖4所示,首先要在XILINX ZYNQ-7020開發板[15]上使用本文設計的SM4加解密算法,就需要將SM4流水線設計封裝為一個帶有AXI接口的IP設計。為了有效利用SM4流水線設計的速度優勢,對于SM4工作方式采取了類似于DMA的設計方式。首先在SM4 IP當中放置了一個配置寄存器,CPU可以通過APB總線訪問該寄存器,并對該寄存器進行配置。CPU可對配置寄存器配置讀數據地址信息、寫地址信息、加解密模式選擇信息和輪密鑰信息。當配置完成后,配置寄存器就可以啟動AXI接口和SM4加解密核。將存儲器中的數據經過AXI總線讀出,完成加解密后,再將數據送回到寄存器當中。這種工作方式與DMA工作方式十分類似,存儲器既可以被CPU訪問,也可以被SM4 IP訪問。SM4 IP與存儲器之間進行數據交互,完全由SM4 IP所控制,這樣CPU可以與SM4 IP并行工作,有效地提高了CPU的工作效率。CPU只需要在SM4 IP啟動前對其進行配置,并在SM4 IP完成數據加解密后申請中斷,就完成了加解密。

Figure 4 SoC design with SM4 IP core
下面以32級流水線為例介紹SoC具體工程流程:當CPU通過APB總線向配置寄存器傳輸讀寫地址信息、密鑰信息、數據長度信息和模式選擇信息后,配置寄存器向SM4加解密核發送啟動信號,將密鑰送入SM4核進行輪密鑰拓展。當32輪輪密鑰全部完成后,輪密鑰存儲在寄存器當中。當第1輪輪密鑰生成后,便開始串行地向加解密模塊傳輸輪密鑰信息。當1 024 bit的輪密鑰信息全部完成后,SM4加解密模塊向SM4 AXI接口發送輪密鑰準備完成信息,表示可以開始接收明文數據。設定突發方式為INCR(INCRement),SM4 AXI接口將讀數據首地址發送到總線后,根據地址映射,每一個周期開始自動從存儲器讀出一個128位數據,當數據送入SM4加解密核后便開始進行加解密。由于設計的是32級流水線,所以一定時間后,每一個流水寄存器都存儲著一個正在被加解密的數據。當第1個數據完成32次加解密后,數據被送入SM4 AXI接口,同樣設定突發模式為INCR,根據寫數據首地址,將數據送入存儲器當中,之后每一個時鐘周期都將寫入一個128位數據,直至數據全部寫入。當處理大量數據時,通過利用AXI的流水特性和SM4加解密核32級流水的設計特點,存儲器能夠在一個周期內同時讀出128位明文并寫入128位密文,高效利用流水線操作的并行性,進一步提升加解密過程的吞吐量和性能,提高系統的整體效率和響應速度。當所有明文數據完成加密后,加解密核將SM4工作狀態標志位置為0,表示加解密工作完成,當CPU檢測到這個標志位跳轉為0時,便發出中斷信號,表示成功完成加解密工作。
本節主要利用Vivado進行功能驗證,利用 SDK軟件對設計進行軟件驗證。為模擬SM4加解密IP在實際工程應用中的場景,確保設計的正確性和實用性,將此IP加入到SoC工程當中,并將SoC設計在XILINX ZYNQ開發板上運行。通過軟件控制處理器,控制SM4 IP核在SoC中正常運行進行加解密操作。
輪密鑰拓展模塊仿真如下:根據設計輪密鑰模塊有4個輸入信號、2個輸出信號,為便于驗證,所用密鑰為官方手冊中給出的實例,將密鑰設定為0x0123456789abcdeffedcba9876543210。輪密鑰拓展模塊采用低電平信號復位,當信號復位后,置使能信號為1,并將密鑰信息送入數據輸入接口key_in,根據圖5所示的仿真波形可以發現,當輸入密鑰進入輪密鑰拓展模塊后,經過32個周期完成了輪密鑰拓展,輸出模塊在第1個周期后便開始傳輸數據,并將輸出有效信號置為高,在連續輸出1 024個周期后完成32個輪密鑰數據的輸出。

Figure 5 Simulation results of SoC round key expansion module
加解密模塊仿真如下:在之前輪密鑰模塊仿真的基礎之上,添加加解密模塊進行功能驗證。加解密模塊接收來自輪密鑰模塊所提供的32輪輪密鑰信息。當加解密模塊收集到所有輪密鑰信息后,將輪密鑰傳輸完成信號置1,表示可以開始接收數據進行加解密。在這里分別測試加密和解密是否正確。設置模式輸入選擇信號為0,表示進行加密操作。在驗證平臺中設置一個小型RAM,按序分別存儲5個數據,具體數據如表1所示,這5個數據流水輸入到加解密模塊當中。

Table 1 Input plaintext表1 輸入的明文
如圖6所示的波形圖,當密鑰輸入經過1 024個周期后得到完整輪密鑰數據,把輪密鑰傳輸完成信號置1后,經過5個時鐘周期,明文數據進入加解密模塊。經過32個時鐘周期后,開始輸出密文數據,當第1個密文數據輸出后每經過一個時鐘周期輸出下一個密文數據。為驗證數據的正確性,使用官方所給明文數據0x0123456789abcdeffedcba- 9876543210,以及對應密文數據0x681edf34d206- 965e86b3e94f536e4246,與圖6中的加密結果進行對比,以驗證加密功能的正確性。為了驗證后續所有明文數據加密結果的正確性,編寫軟件代碼進行驗證,軟件加密結果如圖7所示。與圖6中結果對比可知,加密結果完全正確。當數據量十分龐大時可以達到每周期輸入一個明文,每一個周期輸出一個密文的效果。

Figure 6 Simulation results of 32-stage pipeline encryption module

Figure 7 Software encryption results
采用同樣的明文數據,調整流水線級數,16級、8級和4級流水線的波形圖分別如圖8~圖10所示。

Figure 8 Simulation results of 16-stage pipeline encryption module

Figure 9 Simulation results of 8-stage pipelin encryption module

Figure 10 Simulation results of 4-stage pipeline encryption module
為驗證解密功能,將加密得到的密文重新作為輸入密文輸入到加解密模塊中,將加解密模式設置為解密。輸入密文信號如表2所示。加密結果如圖11所示。觀察結果可以發現,解密得到的明文數據與表1完全相同,所以加解密功能驗證成功。根據SM4算法結構特點,SM4加密算法與SM4解密算法結構幾乎完全相同,僅在輸入輪密鑰順序上有所不同,在設計4種不同流水線級數的流水線時,對于輪密鑰的使用情況是同一設計,所以這里以32級流水線為例,對解密模式進行功能仿真,不再具體分析16級、8級和4級流水線的解密模式功能仿真結果。

Table 2 Input ciphertext表2 輸入的密文

Figure 11 Simulation results of 32-stage pipeline decryption module
Vivado的Block Design可以基于IP進行設計,用戶可以調用官方提供的和用戶自己封裝的IP進行設計。將本文設計的SM4 IP進行封裝,封裝為含有AXI的主機接口和APB的從機接口。按照圖4所示SoC設計框架,進行SoC搭建。SoC包含作為PS(Processing System)端的處理器模塊XILINX ZYNQ7 Processing System、用于PL(Progarmmable Logic)端與PS端連接的AXI總線模塊AXI Interconnect、存儲器模塊Block Memory Generator以及用于與AXI接口對接的存儲器控制器AXI BRAM Controller,調用一個AXI2APB的總線橋用于與SM4 IP的APB接口相連接。處理器通過AXI總線和AXI2APB的總線橋將配置信息傳入到SM4 IP的配置寄存器中,當SM4 IP收到配置信息后啟動加解密功能,通過AXI總線申請從存儲器中讀出明文數據,明文數據通過AXI總線傳輸到SM4 IP當中,當加解密完成后,SM4 IP再通過AXI端口申請寫寄存器,將明文數據通過AXI總線寫入到存儲器當中。PS端不斷查詢SM4 IP配置寄存器中SM4工作狀態標志位,當該標志位從1跳轉為0后,PS端接收到加解密工作完成的信息。
測試過程如圖12所示。Vivado支持使用SDK對硬件設計進行軟件調試。在軟件調試時,首先對存儲器的明文數據區域和密文數據區域進行初始化,將存儲器全部清0。在進行地址分配時存儲器地址范圍為0x4000_0000~0x4000_FFFF,將0x4000_4000~0x4000_7FFF劃分為明文區域,0x4000_8000~0x4000_BFFF劃分為密文區域。設定突發長度為256,將256個明文數據存儲到存儲器明文區域,存儲完成后便可以開始對配置寄存器進行配置。配置完成后PL部分就會自動完成加解密操作。為驗證加解密的正確性,在加密完成后清零存儲器明文數據區。然后重新配置配置寄存器,命令SM4 IP完成解密操作,并將得到的明文數據寫入明文存儲區。最后將明文存儲區中的數據讀出與輸入明文進行對比判斷是否一致,若一致則代表加解密功能無誤。根據對比輸入明文與解密密文寫回到存儲區的解密數據可以判斷,加解密成功。

Figure 12 Software test results
下面對加解密速度進行測試。在XILINX ZYNQ的PS處理器中,XILINX提供了可供用戶進行調用的定時器模塊,2個Cortex-A9處理器共用一個64位的全局定時器GT(Globle Timer),每個處理器又有專屬的32位私有定時器和32位的看門狗計時器。私有定時器和看門狗計時器總是以CPU頻率的一半為時鐘頻率。本文利用處理器的私有計時器來計時,處理器設置的時鐘頻率為600 MHz,所以私有定時器的時鐘頻率為300 MHz。當SM4 IP核中配置寄存器配置完畢后,馬上就會開始工作,所以在配置最后一個信息之前記錄當前私有定時器計數值。當SM4 IP核工作完成,工作狀態標志位跳變回0,處理器檢測到后再記錄私有定時器計數值。因為私有定時器是倒計時,所以將前一個計數值減后一個計數值后乘以時鐘周期便可得到加解密工作用時。
為對比硬件執行加解密算法與軟件執行加解密算法的速度差異,軟件加解密利用XILINX ZYNQ的處理器執行軟件程序,執行過程中同樣從存儲器同一位置取出明文進行加密并寫回存儲器密文區域,再將密文數據讀出并進行解密操作,將解密后的明文數據重新寫回到存儲區的明文區域。處理器頻率為600 MHz,利用純軟件的方式實現SM4算法,并對10 000個數據進行加解密的時間約為60 000 μs。
當利用硬件進行加解密時,同樣突發為10 000個數據,輸入明文與密鑰相同。為同時對比不同流水線級數的速度差異,本文對4種流水線都進行了軟件速度測試,結果如圖13所示。由結果可以得出,在10 000個數據突發的情況下,利用硬件實現SM4加解密算法可以比軟件實現加解密算法在加解密速度上提高約1 939~8 283倍。所以,隨著處理數據量的增加,硬件與軟件的執行速度差異會更大,所以實際工程中利用硬件電路對數據進行處理能大大提高工作效率。

Figure 13 Hardware encryption and decryption time
本節將通過軟件仿真結果分析設計性能。
本文對不同級流水線設計進行了性能測試。根據綜合報告顯示,32級、16級、8級和4級流水線能達到的最大工作頻率分別為140 MHz,128 MHz,65 MHz和33 MHz,如圖14所示。觀察發現,16級、8級和4級流水線的最高工作頻率基本上呈現倍數關系。而32級與16級流水線的最高工作頻率差別較小,因為此時電路的最短路徑是由輪密鑰拓展模塊決定的,而16級、8級和4級流水線的最高工作頻率的差別是由于流水段中組合邏輯規模增大而導致最短路徑變長。

Figure 14 Maximum operating frequency
圖15顯示了可變流水級的硬件資源消耗。如圖15所示流水線設計的LUT(Look Up Table)消耗都基本相同,而寄存器資源隨著流水線級數增加而減少。這是符合設計要求的,因為不同流水線級數之間的差別僅僅在于流水線寄存器數目的不同,而組合邏輯資源都是32個單次加解密電路,只是用不同數目的流水線寄存器對電路進行了劃分。

Figure 15 Hardware resource consumption
根據軟件測試結果測試中不同流水線的吞吐率與理想吞吐率進行對比,結果如圖16所示,不同級數流水線實際的吞吐率與理想吞吐率幾乎保持一致。

Figure 16 Throughput
SM4算法作為我國第一個商用加解密算法,憑借其實現方式簡單、安全性高和穩定性強的優點,在業界有著廣泛的應用。硬件方式實現加解密算法相對于軟件實現來說,在處理速度上有著很大的優勢,十分適合應用在大批量數據加解密的工作場景。本文基于SM4加解密算法,實現了硬件可變流水級的設計,并且搭建了SoC,利用XILINX ZYNQ型開發板模擬了實際的應用場景,具有十分重要的工程意義。
本文實現了可變流水級SM4加解密算法硬件設計。同時,將SM4加解密算法封裝為符合APB和AXI協議的標準IP,在IP內部設置配置寄存器和AXI接口,使得CPU可以通過APB總線配置加解密要求,使得加解密模塊能通過AXI總線讀寫大量數據,模擬大批量數據收發的實際情形。通過Vivado和Vivado SDK對設計進行了功能驗證和軟件驗證。由軟件驗證結果可以清晰地得出利用軟件進行加解密和利用硬件進行加解密的速度差異,硬件實現方式能滿足每個周期輸入一個數據、每個周期輸出一個數據的性能指標。同時,將軟件測試吞吐率與理想吞吐率進行了對比,證明本文設計的可行性。該設計可以根據不同的應用場景設置流水線級數,具有很強的通用性和工程意義。