如何用GPU實現(xiàn)的AES加密

圖形處理器( Graphics Processing Unit,GPU),亦稱圖形處理單元。是一種專用圖像渲染設(shè)備,分擔了中央處理器( CPU)的二維或三維圖形處理任務(wù)。隨著近年來各種硬件加速的出現(xiàn)使顯卡性能突飛猛進。正是這個時候,第一款可編程圖形流水線(pro-grammable graphics pipeline)的GPU產(chǎn)品誕生,即Ge-Force3。從此,可編程的著色功能加入了硬件。

GPU擁有了更大的可擴展性和適應(yīng)性。GPU高度并行化的架構(gòu)和可編程的著色器使人們漸漸開始用它計算通用任務(wù),實現(xiàn)了對通用數(shù)據(jù)的處理。GPGPU技術(shù)也是在這個時期開始發(fā)展起來的。GPGPU代表General Purpose Computing on Graphics Processing U-nit,就是“圖形處理器通用計算技術(shù)”。這種新興的加速技術(shù)試圖把個人計算機上的顯卡當作CPU這樣的通用處理器來用,使顯卡的強勁動力不僅發(fā)揮在圖形處理上。用著色語言實現(xiàn)的GPGPU技術(shù)是第一代的GPGPU技術(shù),也稱為經(jīng)典GPGPU、傳統(tǒng)GPGPU。但是傳統(tǒng)的GPU幾乎專門用來進行浮點操作,因為整數(shù)操作只能使用浮點數(shù)尾數(shù)來完成,所以就不能完成那些要求按位邏輯操作的處理。然而隨著GeForce 8系列GPU的出現(xiàn),多種新的擴展和功能被引入。新的整數(shù)處理功能不僅包括算術(shù)操作,還包括按位的邏輯操作,以及移位操作。然后,數(shù)組變量代替紋理提供了一種靈活的方式存儲常量表。目前,如何方便、快速地實現(xiàn)加密算法是密碼學(xué)領(lǐng)域遇到的一個新的挑戰(zhàn)。而GPU其特有的并行計算特性如果應(yīng)用到AES加密算法,將顯著提高該算法的加密速度。文中正是基于上述原因,提出了一種基于傳統(tǒng)OpenGL可編程模型的一種AES加密算法。

文中首先將介紹傳統(tǒng)GPU編程模型及相關(guān)概念,然后概述AES加密算法,接著介紹AES加密算法在GPU上的實現(xiàn),最后將與在傳統(tǒng)CPU上實現(xiàn)的AES加密算法進行性能上的比較。

一、圖形化處理單元

1、圖形流水線

圖形流水線是GPU工作的通用模型。它以某種形式表示的三維場景為輸入,輸出二維的光柵圖像到顯示器,也就是位圖。GPU中的圖形流水線的總體框架如圖1所示。上半部分為OpenGL傳統(tǒng)圖形流水線,下半部分為OpenGL可編程圖形流水線。

如何用GPU實現(xiàn)的AES加密

傳統(tǒng)圖形流水線,首先經(jīng)過頂點級的光照計算和坐標變換求出每個頂點的光照顏色值,同時還將頂點坐標從物體坐標系轉(zhuǎn)換到裁剪空間。然后,對每個三角形進行光柵化處理并對三角形頂點的顏色進行雙線性插值得到了三角形中每一個像素的顏色值。接著進行紋理映射,即根據(jù)每一個像素的紋理坐值將紋理圖顏色分配到每個像素上。最后進行顏色混合計算和霧化效果計算得到的結(jié)果將會放進幀緩存并顯示到屏幕上。

可編程著色管線意味著可以用小型程序控制頂點和片段的處理,即頂點著色器和片段著色器。這種小型程序是由OpenGL著色語言(GLSL)編寫。著色器( shader),又叫著色單元,實際上就是GPU的處理器。一般情況下,一個GPU會有多個處理器(幾百上千個),它們同時工作,體現(xiàn)了GPU大規(guī)模并行處理的能力。進行幾何計算的處理器叫頂點著色器,它負責對頂點進行坐標變化、投影變換等;進行片段的顏色處理的叫做片段著色器D應(yīng)用程序輸入GPU的是三維的點云數(shù)據(jù)。從流水線輸入端直到頂點著色器,流水線計算的對象都是三維幾何模型;從光柵化開始,所有的操作都是針對二維的像素了。

2、經(jīng)典GPGPU技術(shù)

在了解GPGPU技術(shù)之前,有必要了解一下GPU的并行計算模型SIMD,與數(shù)據(jù)并行模型實際上是完全相同的。GPU的并行概念實際就是數(shù)據(jù)并行(dataparallelism)。它是指多個不同的數(shù)據(jù)同時被相同的指令、指令集或者算法處理?;仡檲D形流水線,每個頂點都經(jīng)過了相同的流水線,實際上流水線只是個抽象的概念,它指的就是一段算法。因此,GPU計算任務(wù)的本質(zhì)與程序中的循環(huán)語句是相同的,但是需要串行處理的數(shù)據(jù)量減少到了Nparallel,如公式(1)所示。

