位置:51电子网 » 技术资料 » 通信网络

用AVR汇编语言实现AES及其优化

发布时间:2008/5/29 0:00:00 访问次数:447

引 言


  随着对称密码的发展,des数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年nist公开征集新的数据加密标准,即aes[1]。经过三轮的筛选,比利时joan daeman和vincent rijmen提交的rijndael算法被提议为aes的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对aes还有不同的看法,但总体来说,aes作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。aes设计有三个密钥长度:128,192,256位,相对而言,aes的128密钥比des的56密钥强1021倍[2]。aes算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合avr汇编语言,实现高级数据加密算法aes。

1 aes加密、解密算法原理和avr实现

  aes是分组密钥,算法输入128位数据,密钥长度也是128位。用nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥expandedkey(i)的参与。由于外部输入的加密密钥k长度有限,所以在算法中要用一个密钥扩展程序(keyexpansion)把外部密钥k扩展成更长的比特串,以生成各轮的加密和解密密钥。 1.1圈变化
aes每一个圈变换由以下三个层组成:
非线性层——进行subbyte变换;
线行混合层——进行shiftrow和mixcolumn运算;
密钥加层——进行addroundkey运算。

① subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的s盒进行映射。
schange:
ldi zh,$01;将指针指向s盒的首地址
mov zl,r2;将要查找的数据作为指针低地址
ldtemp,z+;取出这个对应的数据
mov r2,temp;交换数据完成查表
.
.
.
ret

② shiftrow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据nb的不同而选择的[3]。
shiftrow:;这是一个字节换位的子程序
mov temp,r3;因为是4×4
mov r3,r7; r2 r6 r10 r14 r2 r6 r10 r14
mov r7,r11; r3 r7 r11 r15---r7 r11 r15 r3
mov r11,r15; r4 r8 r12 r17 r12 r17 r4 r8
mov r15,temp; r5 r9 r13 r18 r18 r5 r9 r13
mov temp,r4
mov temp1,r8
mov r4,r12
mov r8,r17
mov r12,temp
mov r17,temp1
mov temp,r18
mov r18,r13
mov r13,r9
mov r9,r5
mov r5,temp
ret

③ 在mixcolumn变换中,把状态中的每一列看作gf(28)上的多项式a(x)与固定多项式c(x)相乘的结果。b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即
b(x)=c(x)·a(x)(mod x4+1)
对于这个运算
b0=02。a0+03。a1+a2+a3
令xtime(a0)=02。a0
其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。
mov temp,a0;这是一个mixcolimn子程序
rcall xtime;调用xtime程序
mov a0,temp
mov temp,a1
rcall xtime
eor a0,a1
eor a0,temp
eor a0,a2
eor a0,a3;完成b(x)的计算
.
.
.
xtime:;这是一个子程序
ldi temp1,$1b
lsl temp
brcs next1;如果最高位是1,则转移
next: ret;否则什么也不变化
next1:eor temp,temp1
rjmp next

对于逆变化,其矩阵c要改变成相应的d,即b(x)=d(x)*a(x)。

④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。

⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。

1.2轮变化

  对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。

1.3密钥扩展
  aes算法利用外部输入密钥k(密钥串的字数为nk),通过密钥的扩展程序得到共计4(nr+1)字的扩展密钥。它涉及如下三个模块:

① 位置变换(rotword)——把一个4字节的序列[a,b,c,d]变化成[b,c,d,a];

② s盒变换(subword)——对一个4字节进行s盒代替;

③ 变换rcon[i]——rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如
rcon[1]=[01000000];rcon[2]=[02000000];rcon[3]=[04000000]……

  扩展密钥的生成:扩展密钥的前nk个字就是外部密钥k;以后的字w[[i]]等于它前一个字w[[i-1]]与前第nk个字w[[i-nk]]的“异或”,即w[[i]]=w[[i-1]]w[[i- nk]]。但是若i为nk的倍数,则w[i]=w[i-nk]subword(rotword(w[[i-1]]))rcon[i/nk]。

  程序执行的时候,主要调用以上几个子程序,具体实现如下:
keyexpansion:
rcall rotwoed
rcall subword
rcall rcon
.
.
.
aes的加密与解密流程如图1所示。

2 aes加密、解密算法的优化

  由以上算法的流程中可以清楚地看到,整个算法中程序耗时最多的就是圈变化部分,因此对于算法的优化也就在此;而圈变化部分可以优化的也就是列

