張慧霞, 趙建平, 李曉麗, 路 娜
(曲阜師范大學(xué) 物理工程學(xué)院,山東 曲阜 273165)
由于缺乏保密措施,使得電話竊聽,密碼泄露等事件不斷發(fā)生,嚴(yán)重威脅到個人的隱私、軍事、商業(yè)機(jī)密、地區(qū)和國家的信息安全。因此,AES(Advanced Encryption Standard)加密算法已成為信息安全領(lǐng)域研究的熱點(diǎn)。AES算法是美國國家標(biāo)準(zhǔn)技術(shù)研究所(NIST)于 2001年宣布其成為取代DES的新一代數(shù)據(jù)高級加密標(biāo)準(zhǔn)[1]。該算法在實(shí)現(xiàn)方面具有設(shè)計簡單、安全性高、速度快等優(yōu)點(diǎn),而且AES算法的128位的密鑰比DES的56位密鑰在破解所花費(fèi)的時間上強(qiáng)1021倍[2]。如果加解密使用同樣的密鑰,安全性得不到保證。文中所采用不同的(相關(guān)的)加解密密鑰,把加密密鑰擴(kuò)展模塊的最后一輪子密鑰作為解密密鑰的初試密鑰,這樣可以加強(qiáng)通信安全性,保密性。
AES是一個迭代型分組密碼算法,分組長度為128 bit,有三種可選密鑰長度分別是 128 bit,192 bit,256 bit。不同的密鑰長度對應(yīng)的迭代循環(huán)次數(shù)rN分別是10輪,12輪,14輪。由于其操作都是以字節(jié)為基礎(chǔ)的,因此把中間變量和密鑰都分成 16個字節(jié)。加密數(shù)據(jù)按照從上到下、從左到右構(gòu)成4×4以字節(jié)為元素的狀態(tài)矩陣(State)。加密過程是首先使待加密的明文與初始密鑰異或(AddRoundKey),然后進(jìn)行 10次圈迭代變換。每圈包括字節(jié)替換變換(SubBytes)、行移位變換(ShiftRows)、列混合變換(MixColumns)、輪密鑰異或變換(AddAdd RoundKey)四步變換[3],最后一圈不含列混合操作。解密運(yùn)算是與加密過程完全相反的逆運(yùn)算。文中以數(shù)據(jù)長度和密鑰長度均為128 bit為例進(jìn)行討論。
該設(shè)計的整體內(nèi)部結(jié)構(gòu)框圖如圖1所示,該結(jié)構(gòu)由加密模塊、解密模塊、控制模塊、FIFO組成。其中AES加密模塊包括字節(jié)替換模塊(SubBytes)、行移位模塊(ShiftRows)、列混合模塊(MixColumns)、輪密鑰異或模塊(AddRoundKey);解密模塊包括逆字節(jié)替換模塊(invSubBytes)、逆行移位模塊(invShiftRows)、逆列混合模塊(invMixColumns)、逆輪密鑰異或模塊(invAddRoundKey)。加密過程的數(shù)據(jù)流向?yàn)椋菏紫让魑臄?shù)據(jù)通過數(shù)據(jù)總線寫入16位入128位出的FIFO緩存;然后由控制模塊啟動AES加密模塊進(jìn)行一次加密運(yùn)算;運(yùn)算完成輸出128 bit密文存入128位入16出的FIFO中。解密過程與其相同。
圖1 整體內(nèi)部結(jié)構(gòu)框
2.2.1 字節(jié)替換和逆字節(jié)替換的實(shí)現(xiàn)
字節(jié)替換是AES密碼中唯一的非線性變換。它將狀態(tài)組的每一個字節(jié)非線性變換成另一個字節(jié)。此模塊如果采用 GF(28)模乘求逆運(yùn)算[4]實(shí)現(xiàn),則邏輯延時較長,速度較慢。為加快速度,采用時延小、基于只讀存儲器(ROM)查找方式的S盒結(jié)構(gòu),即把輸入的8bit的數(shù)據(jù)作為地址而相應(yīng)的輸出作為字節(jié)替換后的 8bit數(shù)據(jù)[5]。逆字節(jié)替換是字節(jié)替換的逆運(yùn)算,采用逆S盒實(shí)現(xiàn)。字節(jié)替換的部分代碼是:
case (a)
8’h00: o=8’h63;
8’h01: o=8’h7c;
......
8’hff: o=8’h16;
2.2.2 行移位模塊與逆行移位模塊的實(shí)現(xiàn)
把行移位的結(jié)果狀態(tài)矩陣State的第一行不變,其余的三行依次循環(huán)左移一個字節(jié)、兩個字節(jié)、三個字節(jié),變換如式(1)所示。逆行移位模塊是行移位的逆變換,即各行進(jìn)行循環(huán)右移。
2.2.3 列混合變換與逆列混合變換的實(shí)現(xiàn)
列混合變換是利用矩陣乘法做位元變換。列混合變換將行移位的變換結(jié)果的狀態(tài)列看作是有限域上的次數(shù)小于 4的多項(xiàng)式 s(x)[6]與多項(xiàng)式進(jìn)行模x4+1相乘運(yùn)算。令,用矩陣乘法表示(矩陣元素用十六進(jìn)制表示)如式(2)所示
function [7:0] mult2;
input [7:0] s;
mult2={s[6],s[5],s[4],s[3]^s[7],s[2]^s[7],s[1],s[0]^s[7],s[7]}
2.2.4 加密與解密密鑰擴(kuò)展模塊
密鑰擴(kuò)展作用是負(fù)責(zé)產(chǎn)生各輪操作所需要的子密鑰,它控制著整個算法的效率。因?yàn)槊恳惠喿儞Q都要和相應(yīng)密鑰擴(kuò)展生產(chǎn)的子密鑰進(jìn)行異或運(yùn)算。加密運(yùn)算采用的是內(nèi)部擴(kuò)展,即加密運(yùn)算與加密密鑰擴(kuò)展運(yùn)算是同步的,但是與解密不能同步,因?yàn)榻饷苓\(yùn)算使用的初始密鑰是加密密鑰擴(kuò)展模塊生產(chǎn)的最后一輪子密鑰。通過構(gòu)造不同的加密密鑰擴(kuò)展算法與解密密鑰擴(kuò)展算法,使得采用不同初始密鑰實(shí)現(xiàn)數(shù)據(jù)的加密和解密。
AES算法利用外部輸入的初始密鑰 key(KN 為密鑰長度,以字為單位),通過密鑰擴(kuò)展模塊得到輪密鑰的位數(shù)是(分組長度)×(KN+1),即 128×(10+1)=1408位。它涉及到一下二個模塊:
1)位置變換模塊(rot_word ):把一個4字節(jié)的序列in[31:0]變換成{in[23:0],in[31:24]};
2)S盒變換(sub_word):對一個4字節(jié)序列進(jìn)行字節(jié)替換。圈常數(shù)數(shù)組’00’,’00’)是固定的數(shù)組,其中 rconst[i]所用可能值是示 ) ’01’,’02’,’04’,’08’,’10’,’20’,’40’,’ 80’,’1b’,’36’,‘6c’(十六進(jìn)制)。
加密子密鑰生成過程:外部輸入的密鑰作為初始密鑰,以后的子密鑰就是字 w[i]等于其前一個字w[i-1]與前kN 個字 w[i-kN]進(jìn)行“異或”,即 []w i=若i是KN 的倍數(shù):w[i]=w[i-加密密鑰擴(kuò)展模塊的部分代碼是:
rot_word..rw(.i(key_in[31:0]), .out(rot_key));
sub_word sw (.in (rot_key), .out(subrot_key));
xor6_32q(.o(key_out[127:96]),.a({rconst[i],24'b0}),.b(subrot_key),.c(key_in[127:96]),.d(32'b0),.e(32'b0),.f(32'b0));
解密子密鑰生成過程是:首先使初始密鑰字序列進(jìn)行異或,然后再進(jìn)行位置變換、字節(jié)替換和異或運(yùn)算。
解密密鑰擴(kuò)展模塊的部分代碼是:
assign {a,b,c,d} = key_in;
wire [31:0] w,x,y,z;
assign key_out = {w,x,y,z};
assign z = c ^ d;
assign y = b ^ c;
assign x = a ^ b;
wire [31:0] rot_key;
wire [31:0] subrot_key;
rot_word rw (.in (z), .out(rot_key));
sub_word..sw(.in(rot_key),
.out(subrot_key));
assignw=a ^ subrot_key ^ {rconst,24'b0}
用Xilinx ISE Simulator分別對加密模塊與解密模塊進(jìn)行功能仿真,加密模塊功能仿真結(jié)果如圖 2所示,其輸入明文是dat_in[127:0]=128’h8e09e9d2ba 681af3d6d33313bcdb20d3,密鑰是 key[127:0]=128’hfa32bb8cc3c825ad90c45d3ab6980c57,對應(yīng)的輸出密文是 dat_out[127:0]=128’h1468974803d64bcc89bcf 0ad7b28a454。
將加密后的結(jié)果進(jìn)行解密,把加密輸出的子密鑰作為解密的初始密鑰,解密模塊功能仿真結(jié)果如圖 3所示,輸入密鑰是:inv_key[127:0]=128’h3fdf0ed cabe54f56c60a5337984d34df。解密后的結(jié)果:dat_out=128’h8e09e9d2ba681af3d6d33313bcdb20d3,與輸入的明文比較結(jié)果相同,驗(yàn)證成功。
圖2 加密結(jié)果信號功能仿真
圖3 解密結(jié)果信號功能仿真
文中加密算法的實(shí)現(xiàn)采用賽靈思(Xilinx)公司的Spartan6系列的XC6SLX16芯片作為器件,在ISE 13.1軟件平臺下對AES算法verilog HDL代碼進(jìn)行編譯、綜合、仿真。在加密密鑰與解密密鑰不同,但相關(guān)的情況下,經(jīng)過多次調(diào)試仿真后,驗(yàn)證該算法正確性。
[1] 何德彪,胡進(jìn),陳建華.基于 FPGA的高速 AES實(shí)現(xiàn)[J].華中科技大學(xué)學(xué)報,2010(02):101-103.
[2] 楊軍,張偉平,趙嘎,等.面向 SOPC的 FPGA設(shè)計與應(yīng)用[M].北京:科學(xué)出版社,2012:177-188.
[3] 嚴(yán)迎健,任方,付小兵,等.基于 NIOSII的語音加密傳輸系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2009(09):61-6.
[4] 宋軍輝.基于選進(jìn)加密標(biāo)準(zhǔn)(AES)算法的加密芯片設(shè)計[D].南京:南京理工大學(xué),2004.
[5] 黃前山,季曉勇.基于低成本 FPGA的 AES密碼算法設(shè)計[J].通信技術(shù),2010,43(09):156-158.
[6] 高帥娜.基于 FPGA的數(shù)據(jù)加密設(shè)備的設(shè)計[D].大連:大連海事大學(xué),2012.