如何用GPU實現(xiàn)的AES加密

式中,Ndata是數(shù)據(jù)的總個數(shù),Ntlu-eads是線程的個數(shù)。當每個線程處理一個數(shù)據(jù)所需的時間相等時,數(shù)據(jù)并行處理的速度是單線程循環(huán)語句的速度的Nthreads倍。

經(jīng)典GPGPU借助的是GPU圖形流水線的大規(guī)模并行計算能力。成千上萬的頂點都流經(jīng)同樣的流水線,成為屏幕上的像素。由于每個頂點和每個像素都經(jīng)過了相同算法的處理,因此SIMD模型就是GPU計算的基本模型。

目前為止,還有一些很重要的問題亟待解決。比如,流水線的終點是幀緩存或者顯示器,而科學(xué)計算一般需要寫入存儲器,這是如何做到?圖形流水線處理的是坐標信息和像素信息,如何才能處理通用數(shù)據(jù)?在OpenGL提供有限數(shù)量的圖形處理函數(shù)的情況下,如何制定科學(xué)計算所需要的算法?對于第一個問題其實就是紋理緩存口第二個問題,其實用戶只要選擇合適的數(shù)據(jù)類型來聲明數(shù)組,再將數(shù)組作為數(shù)據(jù)的容器,最后把這樣的數(shù)組看作一幅紋理并傳輸至紋理緩存就可以啦。第三個問題其實就是通過著色語言和著色器來實現(xiàn)的。

二、AES算法概述

AES加密算法是由Daemen和Rijmen早期所設(shè)計的Square改良而來。使用的是置換一組合架構(gòu),在軟件及硬件上都能快速地加解密,相對來說較易于實際操作,且只需要很少的內(nèi)存。作為一個新的加密標準,目前正被部署應(yīng)用到更廣大的范圍。

該算法具有如下幾個特點:

(1)對稱密鑰密碼;

(2)塊密碼;

(3)支持128位塊大小,當前該算法的聯(lián)邦信息處理標準規(guī)范只支持固定大小的128位塊;

(4)支持128位、192位、256位密鑰長度。不同的密鑰長度加密的輪數(shù)不一樣,文中使用128位的密鑰長度。

AES加密過程是在一個4x4的字節(jié)矩陣上運作,這個矩陣又稱為“體( state)”,其初值就是一個明文區(qū)塊(矩陣中一個元素大小就是明文區(qū)塊中的一個Byte)。

加密時,各輪AES加密循環(huán)(除最后一輪外)均包含如下4個步驟(加密過程中使用的密鑰是由Rijndael密鑰生成方案產(chǎn)生):

(1) AddRoundKey:矩陣中的每個字節(jié)都與該次回合金鑰做XOR(異或)運算。

(2) SubBytes:矩陣中的各字節(jié)透過一個8位元的S-box進行轉(zhuǎn)換。,這個步驟提供了加密法非線性的變換能力。S-box是一個具有256個元素的已知數(shù)組。

(3) ShiftRows:針對矩陣的每一個橫列操作的步驟。在此步驟中,每一行都向左循環(huán)位移某個偏移量。在AES中(區(qū)塊大小128位元),第一行維持不變,第二行里的每個字節(jié)都向左循環(huán)移動一格。同理,第三行及第四行向左循環(huán)位移的偏移量就分別是2和3。

經(jīng)過ShiftRows之后,矩陣中每一豎列,都是由輸入矩陣中的每個不同列中的元素組成。

(4) MixColumns:每一直行的四個字節(jié)透過線性變換互相結(jié)合。每一直行的四個元素分別當作1,x2,x3,x4的系數(shù),合并即為GF(28)中的一個多項式,接著將此多項式和一個固定的多項式C(x)=3x3 +X2 +X +2在moddulo4+1下相乘。此步驟亦可視為Rijndael有限域之下的矩陣乘法。MixColumns函數(shù)接受4個字節(jié)的輸入,輸出4個字節(jié),每一個輸入的字節(jié)都會對輸出的4個字節(jié)造成影響。因此ShiftRows ows和MixCoIumns兩步驟為這個密碼系統(tǒng)提供了擴散性。其流程圖如圖2所示。

如何用GPU實現(xiàn)的AES加密

三、AES在GPU上的實現(xiàn)

了解了可編程GPU流水線及AES算背景后,就可以開始著手設(shè)計該算法。如圖2,是AES加密算法的流程口圖中大方框內(nèi)的內(nèi)容就是GPU代替CPU實現(xiàn)的步驟。首先考慮輸入問題。明文是應(yīng)用程序的輸入,這可以通過二維紋理的形式存入GPU的紋理緩存,以供GPU使用。其實每一個Round就是一次渲染,每次渲染是由四個Pass組成,這四個Pass分別是SubBytes,ShiftRows,MixColumns,AddRoundKey。優(yōu)化后將SubBytes和ShiftRows合并為一個Pass。

