APP下载

AES加密算法的FPGA优化实现

2014-12-31彭景斌谭敏生

电脑知识与技术 2014年35期

彭景斌 谭敏生

摘要:详细阐述了AES算法的硬件语言实现过程,并提出了一种优化方法,在对AES算法优化的实现过程中,将密钥扩展模块与轮加模块合并实现,并结合SDK平台的控制来完成加密算法,最后,进行了FPGA硬件实现与资源利用对比实验,验证了算法的正确性和优越性。

关键词: AES算法; FPGA实现;SDK

中图分类号: TP309.7 文献标识码:A 文章编号:1009-3044(2014)35-8434-03

FPGA Optimal Implementation of AES

PENG Jing-bin 1,TAN Min-sheng 1

(1.Schoole of Computer Science and Technology, Nanhua University, Hengyang 421002;2.The central Blood Station of Hengyang, Hengyang 421002,China)

Abstract: The process of AES algorithm was described in detail with hardware description language, and a kind of optimal method was proposed. During the implemental process of AES algorithm, merging the KeyExpansion module and the AddRoundKey module,and combining with the control of the SDK platform to complete the encryption algorithm; finally, the implementation and superiority was verified, the resource was contrasted by FPGA.

Key words: Advanced Encryption Standard Algorithm; FPGA Implementation; SDK

通常某一个加密算法公布开始,研究人员对其的研究工作按时间划分可大致分为三个阶段[1]:

第一阶段主要是对各个算法的性能测试和分析;

第二阶段主要是对算法的应用模式设计和研究;

第三阶段主要是对算法的应用场合和实现平台以及算法安全性进行研究。

AES(Advanced Encryption Standard)于2001年提出,用于取代早期DES加密算法,并逐渐成为对称密码算法中最流行的一种[2]。目前国内外对于AES算法的研究主要集中在算法的分析和实现两个领域,特别是对于算法的实现方式的研究比较多。

本文正是从硬件实现的角度出发,基于对AES算法中各子模块的硬件实现及优化,从而最终实现硬件资源利用最优化的问题展开研究,并作详细的阐述。

1 AES算法简介

AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。

AES 是一个新的可以用于保护电子数据的加密算法。AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换。

本文设计实现的密钥长度为128比特。AES加密有很多轮的重复和变换,大致步骤如下:

1)密钥扩展(KeyExpansion);

2)初始轮(Initial Round),加密原文与密钥直接异或加;

3)重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey;

4)最终轮(Final Round),最终轮没有MixColumns。

2 AES算法具体实现

从AES算法的实现步骤可知,主要是四个模块的实现:字节替换(SubBytes),行移位(ShiftRows),列混合(MixColumns),密钥扩展(KeyExpansion)。该文分别采用两种不同的方法来实现AES加密,一种按照算法本身的定义进行硬件实现,另一种方法是在算法硬件实现的基础上将密钥扩展与轮加(AddRoundKey)两个部分合并,并通过在SDK平台下对模块进行控制,来完成加密。下面分别介绍两种方法中主要模块的具体实现。

1) 字节替换(SubBytes)

字节替换是作用在状态中每个字节上的一种非线性字节转换,通过从AES算法给定的S-Box(16行16列的矩阵)中进行映射。如输入矩阵的任一元素A=00000000时,将其看作一个8位的二进制数,前四位X=0,后四位Y=0,从给定的S-Box中找出S[A]=S[X,Y]=S[0,0]的值进行替换。如:S[00000000]=S[X,Y]=S[0,0]= 01100011。

sbox module具体实现:

always@(state)

case(state)

8'h00:dout=8'h63;

8'h01:dout=8'h7c;

8'hfe:dout=8'hbb;

8'hff:dout=8'h16;

endcase

2)行移位(ShiftRows)

ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据加密块长Nb的不同而选择的。偏移量大小与加密块长Nb的关系[3]如表1所示。

表1 偏移量大小与Nb的关系

[Nb\&C1\&C2\&C3\&4\&1\&2\&3\&6\&1\&2\&3\&8\&1\&3\&3\&]

shift module具体实现:

sbox u0 (.state (aesin[1:8] ), .dout (aa[1:8]));

sbox uf (.state (aesin[121:128]),.dout(aa[121:128]));

assign { bb[1:8],bb[33:40],bb[65:72],bb[97:104]}={ aa[1:8],aa[33:40],aa[65:72],aa[97:104]};

assign { bb[25:32],bb[57:64],bb[89:96],bb[121:128]}={ aa[121:128],aa[25:32],aa[57:64],aa[89:96]};

3) 列混合(MixColumns)

在列混合变换中,给定一个状态,逐列进行变换。它将状态矩阵中的每个列视为系数在[GF(28)]上的一个次数小于4的多项式。并与一固定的多项式c(x)进行模x4+1相乘。其中c(x)为模x4+1可逆的多项式(系数为16进制):

[c(x)={03}x3+{01}x2+{01}x+{02}]

列混合运算可以表示为[GF(28)]上的可逆线性变换,即:

S0i={02}S0i⊕{03}S1i⊕S2i⊕S3i

S1i=S0i⊕{02}S1i⊕{03}S2i⊕S3i

S2i=S0i⊕S1i⊕{02}S2i⊕{03}S3i

