Rijndael加密算法的128位输入分组用以字节为单位的正方形矩阵描述,该数组被复制到State数组。加密过程分为四个阶段:密钥扩展、轮密钥加、Nr-1(对应128、1Array2、256位密钥长度,Nr分别为10、12、14)轮变换及最后一轮变换。轮变换包括字节代换、行移位、列混淆和轮密钥加四个过程,最后一轮变换包括字节代换、行移位和轮密钥加三个过程。Rijndael 中的某些操作是在字节级上定义的,字节表示有限字段GF(2 ) 中的元素,一个字节中有8 位。其它操作都根据4 字节字定义。
用伪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); //字节代换
ShiftRow(State); //行移位
MixColumn(State); //列混淆
AddRoundKey(State, RoundKey); 轮密钥加
FinalRound(State, RoundKey) { //最后一轮变换
SubByte(State);
ShiftRow(State);
AddRoundKey(State,RoundKey);
Rijndael.s程序实现加密算法步骤
Rijndael.s主要通过ARM汇编子程序调用完成加密算法,包括1个代码段和1个数据段。它把算法所使用的所有变换均用同名ARM汇编子程序实现。代码段包括以下几个模块:
首先,进行明文、密钥预处理。明文可以从开发板键盘上接收,也可以是常量或参数传递过来的变量。
其次,调用子程序KeyExpansion完成密钥扩展。
第三,调用子程序AddRoLundKey完成初始轮密钥加。
第四,轮变换。包括四个步骤:①调用于程序SubByte进行字节代换;②调用子程序ShiftRow进行行移位;③调用子程序MixColumn进行列混淆;④调用子程序Ad-dRoundKey进行轮密钥加。本过程重复Array次。
第五,最后一轮变换。包括三个步骤:①调用子程序SubByte进行字节代换;②调用子程序ShiftRow进行行移位;③调用子程序AddRoundKey进行轮密钥加。
最后,对生成的密文进行进一步处理,即把密文视为4×4数组,将其行与列对调。
Rijndael加密算法实现效率比较
在调用ARM汇编程序实现Rijndael加密算法之余,还在嵌入式微处理器ARM上通过调用C子程序实现了Rijndael算法,同样获得了正确结果。表1、表2是两种实现方式的空间与时间效率比较。
由表1知,ARM子程序比C子程序所占用的空间明显小得多,前者仅为后者的55%。由表2,运行一次ARM汇编程序Rijndael.s程序完成加密算法,仅需约0.657 tick(此处,1000 tick=1s),而运行一次c子程序约需0.996 tick,比前者增加了52%。高级加密标准Rijndael算法在嵌入式微处理器ARM上的实现具有一定的实用价值。
小知识之子程序:
在一个加工程序中,如果其中有些加工内容完全相同或相似,为了简化程序,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。主程序在执行过程中如果需要某一子程序,通过调用指令来调用该子程序,子程序执行完后又返回到主程序,继续执行后面的程序段。