当前位置:文档之家› AES加密算法的实现及应用

AES加密算法的实现及应用

现代经济信息前言: AES加密算法作为DES加密算法的替代品,具有安全、高效以及在不同硬件和软件[6]运行环境下表现出的始终如一的良好性能,因此该算法具有较高的开发潜力和良好的实用价值。

本研究主要包括AES加密算法的改进,C语言实现,以及完成对数据流的加密和解密过程,同时对AES加密算法的应用进行了简单介绍。

一、AES加密算法的改进及实现(1)AES加密算法的流程图在图1.1中,Round代表加密的轮数,即程序循环次数。

State代表状态矩阵,一个存储原始数据的数组。

RoundKey代表经过扩展运算后的密钥数组。

ByteSub()代表置换函数,对状态矩阵State中的数据进行置换。

ShiftRow()代表移位函数,对状态矩阵State中的数据进行移位运算。

MixColumn()代表列混合运算函数,对状态矩阵State中的数据进行列混合运算。

AddRoundKey()代表异或运送函数,对数组State和数组RoundKey进行异或运算。

由上图可以看出,最后一次轮变换比前几次轮变换少执行一次MixColumn()函数。

(2)A E S解密算法的流程图在图1.2中,Round代表加密的轮数,即程序循环次数。

State代表状态矩阵,一个存储原始数据的数组。

RoundKey代表经过扩展运算后的密钥数组。

InvByteSub()代表置换函数,对状态矩阵State中的数据进行置换。

InvShiftRow()代表移位函数,对状态矩阵State中的数据进行移位运算。

InvMixColumn()代表列混合运算函数,对状态矩阵State中的数据进行列混合运算。

由上图可以看出,最后一次轮变换比前几次轮变换少执行一次MixColumn()函数。

二、AES加密算法复杂度分析下面对改进前的算法和改进后的算法进行复杂度分析[8]以及程序执行效率的分析。

设b为0x00—0xff中的任意常数,以0x09*b为例进行讨论。

该算式分解如下:0x09*b=(0x08+1)*b=0x08*b+b=(0x06+0x02)*b+b=0x06*b+0x02*b+b=(0x04+0x02)*b+0x02*b+b=0x04*b+0x02*b+0x02*b+b=(0x02+0x02)*b+0x02*b+0x02*b+b=0x02*b+0x02*b+0x02*b+0x02*b +b将上述算式进行C语言实现得到以下程序:(1)程序1int i,t;t=b;t=t<<2;for(i=0;i<3;i++){t=t^t;}t=t^b;由此可见,该程序的时间复杂度为O(n)。

将上述程序做一改进可得到如下程序:(2)程序2int i,t;t=b;t=t<<2;t=t^t;t=t^t;t=t^t;t=t^t;t=t^b;由此可见,该程序的时间复杂度为O(1)。

若通过表格法对公式进行编成,可以得到如下程序:(3)程序3int t;t=Tab0e[0x0e][b];由此可见,该程序的时间复杂度为O(1)。

通过上述程序可以发现,程序2与程序3的时间复杂度相同。

但这只能说明两程序的时间效率相似,并不一定相同,具体判断还要看程序的规模。

虽然程序之间的规模只有几行代码的差距,但如果将这些程序放在循环体中执行,程序之间在时间上的执行效率就会表现出较大的差距,循环次数越多,循环层数越多,效率差距就越明显。

AES加密算法本身是一种非常适用于硬件加密的算法,因此当该算法应用于硬件编程时,就更要把算法的时间效率考虑在内,否则很可能由于算法执行时间过长,导致尚未加密的数据被新加入的数据冲掉,造成数据的遗失,如此一来也就失去了数据加密的意义。

这也是为什么要对算法的程序实现进行效率考察的主要原因。

AES加密算法的实现及应用赵雪梅 盐城工学院,江苏 盐城 224003图1.1 AES加密算法流程图图1.2 AES解密算法流程图学术探讨三、AES加密算法的C语言实现AES加密算法主要分为三大块[9],即密钥扩展,数据加密和数据解密。

(一)密钥扩展(1)使用Rotword()函数对数组中的数字实现循环左移一位的运算,即将数组中左端第一个数字移至数组的末端,而原来在它之后的数字依次前移一位。

要说明的是,由于数组中的4个数字已经合并为一个数字,因此在程序的实际执行过程中并不是做数组的循环左移运算,而是进行数字的循环移位运算,这样一来便大大简化了运算过程,对运算效率有一定程度的提高。

(2)使用SubWord()函数依据S置换表对4个数字进行置换,规则如下。

例如,有一个数字为0x2a,则在表1•1中查找‘2’行‘a’列的数字,得到数字e5,则该数字即是数字0x2a 的置换数字。

此函数的C 语言实现相对简单,只是一个查表的问题,但过程比较繁琐细碎,编成时应仔细对待,避免出错。

(二)数据加密(1)使用SubByte()函数依据S置换表对状态矩阵State[4][4]中的数字进行置换,查表的方法在前文已经介绍,这里不再赘述。

有一点需要注意的是,虽然SubByte()函数与SubWord()函数原理相同,但在程序中的运算过程却不尽相同。

SubByte()函数是提取状态矩阵State[4][4]中的每一个数组元素进行置换运算,而SubWord()则是提取一个unsigned long 整型数字中的某8位数据进行置换运算。

