Rijndael加密算法如何在ARM微處理器上實現(xiàn)

Rijndael加密算法以安全性好、運算速度快、存儲要求低、靈活性強,為計算機網絡和電子商務的發(fā)展提供了強有力的保障。而ARM微處理器憑借強大的處理能力和極低的功耗,被越來越多的企業(yè)來使用。那么我們今天就來講一下Rijndael加密算法是如何在ARM微處理器上實現(xiàn)的。

一、Rijndael加密算法簡介

1、Rijndael加密算法流程結構

Rijndael加密算法的128位輸入分組用以字節(jié)為單位的正方形矩陣描述。該數組被復制到State數組。加密過程分為四個階段:密鑰擴展、輪密鑰加、Nr—1(對應128、192、256位密鑰長度,Nr分別為10、12、14)輪變換及最后一輪變換。輪變換包括字節(jié)代換、行移位、列混淆和輪密鑰加四個過程,最后一輪變換包括字節(jié)代換、行移位和輪密鑰加三個過程。用偽C代碼表示如下:

Rijndael(State,CipherKey)

{

KeyExpansion(CipherKey,ExpandKey);

//密鑰擴展AddRoundKey(State,RoundKey);

//輪密鑰加For(i=1;i<Nr;i++)

Round(State,ExpandKey+4*i);

//輪變換

FinalRound(State,ExpandKey+4*Nr);

//最后一輪變換

}

Round(State,RoundKey)

