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

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

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

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

一、圖形化處理單元

1、圖形流水線(xiàn)

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

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

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

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

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

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

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

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

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

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

二、AES算法概述

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

該算法具有如下幾個(gè)特點(diǎn):

(1)對(duì)稱(chēng)密鑰密碼;

(2)塊密碼;

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

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

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

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

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

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

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

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

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

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

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

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

1、初始化階段

在初始化階段,需要用CPU來(lái)擴(kuò)展密鑰,生成十組新的密鑰,用于每一次Round中的AddRoundKey。然后需要將輸入數(shù)據(jù)(明文)InPutData[Width][ Height],綁定到一張二維紋理。輸人數(shù)據(jù)的大小
是Width木Height水4個(gè)字節(jié)。由于明文存儲(chǔ)在二維紋理中,所以需要快速準(zhǔn)確地用紋理坐標(biāo)中找到對(duì)應(yīng)的數(shù)據(jù)。通過(guò)如下的Draw函數(shù)能實(shí)現(xiàn)該功能,紋理坐標(biāo)(頂點(diǎn)坐標(biāo)+1.0)/2。由于需要將每個(gè)Pass的結(jié)果輸出到紋理緩存,所以需要分別創(chuàng)建四張二維紋理及四個(gè)幀緩沖區(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操作使用一個(gè)非線(xiàn)性的稱(chēng)為S-box的替換表,獨(dú)立地代替字節(jié),如圖3所示。S-box是提前已計(jì)算好的一個(gè)統(tǒng)一的表,所以可以直接預(yù)先存儲(chǔ)在GPU內(nèi)存中,在對(duì)應(yīng)的Shader( SubBytes)中聲明。

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

3、ShiftRows操作

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

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

4、MixColumns操作

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

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

該操作通過(guò)對(duì)每一個(gè)列向量執(zhí)行矩陣乘操作來(lái)完成,如公式(2)所示。因?yàn)槌朔ㄊ窃贏ES的一個(gè)有限域上操作,所以不能使用一般的乘操作。

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

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

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

{//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操作

這個(gè)操作是很簡(jiǎn)單的。就是用當(dāng)前輪的密鑰與對(duì)應(yīng)的每個(gè)字節(jié)進(jìn)行異或操作。

四、性能對(duì)比

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

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

測(cè)試的機(jī)器配置如下:

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

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

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

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

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

小知識(shí)之GPU

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