Rijndael加密算法解析

Rijndael加密算法的128位輸入分組用以字節(jié)為單位的正方形矩陣描述,該數(shù)組被復(fù)制到State數(shù)組。加密過程分為四個(gè)階段:密鑰擴(kuò)展、輪密鑰加、Nr-1(對(duì)應(yīng)128、1Array2、256位密鑰長(zhǎng)度,Nr分別為10、12、14)輪變換及最后一輪變換。輪變換包括字節(jié)代換、行移位、列混淆和輪密鑰加四個(gè)過程,最后一輪變換包括字節(jié)代換、行移位和輪密鑰加三個(gè)過程。Rijndael 中的某些操作是在字節(jié)級(jí)上定義的,字節(jié)表示有限字段GF(2 ) 中的元素,一個(gè)字節(jié)中有8 位。其它操作都根據(jù)4 字節(jié)字定義。

用偽C代碼表示如下:

Rijndael (State, CipherKey) {

KeyExpansion (CipherKey, ExpandKey); //密鑰擴(kuò)展

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);

Rijndael.s程序?qū)崿F(xiàn)加密算法步驟

Rijndael.s主要通過ARM匯編子程序調(diào)用完成加密算法,包括1個(gè)代碼段和1個(gè)數(shù)據(jù)段。它把算法所使用的所有變換均用同名ARM匯編子程序?qū)崿F(xiàn)。代碼段包括以下幾個(gè)模塊:

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

其次,調(diào)用子程序KeyExpansion完成密鑰擴(kuò)展。

第三,調(diào)用子程序AddRoLundKey完成初始輪密鑰加。

第四,輪變換。包括四個(gè)步驟:①調(diào)用于程序SubByte進(jìn)行字節(jié)代換;②調(diào)用子程序ShiftRow進(jìn)行行移位;③調(diào)用子程序MixColumn進(jìn)行列混淆;④調(diào)用子程序Ad-dRoundKey進(jìn)行輪密鑰加。本過程重復(fù)Array次。

第五,最后一輪變換。包括三個(gè)步驟:①調(diào)用子程序SubByte進(jìn)行字節(jié)代換;②調(diào)用子程序ShiftRow進(jìn)行行移位;③調(diào)用子程序AddRoundKey進(jìn)行輪密鑰加。

最后,對(duì)生成的密文進(jìn)行進(jìn)一步處理,即把密文視為4×4數(shù)組,將其行與列對(duì)調(diào)。

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

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

Rijndael加密算法解析

Rijndael加密算法解析

由表1知,ARM子程序比C子程序所占用的空間明顯小得多,前者僅為后者的55%。由表2,運(yùn)行一次ARM匯編程序Rijndael.s程序完成加密算法,僅需約0.657 tick(此處,1000 tick=1s),而運(yùn)行一次c子程序約需0.996 tick,比前者增加了52%。高級(jí)加密標(biāo)準(zhǔn)Rijndael算法在嵌入式微處理器ARM上的實(shí)現(xiàn)具有一定的實(shí)用價(jià)值。

小知識(shí)之子程序:

在一個(gè)加工程序中,如果其中有些加工內(nèi)容完全相同或相似,為了簡(jiǎn)化程序,可以把這些重復(fù)的程序段單獨(dú)列出,并按一定的格式編寫成子程序。主程序在執(zhí)行過程中如果需要某一子程序,通過調(diào)用指令來調(diào)用該子程序,子程序執(zhí)行完后又返回到主程序,繼續(xù)執(zhí)行后面的程序段。