{

//輪變換SubByte(State);

//字節(jié)代換ShiftRow(State);

//行移位MixColumn(State);

//列混淆AddRoundKey(State,RoundKey);

//輪密鑰加

FinalRound(State,RoundKey)

{

//最后一輪變換

SubByte(State);ShiftRow(State);

AddRoundKey(State,RoundKey);

}

2、Rijndael加密算法所使用的主要變換

(1)字節(jié)代換SubByte

用一個簡單的查表操作代替了基于矩陣乘法的復雜仿射變換。Rijndael定義了一個16_16字節(jié)的S盒矩陣,包含8位值所能表達的256種可能的變換。把State中每個字節(jié)的高4位作為行值,低4位作為列值,取出S盒中對應行列的元素作為新的字節(jié)輸出。

行移位變換ShiftRow:State的第一行保持不變,第2、3、4行分別循環(huán)左移1、2、3個字節(jié)。

(2)列混淆變換MixColumn

可表示為如下基于系數矩陣CoefMix與State的矩陣乘法:

Rijndael加密算法如何在ARM微處理器上實現(xiàn)

乘積矩陣中的每個元素S’i,j是系數矩陣中一行元素CoefMix[i,k]與State矩陣中對應一列元素State[k,j]的乘積之和。這里的加法與乘法都定義在有限域GF(28)上:加法即按位異或操作,乘法遵循GF(28)上的多項式乘法規(guī)則。

(3)密鑰擴展KeyExpanxsion

以4個字密鑰為輸入,生成44字擴展密鑰數組w[44],為初始輪密鑰加階段和后面10輪變換提供輪密鑰。輸入密鑰直接被復制到擴展密鑰數組的前4個字,然后每次用4個字填充擴展密鑰數組余下的部分。在擴展密鑰數組中,w[i]值依賴于w[i-1]和w[i-4]。w數組中下標不是4的倍數時,w[i]為w[i-1]和w[i-4]的異或。下標為4的倍數時,首先將w[i-1]的4個字節(jié)循環(huán)左移1個字節(jié),然后利用S盒對每個字節(jié)進行字節(jié)代換,再與輪常量按位異或。輪常量是1個字,其最右邊3個字節(jié)為0,最左邊1個字節(jié)的值RC[j]與輪數j相關。RC[1]=1,RC[j]=2#RC[j-1],乘法定義在GF(28)上。RC[j]值以十六進制表示。

(4)輪密鑰加AddRoundKey

輪密鑰加AddRoundKey是基于State列的操作,即把State一列中的4個字節(jié)與輪密鑰RoundKey的1個字進行異或。

二、Rijndael加密算法如何在ARM微處理器上實現(xiàn)

1、源程序組成及功能

源程序包含main.c和ARM匯編程序Rijndael.s。main.c用C語言編寫,主要完成調用,C/OSII函數進行系統(tǒng)初始化及I/O的全部功能,并調用Rijndael.s對明文加密。明文、密鑰及密文均在開發(fā)板顯示屏上輸出。

Rijndael.s用ARM匯編編程語言編寫,是實現(xiàn)加密算法的關鍵程序。

2、Rijndael.s程序實現(xiàn)加密算法步驟

Rijndael.s主要通過ARM匯編子程序調用完成加密算法,包括1個代碼段和1個數據段。它把算法所使用的所有變換均用同名ARM匯編子程序實現(xiàn)。代碼段包括以下幾個模塊:

首先,進行明文、密鑰預處理。明文可以從開發(fā)板鍵盤上接收,也可以是常量或參數傳遞過來的變量。

其次,調用子程序KeyExpansion完成密鑰擴展。

第三,調用子程序AddRoundKey完成初始輪密鑰加。

第四,輪變換。

包括四個步驟:a、調用子程序SubByte進行字節(jié)代換;

b、調用子程序ShiftRow進行行移位;

c、調用子程序MixColumn進行列混淆;

d、調用子程序Ad__dRoundKey進行輪密鑰加。本過程重復9次。

第五,最后一輪變換。

包括三個步驟:

a、調用子程序SubByte進行字節(jié)代換;

b、調用子程序ShiftRow進行行移位;

c、調用子程序AddRoundKey進行輪密鑰加。

最后,對生成的密文進行進一步處理,即把密文視為4_4數組,將其行與列對調。

在數據段中對轉換過程中使用到的部分數據或中間變量進行了定義并初始化。如字節(jié)代換中的S盒及列混淆變換中的系數矩陣等。

3、ARM匯編子程序代碼設計舉例

在所有子程序中,列混淆變換和密鑰擴展的代碼設計難度較高,算法較復雜。下面是列混淆子程序的代碼設計:

MixColumn;子程序入口

ldrr0,=State;取變量地址

ldrr1,=CoefMixldrr2,=Temp;Temp中間變量

movr3,#0;i=0

loop_i;i循環(huán)入口

movr4,#0;j=0loop_j;j循環(huán)入口

movr5,#0;k=0loop_k;k循環(huán)入口

movr6,r3,lsl#2

addr6,r6,r5

ldrbr6,[r1,r6];讀取CoefMix[i,k]

movr7,r5,lsl#2

addr7,r7,r4

ldrbr7,[r0,r7];讀取State[k,j]

loop_temp;此循環(huán)用來計算

Rijndael加密算法如何在ARM微處理器上實現(xiàn)
movr8,r3,lsl#2

addr8,r8,r4

andr9,r6,#1

cmpr9,#1;判斷CoefMix[i,k]的最低位是否為1

bnenotequal;若不為1,轉向執(zhí)行

ldrbr9,[r2,r8];若為1,則Temp[i,j]+=State[k,j]

eorr9,r9,r7strbr9,[r2,r8]

notequal

movr6,r6,lsr#1;CoefMix[i,k]邏輯右移1位

andr9,r7,#0x80

movr7,r7,lsl#1;State[k,j]邏輯左移1位

andr7,r7,#0xff

cmpr9,#0x80;移位后State[k,j]最高位是否為1

bltlittlethan;如不為1,轉向執(zhí)行

eorr7,r7,#0x1b;如為1,則State[k,j]與#0x1b異或littlethan

cmpr6,#0;CoefMix[i,k]與0比較

bgtloop_temp;如大于0,轉到標號loop_temp處執(zhí);行,否則讀取CoefMix[i,k+1]

addr5,r5,#1cmpr5,#4blt

loop_k

;執(zhí)行k循環(huán)

addr4,r4,#1cmpr4,#4blt

loop_j

;執(zhí)行j循環(huán)

addr3,r3,#1cmpr3,#4bltloop_I;執(zhí)行i循環(huán)

movr3,#0renew

;用Temp更新Stateldrbr4,[r2,r3]strbr4,[r0,r3]addr3,r3,#1cmpr3,#16bltrenewMixColumnend

movpc,lr

;子程序返回

三、Rijndael加密算法實現(xiàn)效率比較

在調用ARM匯編程序實現(xiàn)Rijndael加密算法之余,還在嵌入式微處理器ARM上通過調用C子程序實現(xiàn)了Rijndael算法,同樣獲得了正確結果。表1、表2是兩種實現(xiàn)方式的空間與時間效率比較。

Rijndael加密算法如何在ARM微處理器上實現(xiàn)

Rijndael加密算法如何在ARM微處理器上實現(xiàn)

由表1知,ARM子程序比C子程序所占用空間明顯小得多,前者僅為后者的55%。由表2,運行一次ARM匯編程序Rijndael.s程序完成加密算法,僅需約0.657tick(此處,1000tick=1s),而運行一次C子程序約需0.996tick,比前者增加了52%。

Rijndael加密算法在嵌入式微處理器ARM上的實現(xiàn)具有一定的實用價值。經UniversityofCalifor nia,SanDiego在因特網上提供的測試程序InteractiveRi jndaelTestVectorsinJavaScript驗證,本實現(xiàn)加密算法是正確的。

小知識之ARM微處理器

ARM微處理器憑借強大的處理能力和極低的功耗,現(xiàn)在越來越多的公司在產品選型的時候考慮到使用ARM微處理器。另外,隨著ARM功能的增強和完善,某些方面可以取代原先X86架構的單片機,特別是工控領域。基于以上兩個原因,學習和使用ARM微處理器在中國變得非常流行。