基于FPGA的AES算法芯片设计实现
扫描二维码
随时随地手机看文章
引言
密码模块作为安全保密系统的重要组成部分,其核心任务就是加密数据。分组密码算法AES以其高效率、低开销、实现简单等特点目前被广泛应用于密码模块的研制中。密码模块一般被设计成外接在主机串口或并口的一个硬件设备或是一块插卡,具有速度快,低时延的特点。而从整体发展趋势来看,嵌入式密码模块由于灵活,适用于多种用户终端、通信设备和武器平台,将会得到更加广泛的应用。基于FPGA实现的嵌入式密码模块与以往的主流硬件实现方式(如DSP芯片、单片机)相比,具有低成本、高速度、微功耗、微小封装以及保密性强等优点,与ASIC相比具有设计灵活、成本低、周期短等优点。另一个明显的优点在于:在对时间代价和空间代价的取舍上,基于FPGA实现的加密技术提供了多种实现方案,分别对时间代价和空间代价有不同的偏重,有利于在各种应用环境中进行优化。硬件实现无论是ASIC方案还是FPGA方案,数据处理速度的提高都离不开优化技术,包括算法轮函数和设计结构的优化。AES算法的快速实现方案包括:优化 S盒的结构(如使用复合域、查表等方法),列混合与密钥加的结合,以及采用流水线技术等。表1为几种典型的AES算法实现性能对比情况。
AES算法结构
AES是一个迭代型的分组密码,包含了轮变换对状态的重复作用。用State表示待加密状态,CipherKey表示初始加密密钥,ExpandedKey表示扩展密钥,其加密过程描述如下:
Round(State,ExpandedKey) --轮变换
{
SubByte(State); --字节代替
表1几种典型的AES算法实现性能对比
ShiftRow(State); --行移位
MixColumn(State); --列混合
AddRoundKey(State,ExpandedKey[i]); --密钥加
}
AES(State,CipherKey)--主函数
{
KeyExpansion(CipherKey,ExpandedKey); --密钥扩展
AddRoundKey(State,ExpandedKey[0]); --模加轮密钥
For(i=1;i FinalRound(State,ExpandedKey[Nr]); --末轮运算
}
在AES的单轮运算中包含了SubByte(字节代替)、ShiftRow(行移位)、MixColumn(列混合)、AddRoundKey(密钥加)四个步骤。图1所示为单轮运算的加/脱密结构。
图1 单轮运算的加/脱密结构
AES算法芯片IP核的完整结构包括:接口模块,密钥扩展模块,控制模块,加/脱密模块。各模块之间的统一调度、协调配合是芯片性能的保证。然而制约芯片吞吐率的瓶颈是加/脱密模块的实现。本文在第三部分着重分析了加/脱密模块实现方案。[!--empirenews.page--]
加/脱密模块实现方案
对于分组密码芯片加/脱密模块的实现,有迭代结构、轮展开结构和并行流水线结构等方法。迭代结构需要n(n为加/脱密轮数)个时钟周期完成一个分组的加/ 脱密操作。这种结构占用面积最小,速度较慢。而轮展开结构能够有效提高加/脱密速率,却需要大量占用存储单元和布线资源,因而面积最大。在设计芯片时,我们需要采用一种速度和面积的有效折衷方案,使得在满足速率要求的前提下尽可能减少资源占用。并行流水线结构就是这样一种方案。
流水线技术其实质就是在适当的地方加入寄存器,将前面的运算结果或输入数据暂存,并在下一个时钟到来时将寄存值作为后一级运算的输入。
流水线处理如同生产装配线那样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。AES分组密码在非反馈模式下,后续块的加密与前块的加密结果无关,即所有块的加密可并发执行,因而采用流水结构能显著提高性能。
流水线的引入可以采用轮内流水线结构或者轮间流水线结构来实现。轮内流水线结构把在一个时钟周期内欲完成的运算划分为若干子运算(模加运算、查表和各级移位相加运算),采用寄存输出模式,这种方式既可缩短延时路径,提高时钟频率,又可使各子运算同时进行。这样一来虽然速度有可能提高,但是增加了控制的复杂度同时占用大量的存储单元,这对于FPGA实现来说将是很大的负担,所以本设计采用轮间流水线结构来实现。图2为轮内流水线结构和轮间流水线结构对比。以 10轮运算为例,可以按轮数(3、3、3、1)拆分为4个流水段,即:第1-3轮为第1段,第4-6轮为第2段,第7-9轮为第3段,第10轮为第4段。为了使各流水段的时间片均衡,在第4段内部需要加入锁存器使输出与前3段匹配。用VHDL语言描述实现这个流水线式电路的代码如下:
Proc1:process(Data_in)begin
A<=Round1(Data_in);
Endprocess;
R1:processbegin
waituntilCLK'EventandCLK=‘1’;
A_REG<=A;
Endprocess;
Proc2:process(A_REG)begin
B<=Round2(A_REG);
Endprocess;
R2:processbegin
waituntilCLK'EventandCLK=‘1’;
B_REG<=B;
Endprocess;
Proc3:process(B_REG)begin
C<=Round3(B_REG);
Endprocess;
R3:processbegin
waituntilCLK'EventandCLK=‘1’;
C_REG<=C;
Endprocess;
Proc4:process(C_REG)begin
D<=FinalRound(C_REG);
Data_out<=D;
Endprocess;
图2 轮内流水线结构和轮间流水线结构对比[!--empirenews.page--]
其中Round1-Round3、FinalRound是由组合逻辑完成的操作,都能够在一个时钟周期内执行完成。这种风格的代码在生成流水线电路时,还需要控制指令的配合。
图3是拆分轮运算的流水线时空图。图中数字表示数据分组的序号,整个流水线操作由启动、发起、流水线核、收尾和结束5部分组成,当进入流水线核时的效率是最高的。
图3 拆分轮运算的流水线时空图
用加速比(Speedup)可以衡量采用流水结构之后加密过程相对于非流水结构速度的提高。计算流水线加速比的基本公式为。
设加密N个分组,10轮运算每轮的运算时间为!,则
当N的取值无限增大时,这个比值将接近于3.33…。因而使用流水结构数据处理速度比非流水结构提高到3倍多。
仿真实验和结果
图4为加密过程时序。针对128bit明文分组和128bit初始密钥的AES算法,在QuartusII软件下,采用中间相遇的设计方法将顶层模块化图形设计与底层VHDL语言描述相结合实现。实验时选用APEX20KE系列的EP20K1500EFC33-3为目标芯片进行仿真和功能验证。密钥装载完毕之后每加密输出一个分组需3个时钟周期,吞吐率为689.500Mbits/s。使用了3056个LUTs,81626个Memorybits,可以满足SDH标准速率STM-4规定的622.080Mbits/s的要求。
图4 加密过程时序
结合FPGA的结构特点,本设计实现的IP核具有如下特点:接口设计灵活,外部接口的设计和定义可以根据不同加密芯片的接口设计要求现场改动。资源占用小,脱密电路采用与加密电路部分复用的结构实现,从而节省了资源。设计支持重用,在算法实现顶层设计时采用了模块化设计方法,结构清晰,可以根据不同的功能需求进行改动,利于设计重用