沈 俊
[摘要]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.
作者简介:
沈俊,男,浙江省湖州人,同济大学硕士研究生,主要从事网络化测试平台通信安全的研究。