黃前山,季曉勇
(南京大學 電子科學與工程系,江蘇 南京 210093)
密碼學是保障信息安全的核心技術,應用涉及軍事、國防、商貿及人們日常生活的各個方面。2001年美國標準技術研究所決定用AES算法逐漸取代日益不安全的56 bit密鑰長度的 數據加密標準(DES)算法。AES算法是迭代分組密碼算法,分組長度為128 bit,而密鑰長度可為128 bit、192 bit、256 bit,其對應不同的密鑰長度相應的迭代循環次數為 10輪、12輪、14輪。現實現的是128 bit的AES算法[1-2]。
一種AES算法實現是采用輪展開的流水線結構[3],吞吐量很大可達到10 Gb/s量級,但消耗大量的邏輯面積。考慮在資源少的FPGA上實現AES算法,能滿足低端應用的加、解密速度一般不超過100 Mb/s的需求。現設計采用順序結構[3],多輪加密共用一個輪運算結構,加密模塊和解密模塊共用一個密鑰擴展模塊,能保持較高加解密速率,同時節省了邏輯面積,在50 MHz時鐘下加解密速率可達530 Mb/s。
AES算法中的字節表示為有限域 GF (28)上的元素,并在有限域上定義加法和乘法兩種運算,運算的基本單位是字節和雙字(4個字節)。AES算法將128位的中間結果和密鑰都分成16個字節,構成4×4以字節為元素的狀態矩陣,AES在加解密過程中就是以狀態矩陣為操作對象的。加密算法中每一次輪操作都由字節替換、行移位、列混淆和輪密鑰加這四個函數組成,最后一次輪操作不含列混淆操作。
該設計的頂層結構圖如圖1所示,由控制模塊、加密模塊、解密模塊、密鑰擴展模塊、隨機存儲器(RAM)和FIFO組成。接口采用16位并行數據總線結構。加密數據流向為:明文數據通過數據總線寫入16位入128位出的FIFO緩存;由控制模塊啟動AES加密模塊進行一次加密運算;運算完成輸出128bit密文存入128位入16位出的FIFO中。解密過程與之相同。加密模塊和解密模塊完全獨立,保證模塊能同時進行加密和解密運算,以滿足快速雙向保密通信的需求。

