1 引 言
AES算法是由美国国家标准和技术研究所(NIST)用时3年,历经2轮评估,选出的高级加密算法。AES的所有设计原则都是公开的,没有专利权方面的问题,任何人都可以通过正常渠道得到并使用这种算法。作为新一代的数据加密标准,AES汇聚了强安全性、高性能、高效率、易用和灵活等优点,加密速度快,对内存要求低,非常适合应用在嵌入式平台上。本文在分析AES加密算法原理的基础上,着重说明算法的实现步骤,用C语言完整地实现了AES算法的加/解密操作,并在PVR机顶盒中实现应用。
2 AES加密/解密算法原理简介
AES算法属于分组密码算法,它的输入分组、输出分组及加/解密的中间分组长度都是128 b。密钥长度有3种:128,192和256 b。
AES算法基于置换和代换运算。置换是对数据重新进行排列,代换是将一个数据单元替换为另一个。本文采用的AES-128算法输入为128位数据,密钥长度也是128位。每一轮都需要1个与输入分组具有相同长度的扩展密钥参与。
AES算法主要由3部分组成:轮变化、圈数和密钥扩展。本文详细介绍AES加/解密算法中各部分的实现步骤;结合C语言,实现高级加密算法AES在PVR数字电视机顶盒中的应用。所采用的AES-128算法的加/解密模块程序流程图如图1所示。
2.1 加密变换
AES加密算法的每一轮加密都使用代替和混叠并行地处理整个数据分组状态。主要是通过对5个子模块SubBytes,ShiftRows,MixColumns,AddRounke和GetNewEncrypt的循环调用实现。
Subbyte变换即s盒置换,是AES算法中是惟一的非线性变换。它对状态中的每个字节用S-box做一个置换。每个字节的前4位指定s盒的行值,后4位指定了S盒的列值,然后取出S盒中对应行和列的元素作为输出代替该字节。
ShiftRow完成基于行的循环移位操作。它将状态中的行按照不同的偏移量进行循环移位,一般情况下,第0行不动,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。
MixColumn对状态列进行混淆变换。将ShiftRow的变换结果看作GF(28)域上的多项式,乘以c(x)=03x3+01x2+01x+02,然后模上不可约多项式x8+x4+x3+x+1。本文根据GF(28)有限域的运算规则,将列变换改进为简单的移位和异或操作。设1个字节为(b7b6b5b4b3b2b1b0),则:
AddRounkey是将列混合后的结果与子密钥进行简单的按字节异或逻辑运算。
GetNewEncrypt生成下一轮变换所需密钥,它是按矩阵的列进行分组的,产生方法如下:如果第i列不是4的倍数,即(i%4==1),那么i列由如下等式确定:
W(i)=W(i-4)XORW(i-1)。
如果第i列是4的倍数,即(i%4==0),则i列由如下等式确定:
W(i)=W(i-+4)XOR T[W(i-1)]
其中T[W(i-1)]是w(i-1)的一种转换形式,设W(i-1)=[a,b,c,d]。实现方式如下:
将W(i-1)的元素左移一位,即[b,C,d,a]。将这4个字节输入到S盒,得到新的4个字节[e,f,g,h]。计算新一轮的常量r(i)=2(i-4)/4。生成转换后的列[e XOR r(i),f,g,h]。
第i轮的密钥生成列W(4i),W(4i+1),W(4i+2),W(4i+3),于是得到第i+1轮的密钥矩阵。
在计算轮常量时,当加密轮数大于或等于9时,8位不足以表示其值,此时将mod(x8+x4+x3+x+1),值为0x1b,之后的值就是0x1b得倍数。即r(i)大于等于256时,r(i)的值为0x1b*(turn-8)。
AddRounkey变换将MixColumn变换的结果和GetNewEncrypt变换的结果按对应字节异或,所得结果作为下一轮变换的输入。
上述的5个步骤完成了一轮AES加密变换,根据加密轮数重复上述过程,直到最后一轮变换。最后一轮变换的不同之处在于没有进行列混叠变换MixCol-umn,AddRounkey变换直接将ShiftRow变换后的结果和GetNewEncrypt变换的结果按对应字节异或,结果作为AES变换的输出,即得到密文。