引 言


  随着对称密码的发展,des数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年nist公开征集新的数据加密标准,即aes[1]。经过三轮的筛选,比利时joan daeman和vincent rijmen提交的rijndael算法被提议为aes的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对aes还有不同的看法,但总体来说,aes作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。aes设计有三个密钥长度:128,192,256位,相对而言,aes的128密钥比des的56密钥强1021倍[2]。aes算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合avr汇编语言,实现高级数据加密算法aes。

1 aes加密、解密算法原理和avr实现

  aes是分组密钥,算法输入128位数据,密钥长度也是128位。用nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥expandedkey(i)的参与。由于外部输入的加密密钥k长度有限,所以在算法中要用一个密钥扩展程序(keyexpansion)把外部密钥k扩展成更长的比特串,以生成各轮的加密和解密密钥。 1.1圈变化
aes每一个圈变换由以下三个层组成:
非线性层——进行subbyte变换;
线行混合层——进行shiftrow和mixcolumn运算;
密钥加层——进行addroundkey运算。

① subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的s盒进行映射。
schange:
ldi zh,$01;将指针指向s盒的首地址
mov zl,r2;将要查找的数据作为指针低地址
ldtemp,z+;取出这个对应的数据
mov r2,temp;交换数据完成查表
.
.
.
ret

② shiftrow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据nb的不同而选择的[3]。
shiftrow:;这是一个字节换位的子程序
mov temp,r3;因为是4×4
mov r3,r7; r2 r6 r10 r14 r2 r6 r10 r14
mov r7,r11; r3 r7 r11 r15---r7 r11 r15 r3
mov r11,r15; r4 r8 r12 r17 r12 r17 r4 r8
mov r15,temp; r5 r9 r13 r18 r18 r5 r9 r13
mov temp,r4
mov temp1,r8
mov r4,r12
mov r8,r17
mov r12,temp
mov r17,temp1
mov temp,r18
mov r18,r13
mov r13,r9
mov r9,r5
mov r5,temp
ret

③ 在mixcolumn变换中,把状态中的每一列看作gf(28)上的多项式a(x)与固定多项式c(x)相乘的结果。b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即
b(x)=c(x)·a(x)(mod x4+1)
对于这个运算
b0=02。a0+03。a1+a2+a3
令xtime(a0)=02。a0
其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。
mov temp,a0;这是一个mixcolimn子程序
rcall xtime;调用xtime程序
mov a0,temp
mov temp,a1
rcall xtime
eor a0,a1
eor a0,temp
eor a0,a2
eor a0,a3;完成b(x)的计算
.
.
.
xtime:;这是一个子程序
ldi temp1,$1b
lsl temp
brcs next1;如果最高位是1,则转移
next: ret;否则什么也不变化
next1:eor temp,temp1
rjmp next

对于逆变化,其矩阵c要改变成相应的d,即b(x)=d(x)*a(x)。

④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。

⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。

1.2轮变化

  对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。

1.3密钥扩展
  aes算法利用外部输入密钥k(密钥串的字数为nk),通过密钥的扩展程序得到共计4(nr+1)字的扩展密钥。它涉及如下三个模块:

① 位置变换(rotword)——把一个4字节的序列[a,b,c,d]变化成[b,c,d,a];

② s盒变换(subword)——对一个4字节进行s盒代替;

③ 变换rcon[i]——rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如
rcon[1]=[01000000];rcon[2]=[02000000];rcon[3]=[04000000]……

  扩展密钥的生成:扩展密钥的前nk个字就是外部密钥k;以后的字w[[i]]等于它前一个字w[[i-1]]与前第nk个字w[[i-nk]]的“异或”,即w[[i]]=w[[i-1]]w[[i- nk]]。但是若i为nk的倍数,则w[i]=w[i-nk]subword(rotword(w[[i-1]]))rcon[i/nk]。

  程序执行的时候,主要调用以上几个子程序,具体实现如下:
keyexpansion:
rcall rotwoed
rcall subword
rcall rcon
.
.
.
aes的加密与解密流程如图1所示。

2 aes加密、解密算法的优化

  由以上算法的流程中可以清楚地看到,整个算法中程序耗时最多的就是圈变化部分,因此对于算法的优化也就在此;而圈变化部分可以优化的也就是列

相关IC型号

热门点击

 

推荐技术资料

耳机的焊接
    整机电路简单,用洞洞板搭线比较方便。EM8621实际采... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!