1、初始化階段

在初始化階段,需要用CPU來擴展密鑰,生成十組新的密鑰,用于每一次Round中的AddRoundKey。然后需要將輸入數(shù)據(jù)(明文)InPutData[Width][ Height],綁定到一張二維紋理。輸人數(shù)據(jù)的大小
是Width木Height水4個字節(jié)。由于明文存儲在二維紋理中,所以需要快速準確地用紋理坐標中找到對應(yīng)的數(shù)據(jù)。通過如下的Draw函數(shù)能實現(xiàn)該功能,紋理坐標(頂點坐標+1.0)/2。由于需要將每個Pass的結(jié)果輸出到紋理緩存,所以需要分別創(chuàng)建四張二維紋理及四個幀緩沖區(qū),并一一綁定。

void draw(int w,int h){

float w_bias = 0.5/w;float h_bias =0.5/h ;

float h_inverse = 1.O/h;float w- rnverse = 1.O/w;

gIBegin( GL_POINTS)

for(int i = O;i < w;i++) {

for(int j = O;j < h;j++) {

gIVertex3f( i * 2 * w_inverse+2 * w_bias-l, j * 2*h_bias-l', 0. 0) ; }

gIEnd()

}

2、SubBytes操作

SubBytes操作使用一個非線性的稱為S-box的替換表,獨立地代替字節(jié),如圖3所示。S-box是提前已計算好的一個統(tǒng)一的表,所以可以直接預(yù)先存儲在GPU內(nèi)存中,在對應(yīng)的Shader( SubBytes)中聲明。

如何用GPU實現(xiàn)的AES加密

3、ShiftRows操作

ShiftRows操作循環(huán)地移動體的最后三行,從而有效地讓行數(shù)據(jù)變得不規(guī)則,如圖4所示。其實此時可以做一個簡單的優(yōu)化,就是把SubBytes操作和ShiftRows操作融合到一個Pass。

如何用GPU實現(xiàn)的AES加密

4、MixColumns操作

MixColumns操作的目的是使每一列的數(shù)據(jù)變得不規(guī)則,如圖5所示。

如何用GPU實現(xiàn)的AES加密

該操作通過對每一個列向量執(zhí)行矩陣乘操作來完成,如公式(2)所示。因為乘法是在AES的一個有限域上操作,所以不能使用一般的乘操作。

如何用GPU實現(xiàn)的AES加密

這個有限域的閉包在一個字節(jié)的范圍內(nèi)。其程序清單如下:

void MixColumns( vec2 pos)//pos為紋理坐標

{//InputDataMix為sampler2D的und'orm變量

data =ivec4( texture2D( InputDataMix, pos));

int a[4];int b[4];int h;

for(int c=O;c<4;c++){ a[c]=data[c]; if( data[c]>127){ h=OxOOOOOOFF;}

else{ h=Ox00000000;}

b[c].(data[c]<<1) &OxOOOOOOFF;

b[c]=(OxOOOOOOIB&h);

}

data[O]=b[O]^a[3]^a[2]^b[1]^a[1];

1*2*a0+a3+a2+3*al*/

data[1]=b[1]^a[O]^a[3]^b[2]^a[2];

1*2*al +a0+a3 +3*a2 */

data[2]=b[2]^a[1]^a[0]^b[3]^a[3];

1*2*a2+al+a0+3*a3 */

data[3]=b[3]^a[2]^a[1]^b[O]^a[0];

1*2*a3+a2+al+3*a0*/

OutputData=vec4( data);

//OutputData是varying變量}

5、AddRoundKey操作

這個操作是很簡單的。就是用當前輪的密鑰與對應(yīng)的每個字節(jié)進行異或操作。

四、性能對比

有了一個在基于GPU的AES實現(xiàn),現(xiàn)在就可以測量一下該方法的性能。這里忽略了解密,因為在AES算法中,加密和解密的性能是相同的。性能對比如表1所示。批塊大小是指,每次被送往GPU中的數(shù)據(jù)量。

如何用GPU實現(xiàn)的AES加密

測試的機器配置如下:

(1) CPU:Intel( R) XeOn( R) W3520 2.67GHZ

(2)內(nèi)存:4GB

(3)顯卡:GTX 470顯存:IGB

(4)系統(tǒng):Windows7 x64旗艦版

從表1可知,當批塊小于4MB時,基于GPU的AES加密方法顯著地提高了加密速度。當批塊大小為4MB時,加密速度大約是基于CPU加密的40倍。當批塊過大時,由于紋理大小的限制加密速度顯著降低。此時可以把明文分割為4MB的批塊,同時使用多張二維紋理進行加密。

小知識之GPU

GPU英文全稱Graphic Processing Unit,中文翻譯為“圖形處理器”。(圖像處理單元)GPU是相對于CPU的一個概念,由于在現(xiàn)代的計算機中(特別是家用系統(tǒng),游戲的發(fā)燒友)圖形的處理變得越來越重要,需要一個專門的圖形的核心處理器。