您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

在ARM微处理惩罚器上实现Rijndael加密算法

发布日期:2011-04-21

    引 言
    2000年10月2日,美国国度标准局NIST宣布,比利时暗码学家Joat Daemen和Vincent Rijmen计划的“RijndaeI算法”以寂静性好、运算速率快、存储请求低、机动性强终极当选AES。该算法对如今的种种威胁是免疫的。这标记取信息技能有了新的寂静东西,为谋略机网络和电子商务的生长提供了强有力的保障。

    在当前数字信息技能和网络技能高速生长的后PC期间,嵌入式体系技能已经遍及地渗入渗出到科学研究、工程计划、军事技能、种种财产和贸易文化艺术以及人们的一样平常生存等方方面面中,成为如今最热门的技能之一。

    本文利用北京博创兴业科技有限公司研制的UP-NETARM300嵌入式开辟板,在ARM SDT 2.51集成开辟环境下,创建基于μC/OS-Il操纵体系的工程文件,分别调用ARM汇编步伐和C步伐在嵌入衰落处理惩罚器上实现了Rijndael算法,并比较了两者的服从。下面以分组长度和密钥长度都是128位为例,先容调用ARM汇编步伐实现加密算法的进程。本实现算法可以将密钥长度扩展
到192位或256位。


1 Rijndael加密算法简介
1.1 算法流程布局

    Rijndael加密算法的128位输入分组用以字节为单位的正方形矩阵形貌。该数组被复制到State数组。加密进程分为四个阶段:密钥扩展、轮密钥加、Nr-1(映射128、192、256位密钥长度,Nr分别为10、12、14)轮更改及末了一轮更改。轮更改包括字节代换、行移位、列殽杂和轮密钥加四个进程,末了一轮更改包括字节代换、行移位和轮密钥加三个进程。用伪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); 
1. 2算法所利用的重要更改
(1)字节代换SubByte
    用一个大略的查表操纵代替了基于矩阵乘法的巨大仿射更改。Rijndael定义了一个16×16字节的S盒矩阵,包括8位值所能表达的256种大概的更改。把Statc中每个字节的高4位作为行值,低4位作为列值,取出S盒中映射行列的元素作为新的字节输出。
行移位更改ShiftRow:State的第一行保持稳固,第2、3、4行分别循环左移1、2、3个字节。
(2)列殽杂更改MixColumn
    可表现为如下基于系数矩阵CoefMix与State的矩阵乘法:

    乘积矩阵中的每个元素S'i,j是系数矩阵中一行元素CoefMix[i,k]与State矩阵中映射一列元素State[k,j]的乘积之和。这里的加法与乘法都定义在有限域GF(28)上:加法即按位异或操纵,乘法依照GF(28)上的多项式乘规矩则。
(3)密钥扩展KeyExpanxsion
    以4个字密钥为输入,天生44字扩展密钥数组ω[44],为初始轮密钥加阶段和背面10轮更改提供轮密钥。输入密钥直接被复制到扩展密钥数组的前4个字,然后每次用4个字添补扩展密钥数组余下的部分。在扩展密钥数组中,ω[i]值依赖于ω[i-1]和ω[i-4]。ω数组中下标不是4的倍数时,ω[i]为ω[i-1]和ω[i-4]的异或。下标为4的倍数时,起首将ω[i-1]的4个字节循环左移1个字节,然后利用S盒对每个字节举行字节代换,再与轮常量按位异或。轮常量是1个字,其最右边3个字节为O,最左边1个字节的值RC[j]与轮数j相干。RC[1]=1,RC[j]=2·RC[j-1],乘法定义在GF(28)上。RC[j]值以十六进制表现。
(4)轮密钥加AddRoundKey
    是基于State列的操纵,即把State一列中的4个字节与轮密钥RoundKey的1个字举行“异或”。


2 ARM汇编编程实现Rijndael算法的要点
2. 1源步伐构成及成果

    源步伐包括main.c和ARM汇编步伐Rijndael.s。main.c用C语言编写,重要完成调用μC/OS-II函数举行体系初始化及I/O的全部成果,并调用Rijndael.s对明文加密。明文、密钥及密文均在开辟板表现屏上输出。
    Rijndael.s用ARM汇编编程语言编写,是实现加密算法的关键步伐。
