Rijndael加密算法解析

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

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

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

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

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

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

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

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

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

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

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

Rijndael加密算法解析

Rijndael加密算法解析

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

小知識之子程序:

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