基于AES加密算法的消息系统设计

2009-02-11 10:02
新媒体研究 2009年1期
关键词:网络安全

沈 俊

[摘要]AES是一种对称分组密码算法,它是广泛应用的新标准。首先介绍AES加密算法的基本操作和流程。随后讨论AES加密算法的实现。最后,阐述一个基于AES加密算法的消息系统的设计方案。

[关键词]AES加密 消息系统 网络安全

中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2009)0110052-02

一、引言

美国国家标准技术协会(NIST)在2001年发布了高级加密标准(AES)。AES是一种对称分组密码算法,用以取代DES的商业应用,从而成为广泛使用的新标准。其分组长度为128位,密钥长度为128位,192位或256位,其中128位的密钥长度最常用。以下各节介绍了一个基于AES加密算法的消息系统的设计。

二、AES加密算法简介

AES加密算法1、2中128位密钥是最常用的,故以128位密钥为例介绍。AES加密算法有四种基本的操作:

1.字节代换:用一个S盒完成分组中的按字节代换。

2.行移位:一个简单的基于行的置换。

3.列混淆:一个利用在域GF(28)上算术特性的代换。

4.轮密钥加:用当前分组和扩展密钥的一部分进行按位异或。

AES加密、解密算法的流程如图1所示:

图1中,输入的密钥将被扩展成由44个32位字组成的数组W[i],在每轮加解密过程中有四个字(128位)的密钥。

AES加密算法的详细内容请参考文献[1]。

三、AES加密算法实现

AES加密算法中,S盒的初始化和列混淆变换都要用到有限域GF(28)上的运算乘法和加法。因此先阐述有限域GF(28)上运算的实现,再介绍AES加密算法的实现。

(一)有限域GF(28)上运算实现

一个专门的GF2NOP_1B类被用来进行一字节(8位)的加法、乘法和循环左右移位运算,类的主要方法在AES加密算法中会被调用。

1.加法

GF(28)上的加法实际上就是按位异或运算。代码如下:

GF2NOP_1B GF2NOP_1B::operator+(ubyte ubV)//typedef unsigned

char ubyte;

{

GF2NOP_1B gfR;

gfR = this->ubValue ^ ubV; //XOR

return gfR;

}

2.乘法

乘法要稍微复杂一些,不能只用简单的异或运算。但是可以使用一种合理而容易实现的技巧,原理请见参考文献[2],这里只给出实现:

GF2NOP_1B GF2NOP_1B::operator * (ubyte ubV)

{

GF2NOP_1B gfR = 0;

ubyte ubMulN = ubV;

ubyte ubMN = (ubyte)iMODNUM_8; //iMODNUM_8 = 00011011b

ubyte ubTmp;

int i;

for (i = 0; ubMulN; ubMulN >>= 1, i++) {

if (i == 0)

ubTmp = this->ubValue;

else {

if (ubTmp &0x80) {

ubTmp <<= 1;

ubTmp ^= ubMN;

}

else

ubTmp <<= 1;

}

if (ubMulN & 1) {

gfR = gfR + ubTmp;

}

}

return gfR;

}

代码中还有一个类GF2NOP_4B是实现有限域GF(28)上4字节的运算,使得AES算法在32位机上用32位字操作会更紧凑更高效。

(二)AES加解密算法及实现

一个AESCrypt类被用来实现AES加解密,其主要方法有:密钥扩展、轮密钥加、字节代换、行移位、列混淆。其中,字节代换是用查表法实现的,列混淆是矩阵的乘法实现的,其它几个方法也比较容易实现。

图1所示AES加密算法和解密算法不同,采取两处改进[2]可以使解密算法的结构和加密算法的结构一致。分别是,在解密轮中,交换逆向行移位和逆向字节代换,交换轮密钥加和逆向列混淆。

逆向行移位影响字节的顺序,但不更改字节的内容,也不依赖字节的内容来进行它的变换。逆向字节代换影响字节的内容,但不更改字节的顺序同时也不依赖字节的顺序来进行它的变换。因此,这两个操作可以交换。如对一个给定的State Si:

逆向行移位[逆向字节代换(Si)]=逆向字节代换[逆向行移位(Si)] (1)

类似的第二处改进也可以用一个算式表示,即对给定的State Si和给定的轮密钥wj:

InvMixColumns(Si^wj)= [InvMixColumns(Si)]^[InvMixColumns(wj)] (2)

其中“^”符号表示异或,上式的证明见文献[2]。至此,加、解密的轮函数已经统一起来了,轮函数的C++声明如下:

int AESCrypt::RoundFun(int iRound, int iEDFlag);

参数iRound是轮数,加密时是1到10,解密时是9到0;iEDFlag是加、解密标志,真值为解密。轮函数的UML[3]活动图如图2所示:

图2清楚地描绘了AES加、解密算法的轮函数,图中最后一个分支处当解密并且iRound!=0时有三步操作:ExpandKey[iRound]列逆混淆、轮密钥加、ExpandKey[iRound]列混淆。第一、二步与前面的States[iRound]列逆混淆完成了上述式(2)等号右边的运算,而第三步则是为了还原ExpandKey[iRo

und]。

四、消息系统的设计

这里设计的消息系统是C/S结构的,客户端通过服务器与另一个客户端联系。服务器端的主要功能是:接受管理客户端的连接请求,存储转发客户端的消息。其UML构件图如图3。

TCP/IP接口构件是对Socket API的封装,为上层构件提供接口;数据库接口构件是对数据库访问操作的封装,为上层构件提供接口。客户端连接请求到达时,经由AES加解密构件解密后由连接管理构件管理,并反馈以密钥生成构件随机生成的密钥;当有消息到达时,AES加解密构件对其解密后,由消息处理构件进行处理,由消息存档构件存入数据库,并由消息分发构件向连接管理构件查询目标地址后交由TCP/IP接口构件发送。

客户端程序比较简单,主要的流程如图4的UML活动图。

图4中请求连接时的请求数据是用默认密钥进行加密的,服务器响应后会返回新密钥,以后的会话都使用新密钥进

行。监听和等待发送是由两个线程同时执行的。这两个线程一般都是在等待睡眠中,所以CPU占用率很低。

五、结束语

以上由介绍AES加密算法开始阐述了一个基于AES加密算法的消息系统的设计。这里介绍的这个系统是一个初步的雏形,尚只在局域网内应用。此系统存在的缺陷是用默认的AES密钥加密来传输AES新密钥,很容易被黑客破解。为了使系统更安全,下一步的工作是将AES密钥用RSA算法加密后再传输。

参考文献:

[1]Deamen,j.and Rijmen,V.“Rijndael: The Advanced Encryption Standard.”Dr.Dobb's Journal, March 2001.

[2]孟庆树、王丽娜、傅建明等译,William Stallings.密码编码学与网络安全:原理与实践[M].第四版.北京:电子工业出版社,2006:66-125.

[3]李洋、郑龑等译,Larman,C.UML和模式应用[M].第三版.北京:机械工业出版社,2006.

作者简介:

沈俊,男,浙江省湖州人,同济大学硕士研究生,主要从事网络化测试平台通信安全的研究。

猜你喜欢
网络安全
邯郸市档案馆积极开展网络安全宣传教育
85.4%受访未成年人接受过网络安全教育
全国多地联动2020年国家网络安全宣传周启动
新量子通信线路保障网络安全
提升网络安全增进民生幸福
山西平鲁联社积极开展网络安全知识宣传活动
全省教育行业网络安全培训班在武汉举办
保护个人信息安全,还看新法
国家网络安全人才与创新基地落户武汉
安全知识网络竞赛进校园