现代经济信息
前言: AES加密算法作为DES加密算法的替代品,具有安全、高
效以及在不同硬件和软件[6]运行环境下表现出的始终如一的良好性
能,因此该算法具有较高的开发潜力和良好的实用价值。本研究主要
包括AES加密算法的改进,C语言实现,以及完成对数据流的加密和
解密过程,同时对AES加密算法的应用进行了简单介绍。
一、AES加密算法的改进及实现
(1)AES加密算法的流程图
在图1.1中,Round代表加密的轮数,即程序循环次数。State代
c语言round函数怎么使用表状态矩阵,一个存储原始数
据的数组。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)程序1
int i,t;
t=b;
t=t<<2;
for(i=0;i<3;i++){
t=t^t;
}
t=t^b;
由此可见,该程序的
时间复杂度为O(n)。将上
述程序做一改进可得到如
下程序:
(2)程序2
int 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)程序3
int 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-),女,讲师,主要从事计算机软件开发与教学工作,现任职于盐城工学院。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论