圖1 頂層結構圖及數據流向
2.2.1 加密模塊
由于輸入8次16位數據才能提供一個128 bit明文,這一過程至少需要8個時鐘,因此采用邏輯面積較大的多輪展開流水線結構方式意義不大。該設計采用多輪運算復用一個輪操作結構的順序方式,設計原理圖如圖2所示。
輪運算包括輪密鑰加、字節替換、行移位和列混淆 4個部分。其中,輪密鑰加只是輪數據與輪密鑰進行異或運算,結構比較簡單;行移位也只是簡單的邏輯連線,幾乎不產生時延并且幾乎不耗邏輯資源。
字節替換如果采用 GF(28) 模乘求逆運算[4]實現,則邏輯延時較長,速度較慢。為加快速度,采用時延小的基于只讀存儲器(ROM)查找方式的S盒結構,即輸入8bit數據作為地址而相應數據輸出則為字節替換后的8 bit數據。S盒結構若采用基于塊存儲的查找表(LUT)來實現,一個輪運算中16個S盒將占用16×128個LUT,占用邏輯資源較大。可采用FPGA內部集成的塊 RAM來實現S盒。
列混淆是系數在有限域 GF(28)上的四次多項式矩陣乘法,輸入列向量(X0, X1, X2, X3),輸出列向量(Y0, Y1, Y2, Y3),加密過程是在GF(28)上乘以01、02、03、01,解密過程是乘以09、0E、0B、0D。為了優化用FPGA邏輯實現,采用一個xtime函數來實現GF(28)上的乘02運算,對輸入的一個字節 b 做以下變換[5]:xtime = { b[6∶0], 1'b0 } ^ ( 8'h1b &{ 8{ b[7]} } )。則列混淆在GF(28)上所有矩陣乘法就可以通過分解成有限個xtime運算和異或運算來實現。
輪密鑰加、行移位和列混淆三步運算實現的邏輯資源較少并且邏輯時延較小,可以合并在一個寄存器傳輸層間實現。
2.2.2 密鑰擴展模塊
密鑰擴展模塊設計比較簡單,只需要4個S盒和一個輪常數字計算模塊,外加一些異或運算和邏輯連線即可完成。密鑰擴展模塊也是一個迭代運算的結構,與加密模塊的輪運算同步,即每個時鐘計算出一輪加密的密鑰。
當解密密鑰更新時,密鑰擴展模塊計算出的各輪密鑰作為解密的輪密鑰,需要按每個時鐘存儲在RAM中,解密運算時從RAM中讀取。
模塊的外部接口采用了16位數據總線的接口。由于輸入的加密密鑰和解密密鑰各 128位,占用地址為128×2/16=16個。另外,加密需要一個輸入明文寄存器和一個輸出密文寄存器,解密需要一個輸入密文寄存器和一個輸出明文寄存器。因此芯片地址數總共20,即需要5位地址線。接口讀寫時序的設計以TMS320C5509型號數字信號處理器(DSP)總線讀寫時序作為標準。16位數據線采用雙向三態設計。16位三態口由片選信號CS和讀使能信號RDE控制,當CS和RDE均有效時三態口數值為輸出數據寄存器的值以輸出數據,否則三態口數值為高阻將數據輸入。
用Xilinx ISE Simulator分別對加密模塊和解密模塊進行信號仿真,仿真圖如圖3和圖4所示。
兩圖中 text_in[127∶0]為輸入數據,key[127∶0]為密鑰,text_in[127∶0]為輸出數據。在圖4和圖5中,明文均為(3243,F6A8, 885A, 308D, 3131, 98A2, E037, 0734 H),密鑰均為(2B7E, 1516, 28AE, D2A6, ABF7, 1588, 09CF, 4F3C H),密文均為(3925, 841D, 02DC, 09FB, DC11, 8597, 196A, 0B32 H),證明其加密和解密正確。

圖2 加密模塊設計原理

圖3 加密結果信號仿真

圖4 解密結果信號仿真
將設計的FPGA模塊連接到TI的5509的DSP開發板的總線擴展口,FPGA模塊通過JTAG線與計算機連接,DSP開發板通過仿真器與計算機連接。 通過C程序將明文和密鑰寫入FPGA模塊,加密后讀出密文,解密過程與之類似。通過 DSP測試,結果與 3.1仿真結果完全一致,證明 AES算法在FPGA上準確實現。
使用在線調試邏輯分析軟件通過JTAG口對FPGA總線接口的信號波形進行采樣并顯示,地址、數據和控制信號正確。通過加密或解密時連續輸出128 bit結果間隔的時鐘數可以計算出,在50 MHz時,數據處理能力可達530 Mb/s。
所采用的AES算法設計采用16位并行總線接口,能方便的與上層處理器擴展。在算法實現上,采用多輪運算共用一個輪結構的迭代結構,適用于在較少邏輯資源的 FPGA芯片上實現,滿足了較高吞吐率和較小的芯片面積的應用需求,能滿足當前各種數據流的加密。算法的實現采用ROM來實現字節替換,同時優化實現列混淆運算。該設計在賽靈思(Xilinx)公司的xc3s500e芯片上實現,僅占用4230個Slice,其中7222個LUT和1758個觸發器,消耗的邏輯資源較少。
[1] JOAN D, VINCENT R. AES Proposal: Rijndael (2ndversion) [EB/OL].(1999-03-09) [2009-09-10].http://csrc.nist.gov/ encryption/aes/rijndael/Rijndael.pdf
[2] 蘇晨,陳前斌.AES算法在流媒體加密中的應用[J].通信技術,2007,40(11):350-352.
[3] FAN C P, HWANG J K. Implementations of High Throughput Sequential and Fully Pipelined AES Processors on FPGA[C]USA:IEEE Press, 2007:353-356.
[4] 宋軍輝.基于先進加密標準(AES)算法的加密芯片設計[D].南京理工大學,2004.
[5] 武玉華,徐玲杰,周玉,等.AES 密碼算法的 FPGA 優化設計[J].通信技術,2008,41(10):133-136.