2. 2 Rijndael.s步伐实现加密算法步调
    Rijndael.s重要通过ARM汇编子步伐调用完成加密算法,包括1个代码段和1个数据段。它把算法所利用的全部更改均用同名ARM汇编子步伐实现。代码段包括以下几个模块:
    起首,举行明文、密钥预处理惩罚。明文可以从开辟板键盘上吸取,也可以是常量或参数转达过来的变量。
    其次,调用子步伐KeyExpansion完成密钥扩展。
    第三,调用子步伐AddRoLundKey完成初始轮密钥加。
    第四,轮更改。包括四个步调:①调用于步伐SubByte举行字节代换;②调用子步伐ShiftRow举行行移位;③调用子步伐MixColumn举行列殽杂;④调用子步伐Ad-dRoundKey举行轮密钥加。本进程重复9次。
    第五,末了一轮更改。包括三个步调:①调用子步伐SubByte举行字节代换;②调用子步伐ShiftRow举行行移位;③调用子步伐AddRoundKey举行轮密钥加。
    末了,对天生的密文举行进一步处理惩罚,即把密文视为4×4数组,将其行与列对调。
    在数据段中对转换进程中利用到的部分数据或中间变量举行了定义并初始化。如字节代换中的S盒及列殽杂更改中的系数矩阵等。
2.3 ARM汇编子步伐代码计划举例
    在全部子步伐中,列殽杂更改和密钥扩展的代码计划难度较高,算法较巨大。下面是列殽杂子步伐的代码计划:

    MixColumn  ;子步伐入口

    ldr  r0,=State  ;取变量地点

    ldr  r1,=CoefMix

    ldr  r2,=Temp   ;Temp中间变量

    mov  r3,#0   ;i=0

    loop_i    ;i循环入口

    mov  r4,#0    ;j=0

    loop_j    ;j循环入口

    mov  r5,#0  ;k=0

    loop_k  ;k循环入口

    mov  r6,r3,lsl #2

    add  r6,r6,r5

    ldrb  r6,[r1,r6]  ;读取CoefMix[i,k]

    mov  r7,r5,lsl #2

    add  r7,r7,r4

    ldrb  r7,[r0,r7]  ;读取State[k,j]

    loop_temp  ;此循环用来谋略

   

    mov  r8,r3,lsl  #2

    add  r8,r8,r4

    and  r9,r6,#1

    cmp  r9,#1  ;果断CoefMix[i,k]的最低位是否为1

    bne notequal  ;若不为1,转向实行

    ldrb  r9,[r2,r8]   ;若为1,则Temp[i,j)+=State[k,j]

    eor  r9,r9,r7

    strb  r9,[r2,r8]

    notequal

    mov  r6,r6,lsr  #1  ;CoefMix[i,k]逻辑右移1位

    and  r9,r7,#0x80

    mov  r7,r7,lsl  #1  ;State[k,j]逻辑左移1位

    and  r7,r7,#0xff

    cmp  r9,#0x80  ;移位后State[k,j]最高位是否为1

    blt littlethan  ;如不为1,转向实行

    eor  r7,r7,#0xlb  ;如为1,则State[k,j]与#0xlb异或littlethan

    cmp  r6,#0  ;CoefMix[i,k]与0比较

    bgt loop_temp  ;如大于0,转到标号loop_temp处实行,不然读取CoefMix[i,k+1]

    add r5,r5,#1

    cmp r5,#4

    blt loop_k  ;实行k循环

    add r4,r4,#1

    cmp r4,#4

    blt loop_j  ;实行j循环

    add r3,r3,#1

    cmp r3,#4

    blt loop_I  ;实行i循环

    mov r3,#0

    renew  ;用Temp更新State

    ldrb r4,[r2,r3]

    strb r4[r0,r3]

    add r3,r3,#1

    cmp r3,#16

    blt renew

    MixColumnend

    mov pc,lr  ;子步伐返回

3 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上的实现具有肯定的实用代价。经University of Califor-nia,San Diego在因特网上提供的测试步伐Interactive Ri-jndael Test Vectors in JavaScript验证,本实现算法是精确的。