SubByte()函数的C语言实现与SubWord()的C语言实现雷同,这里也不再赘述。

(2)使用ShiftRow()函数对状态矩阵State[4][4] 中的各行数据进行循环移位运算。

该函数所进行的循环移位规则如下。

状态矩阵State[4][4] 中的第一行数据位置不变,第二行数据循环左移一位数字,第三行数据循环左移两位数字,第四行数据循环左移三位数字。

在对ShiftRow()函数进行C语言编程时主要是要注意行数以及所对应的移位个数,保证运算的准确性。

加密时,不仅要多次调用上述三个函数,同时还要结合密钥扩展所得的数据对文件进行加密。

加密过程简要如下:(1)第0轮加密本轮加密是将状态矩阵State[4][4]中的16字节数字与密钥扩展数组中的w[0]至w[3]这16字节数字进行异或运算,得到16字节新的数字,这些数字存放于状态矩阵State[4][4]中,取代原来的数据。

(2)第1至9轮加密为说明方便,在这里设轮数为k,显然k的值是从1至9的。

程序执行当中,首先对状态矩阵State[4][4] 使用SubByte()函数,将矩阵中的数字进行置换。

再次,对置换后的状态矩阵使用ShiftRow()函数,将矩阵中相应行中的数字进行移位。

再次,对移位后的状态矩阵使用MixColumns()函数,利用上述的列混合运算公式对状态矩阵中的数字进行运算,得到一个新的状态矩阵。

最后,将经过列混合运算之后的状态矩阵与密钥扩展数组中w[4k]至w[4k+4] 的数字进行异或运算,将所得结果存入状态矩阵中,至此一轮加密完成。

(3)第10轮加密第10轮加密的不同之处在于,该轮加密不进行列混合运算,即不调用MixColumns()函数,其他部分与第1至9轮加密相同。

经过第0至10轮加密后所得到的状态矩阵State[4][4]便是实验所需要的密文。

(三)数据解密(1)使用InvSubByte()函数依据S置换表的逆表对状态矩阵State[4][4]中的数字进行置换,置换方法与SubByte()函数相同。

该函数的C语言实现与SubByte()函数基本相同,在此不再赘述。

(2)使用InvShiftRow()函数对状态矩阵State[4][4] 中的各行数据进行循环移位运算。

该函数所进行的循环移位规则如下。

状态矩阵State[4][4] 中的第一行数据位置不变,第二行数据循环右移一位数字,第三行数据循环右移两位数字,第四行数据循环右移三位数字。

该函数的C语言实现与ShiftRow()函数基本相同,在此不再赘述。

下面对解密过程进行简要介绍。

(1)第0轮解密与第0轮加密类似,第0轮解密也不是一轮完整的解密。

InvSubByte()函数,InvShiftRow()函数和InvMixColumns()函数均未参与到该轮运算中来。

在这里设轮数为k。

本轮解密是将状态矩阵State[4][4]中的16字节数字与密钥扩展数组中的w[44-k]至w[44-4k]这16字节数字进行异或运算,得到16字节新的数字,这些数字存放于状态矩阵State[4][4]中,取代原来的数据。

(2)第1至9轮解密这9轮解密过程相同,因此在用C语言实现时可写入循环之中运行。

程序执行当中,首先对状态矩阵State[4][4] 使用InvSubByte()函数,将矩阵中的数字进行置换。

再次,对置换后的状态矩阵使用InvShiftRow()函数,将矩阵中相应行中的数字进行移位。

再次,将移位后的状态矩阵与密钥扩展数组中w[44-k]至w[44-4k]的数字进行异或运算。

最后,对经过异或运算后的状态矩阵使用InvMixColumns()函数,对矩阵中的数字进行列混合运算,至此一轮加密完成。

(3)第10轮解密该轮解密与第1至9轮解密相比少了一步对InvMixColumns()函数的调用,即不进行列混合运算,其他部分与第1至9轮解密相同。

经过第0至10轮解密后所得到的状态矩阵State[4][4]便是刚开始所输入的原文。

四、AES加密算法的应用当一组数据向闪存盘内写入时,对数据流进行实时加密,即输入闪存盘内的数据以加密的形式存储于盘内;当对盘中的数据进行读取时,通过加密算法对输出的密文进行实时解密,即输出的数据为解密后的原文。

计算机中所有类型的文件都是以01数字的形式进行存储的,文件的输入和输出过程实际上就是数据流的输入与输出,只要实现了数据流的加密,便可以实现对任意形式文件的加密。

因此,通过AES加密算法完成数据流的加密和解密具有实际的应用价值和意义。

结论:通过对AES加密算法的分析找到对算法进行改进的方法,并将此方法应用于程序的编写当中,提高了程序的执行效率。

同时课题研究使用C语言完成了AES加密算法的程序实现。

参考文献:[1]张洁,朱丽娟. DES 加密算法分析与实现[J].软件导刊,2007,3.[2]罗祖玲. 基于DES 算法的数据库加密[J].2007,装备制造技术,6.[3]吴文玲,冯登国,卿斯汉. 简评美国公布的15个AES 候选算法[J].软件学报,1999,19.[4]何明星,范平志. 新一代私钥加密标准AES 进展与评述[J].计算机应用研究,2001,18.作者简介:赵雪梅 (1975-),女,讲师,主要从事计算机软件开发与教学工作,现任职于盐城工学院。

相关主题