S3i={03}S0i⊕S1i⊕S2i⊕{02}S3i

mix module具体实现:

assign

out[1:8]=((bb[1]==1)?(bb[1:8]<<1)^8'h1b:(bb[1:8]<<1))^((bb[9]==1)?(bb[9:16]<<1)^bb[9:16]^8'h1b:(bb[9:16]<<1)^bb[9:16])^bb[17:24]^bb[25:32];

assign

out[33:40]=((bb[33]==1)?(bb[33:40]<<1)^8'h1b:(bb[33:40]<<1))^((bb[41]==1)?(bb[41:48]<<1)^bb[41:48]^8'h1b:(bb[41:48]<<1)^bb[41:48])^bb[49:56]^bb[57:64];

assign out[89:96]=((bb[65]==1)?(bb[65:72]<<1)^bb[65:72]^8'h1b:(bb[65:72]<<1)^bb[65:72])^bb[73:80]^bb[81:88]^((bb[89]==1)?(bb[89:96]<<1)^8'h1b:(bb[89:96]<<1));

assign out[121:128]=((bb[97]==1)?(bb[97:104]<<1)^bb[97:104]^8'h1b:(bb[97:104]<<1)^bb[97:104])^bb[105:112]^bb[113:120]^((bb[121]==1)?(bb[121:128]<<1)^8'h1b:(bb[121:128]<<1));

4) 密钥扩展(KeyExpansion)

在加密算法的十轮变换过程中,每轮变换结果都将与一轮新的密钥进行异或运算,该文称之为扩展密钥。扩展密钥是按矩阵的列进行分组的,每四列组成一轮扩展密钥进行轮变换。密钥扩展将在变换中产生十一轮扩展密钥,为方便下载到实验板验证,在实现时将这个过程与密钥轮加合并为aes顶层模块,再在SDK环境下实现对模块的循环调用完成整个加密。

Aes module 实现关键代码:

shift s(.aesin(temp), .bb(aa));

mix m(.bb(aa), .out(s_mix));//每轮加密的结果

Assign ekey={{key[1:32] ^sub^rcon},{key[1:32]^key[33:64]^sub^rcon},

{key[1:32]^key[65:96]^key[33:64]^sub^rcon},

{key[1:32]^key[97:128]^key[65:96]^key[33:64]^sub^rcon}};//扩展密钥

assign result=s_mix^ekey;//密钥加

3 基于EDK的FPGA实现平台及验证

嵌入式开发套件(EDK)是用于设计嵌入式可编程系统的全面解决方案。该套件包括嵌入式软件工具(Platform Studio)以及嵌入式IBM PowerPC硬件处理器核和/或Xilinx MicroBlaze软处理器核进行Xilinx平台FPGA设计时所需的技术文档和IP。EDK自带了许多工具和IP,可以用来设计完整的嵌入式处理器系统,主要包括Xilinx 平台工作室XPS和软件开发套件SDK。

本设计选用的FPGA器件是XILINX VIRTEX 5 XC5VLX50T ,首先,完成AES加密算法的硬件描述;然后利用Modelsim仿真,验证通过;最后,在EDK 13.2平台下完成硬件平台的搭建和下载,并通过SDK13.2验证其正确性。

实验中用于加密验证的数据如下:

原文(state):3243f6a8 885a308d 313198a2 e0370734

密钥(key): 2b7e1516 28aed2a6 abf71588 09cf4f3c

密文(result):3925841d 2dc09fb dc118597 196a0b32

利用Modelsim 仿真的结果如图1所示:

通过添加自定义IP核,并下载至FPGA运行,在超级终端显示的输出结果如图2所示,由图中数据,可得出代码描述与实现结果正确。

为了验证本文采用的AES实现方法在资源利用方面的情况,实验中采用两种方式完成对AES的下载,一种是按照算法各模块原有的调用顺序,另一种是按照本文所使用的优化方法,两种方式的主要逻辑资源消耗情况对比,如图3所示。由图中数据比较可知,第二种方式实现所需的资源数更少,与同类加密算法实现所需的资源数对比有一定的优势,进一步验证了本文提出的AES密码算法优化的优越性,更能有效满足较小芯片面积的应用需求。

4 总结

随着时代与技术的进步,在信息安全领域也同样需要有相应的改进,以满足用户的需求。目前,软件和硬件同时作为实现AES的有效手段而在不同的领域中存在,但以前可以采用软件实现的加密技术,如今已远远不能满足要求,硬件实现方案则表现出巨大的优势。因此本文设计的基于FPGA实现的AES加密算法正是顺应当前信息产业发展的需要。

未来的工作将在已有工作基础上继续针对于低功耗和抗攻击两个方面进行,从而使AES密码算法在小型芯片上的使用能够达到国际标准要求的抗攻击安全性。

参考文献:

[1] 黄卡尔.AES加密算法的FPGA实现[M].太原:中北大学, 2011.

[2] Daemen J, Rijmen V. 高级加密标准(AES)算法—Rijndael的设计[M].谷大武, 徐胜波, 译. 北京: 清华大学出版社, 2003.

[3] 曹进才. 基于FPGA的AES算法快速小面积实现[D].天津:天津大学, 2008.