基金项目:福建省高校重点实验室建设资金; 厦门市科技局科技专项; 2017年厦门大学教学改革研究项目
通信作者:leexcjeffrey@xmu.edu.cn
(1.厦门城市职业学院电子与信息工程系,福建 厦门 361008; 2.厦门大学信息科学与技术学院,福建 厦门 361005)
(1.Department of Electronics and Information Engineering,Xiamen City University,Xiamen 361008,China; 2.School of Information Science and Engineering,Xiamen University,Xiamen 361005,China)
Linux unified key setup(LUKS)authentication; password-based key derivation function(PBKDF2); secure hash algorithm(SHA-1); avanced encryption standard(AES)ST-box; pipelined architecture
DOI: 10.6043/j.issn.0438-0479.201710021
Linux统一加密设置(LUKS)是Linux操作系统的标准磁盘加密认证规范并得到广泛应用.由于其算法构成复杂且所需资源较多,如何利用单个现场可编程门阵列(FPGA)的有限资源来实现整个算法并获得高吞吐率是研究工作的重点和难点.为此,研究了一种高能效的LUKS认证算法流水线架构,包括采用4级流水线的安全散列算法(SHA-1)和8级流水线的基于密码的密钥派生函数(PBKDF2)-基于哈希消息验证代码(HMAC)-SHA-1),并使用块随机存取存储器(BRAM)实现了基于S盒和T盒(ST-box)映射表的高级加密标准(AES)-128-电子密码本模式(ECB)算法,以节省FPGA的查找表资源用于上述的流水线架构实现.运行结果显示本设计的密码遍历速度达到了342 s-1,功耗仅为5.27 W,每个密钥的平均计算能量为0.015 J.口令恢复速度超过了工作频率为700 MHz、480核的GTX 480图像处理器(GPU),同时其能耗仅为GPU的1/13.
Linux unified key setup(LUKS)is regarded as the most popular full disk encryption solution implemented in Linux.A high throughput and pipelined architecture of LUKS authentication scheme is implemented on a field-programmable gate array(FPGA)with limited resources,including the four-stage pipeline structure of secure hash algorithm(SHA-1)algorithm,the eight-stage pipeline structure of password-based key derivation function(PBKDF2)-hash-based message authentication code(HMAC)-SHA-1 algorithm and the hardware design of advanced encryption standard(AES)-128-electronic code book(ECB)algorithm based on S-box and T-box(ST-box).Results show that the recovery speed of a password is 342 s-1,power consumption is only 5.27 W,and the average calculation energy per password is 0.015 J.With the authentication system running in the 195 MHz,the password recovery speed is faster than the 480 cores GTX 480 GPU running in 700 MHz,while its power consumption is only 1/13 of the GPU.
Linux统一加密设置(LUKS)是Linux系统的标准磁盘加密认证规范,适用于各种不同的Linux发行版本和Android操作系统.LUKS的认证算法采用两层的密钥结构,即用户密钥和主密钥.主密钥加密数据,用户密钥对主密钥进行加密.LUKS首先通过基于密码的密钥派生函数(PBKDF2)来生成用户密钥,使用生成的用户密钥加密得到主密钥后,采用数据分割在存储前对主密钥进行扩展和分割,以提高安全性.LUKS认证算法包含哈希算法、对称加解密算法以及基于哈希消息验证代码(HMAC)导出的PBKDF2,其复杂度较高,所需要的硬件资源较多.
Malvoni等[1]提供了LUKS具体实现平台选择的依据,从在中央处理器(CPU)、图像处理器(GPU)和现场可编程门阵列(FPGA)计算平台上运行同一个认证机制所得到的能效比结果来看,FPGA的能效比最高.目前,在FPGA上实现认证算法的相关研究较少,如何在有限资源的FPGA中实现LUKS算法并获得较高吞吐率是基于FPGA兑现工作的研究重点,需要兼顾吞吐率、占用资源大小、资源利用率和功耗等因素.
Lee等[2]通过对高级加密标准(AES)的优化和四级流水线架构的实现,使AES算法吞吐率达到了3.8 Gbit/s; Michail等[3]运用诸如循环展开、预计算、重定时等多种技术来实现安全散列算法(SHA)-1,其优化后的架构在Virtex-4器件(xc4vlx100-12FF1148)上实现了8.05 Gbit/s的吞吐率,占用的Slice数为2 390.可以看出,通过对AES和SHA-1进行优化能够在有限资源的FPGA平台上达到较高吞吐率.Li等[4]首次在FPGA平台上采用PBKDF2-SHA1和AES-128算法,实现了生成用户密钥模块的LUKS流水线架构,SHA-1的吞吐率达到了1 786 Mbit/s,使用1 033个Slice中的查找表(LUT)在实现平台Picozed 7030上的密钥恢复速度为20.6 s-1.由于Li等[4]仅在LUKS的较高层级采用了流水线架构,没有对SHA-1等关键基础模块采用流水线,实验数据表明这些模块的吞吐率还有很大的提升空间.王文功等[5]在多片FPGA上实现了SHA-1的并行运算,但因为没有对算法的底层实现进行流水线优化,吞吐率只有3.2 Gbit/s.刘恒等[6]将MD5、SHA-1、SHA-2等7种哈希算法设计为一个可重构IP,实现了一种高效可配的哈希算法硬件架构,但其中SHA-1的吞吐率较低,只有640 Mbit/s.龚向东等[7]采用了流水线架构优化AES的关键路径-密钥扩展,占用资源1 139 个Slice、308个块随机存取存储器(BRAM)时吞吐率达到了56.83 Gbit/s; 但如果考虑BRAM资源,其实际的单位Slice资源吞吐率权为1.40 Mbit/s.
基于以上分析,本研究设计了一种基于FPGA的高吞吐率LUKS认证算法片上系统:1)对关键的PBKDF2-HMAC-SHA-1.算法采用流水线结构,并且基于预计算和回路展开等技术实现了SHA-1流水线结构; 2)充分利用FPGA内部的BRAM资源实现基于S盒和T盒(ST-box)映射表的AES算法,节省片内Slice资源给其他的流水线结构,并提升AES算法所对应电路的工作频率; 3)对主要模块进行合理分割,平衡了各模块之间的运算时钟数,以提高整体架构的工作频率.
本设计的整体架构分为两个部分,即主控处理器部分和LUKS硬件协处理器部分,分别基于FPGA的硬件处理器(PS)和可编程逻辑(PL)资源实现.两者之间采用先进可扩展接口(AXI)进行通信,主控处理器通过AXI与片内BRAM和LUKS电路模块相连,输入数据并获得LUKS协处理器的运算结果.在BRAM中,储存有主密钥的相关数据,作为AES解密模块的输入.其他LUKS模块所需要的数据可以从AXI相关的寄存器中获取.
以时延(单位为时钟周期clock,1 clock=1/(f),f为频率)为标准,合理分配各模块的资源是提高吞吐率的有效手段.在LUKS认证算法中,通常PBKDF2的迭代次数为163 682,校验哈希值生成的迭代次数为41 125[9],故生成用户密钥所需的迭代次数是生成校验哈希值的迭代次数的4倍,因此本设计将生成用户密钥模块的数量设计为校验哈希值生成模块数量的4倍,以平衡各级之间的运算时延,进而实现流水线结构较高的工作频率.这个工作流的前4个PBKDF2模块以流水线的工作模式生成用户密钥,第5个PBKDF2模块生成待校验哈希值.单个PBKDF2模块是8级流水线,一次迭代所需时间为82个clock.当系统工作时,密码生成器会给具有8级流水线的第一个PBKDF2模块8个密码,然后前4个PBKDF2模块每个都会完成约1/4的迭代次数.AES AF-Merge模块的作用是获取主密钥.其中AES密钥扩展模块首先将前面PBKDF2所派生的用户密钥进行扩展,并作为AES的轮密钥.AES解密模块再解密主密钥,它的时延为10个clock.最后AF-Merge将AES解密的结果作为输入,进行迭代运算,需要41个clock.故AES AF-Merge模块前面输入的8个密码,需分别经过4 000次AES解密和3 999次SHA-1操作,即需8×(4 000×10+3 999×41)=1 631 672个clock便可以获得主密钥.最终,主密钥的哈希值将在哈希值比较模块中与加密镜像中储存的哈希值进行比较,需1个clock.各模块的时延如表1所示.
表1 流水线结构LUKS中IP核各模块的时延
Tab.1 Amount of delayed for each module of IP core in LUKS pipeline architecture
基于以上各模块运算时钟数的分析,本研究设计了如图2所示的硬件协处理器架构,包括1个密码产生模块、5个PBKDF2模块、1个AES AF-Merge模块、1个主密钥校验哈希值比较模块和1个顶层AXI控制模块,模块之间通过缓存进行连接.接到主控处理器给出的控制指令后,开始认证算法的密钥验证过程:1)由密码产生模块生成用户密钥并输入到密钥缓冲区; 2)第1~4级流水线的PBKDF2模块从前一级缓冲区中取得输入并将处理后的数据输入到后一级的缓冲区; 3)AES AF-Merge模块用前面生成的用户密钥去解密和重新组合保存在BRAM中被分割加密的主密钥数据,恢复出主密钥并将其存入主密钥缓冲区中; 4)PBKDF2模块利用输入的主密钥生成校验哈希值并存入哈希值缓冲区; 5)哈希值比较模块对比哈希值缓冲区中待校验哈希值与输入的主密钥校验哈希值,两者相等则向控制模块返回认证通过的信号,不相等则继续密码认证过程.
SHA-1算法以512 bit为单位进行处理,并输出长度为160 bit的散列值.计算过程中,用寄存器A、B、C、D、E分别存储一轮运算的中间结果,即5个状态变量HA、HB、HC、HD、HE.第1组分组数据为SHA-1算法规定的初始常量值H0~H5,在其余分组计算中,HA~HE为上一分组计算出的摘要值.每个状态变量的大小为32 bit,以容纳160 bit的数据[10].图3(a)给出了SHA-1其中一轮操作的示意图.图中:Ki是常量,fi是非线性函数,具体的取值根据80轮中的轮数i有所不同; Wi为由输入数据分组计算所得的变量[10],RotLx表示将数据循环左移x位.
如果使用最基础的SHA-1硬件,一个clock使用SHA-1的1轮运算,那么执行整个SHA-1算法就需要80个clock,这样的设计性能不佳.因此,本文中对SHA-1的运算进行组合,使用了2轮展开,将80轮运算的每2轮运算合并在一起变为1轮运算,新的1轮运算能够在一个clock内完成[11].同时还采用了预计算的手段,提前计算出下1轮所要用到的值,并写入R1~R4这4个寄存器中,等待下1轮使用.由于每轮的中间运算结果HA(i),HB(i),HC(i),HD(i),HE(i),可以由HR1(i-1),HR2(i-1),HR3(i-1),HR4(i-1),HA(i-1),HB(i-1)和HC(i-1)得出,所以在一轮计算的过程中,中间值HD(i)和HE(i)无需用寄存器存储,只在最后一轮才需要引出,因此在中间运算电路实现时,将寄存器D和E移除,以进一步节省资源,如图3(b)所示.在首轮中对R1,R2,R3,R4这4个寄存器初始化公式如下.
{HR1(0)=f0(HB,HC,HD)+RotL5(HA)
HR2(0)=f1(HA,RotL30(HB),HC),
HR3(0)=W1+K1+HD,
HR4(0)=W0+K0+HE.(2)
其中,K0和K1分别为SHA-1中的常量.即便如此,SHA-1的1轮操作也需要花费大量的时间.因此将SHA-1的模块设计为4级流水线结构,每级流水线完成20轮的计算,如图4所示.SHA-1的4个核分别处理4级流水线的4个阶段.因为第一轮需要预计算,因此第一个核需要经过11个clock才能够计算出结果,至于其他核,则分别只需要10个clock.每2个核间的寄存器用于存放前一个核的输出(即10轮运算结束后的状态变量值),而这些值将作为下一个核的状态变量输入.在最后一个核中,还需要将运算结果与前一分组数据块的摘要值HA、HB、HC、HD、HE相加,以得到最后的摘要值.
表2列出了本研究与其他文献数据的吞吐率对比,吞吐率TP的计算公式如下:
TP=(B×f×P)/L,(3)
其中,P代表流水线的级数,B表示进入一级流水线的数据块的长度,f表示系统所能达到的最大工作频率,L表示一个数据块从输入到计算完毕总共需要经过的时延.对比文献[12]和[13],本研究的设计有着较大的工作频率、吞吐率和TPS,并且所使用的资源较少.由表2可知,采用基于28 nm工艺的Zynq系列7030 FPGA可以实现比基于40 nm工艺的Virtex 6更高的吞吐率和单位资源吞吐率.本研究设计的工作频率达到了301 MHz,TPS达到了17.52 Mbit/s.
本研究的流水线PBKDF2的导出密钥值
DK=PBKDF2(PRF,P,salt,iteration,dklen).(4)
其中:PRF表示伪随机函数,本研究选用HMAC-SHA-1; P代表密码; salt是随机生成的盐值,长度为32 bit; iteration表示伪随机函数循环的次数; dklen是导出密钥DK的长度.导出密钥被分为多个块计算,每一块的结果值Tn由PRF函数经过循环迭代计算得出,最后得到的DK由T1…Tn连接而成.
PBKDF2及其HMAC的底层函数框图如图5所示,图中ipad和opad表示两个固定常量,int(n)表示整数n的4字节十六进制数.图5(b)给出了HMAC-SHA-1函数所进行的具体计算步骤,其中的H函数表示SHA-1运算,K0与图5(a)中的P相对应,M则表示图5(a)中的Salt‖int(n)(第n次迭代)或者是上一个PRF函数的输出.HMAC函数中的摘要h0和h1会分别被计算iteration次,考虑到HMAC函数的输入不变,每次h0和h1的计算结果均不变,故只需计算一次h0和h1,并存于寄存器中,即可将PBKDF2中SHA-1的执行次数从4×iteration次下降到2+2×iteration次.
考虑到在LUKS认证算法中需要大量的PBKDF2算法迭代,在此采用流水线架构来实现[14],其架构如图6所示.每个PBKDF2中包含2个SHA-1的模块,而每个SHA-1模块采用4级流水线架构,所以整个PBKDF2-HMAC-SHA-1采用8级流水线的架构,需要82个clock完成一次迭代.其中寄存器1~8存放8个不同的h1值,而寄存器9~16存放8个不同的h0值.HMAC摘要寄存器用于累计每次HMAC-SHA-1函数的输出摘要h3,经iteration次迭代后,该寄存器内的值即为PBKDF2函数的输出密钥.
将本研究流水线架构实现的和文献[15]中恢复WiFi保护访问(WPA)/WPA2密钥的PBKDF2-HMAC-SHA-1性能进行比较,如表3所示.本研究的8级流水线PBKDF架构仅使用3 800个Slice资源,而文献[15]的20级流水线结构使用了6 381个Slice资源.并且本研究的PBKDF2构架完成8级流水只需88个clock,而文献[15]完成20级流水需要384个clock,可见本研究的构架在完成每级流水平均所需的clock数上占优势.在相同时钟频率的条件下,本研究的吞吐率高达6 982 Mbit/s,而文献[15]的吞吐率为4 680 Mbit/s,可见本研究的8级流水线架构比20级流水架构的吞吐率还要高出许多.从资源利用率的角度看,本研究的TPS参数为1.84 Mbit/s,而文献[15]中仅为0.74 Mbit/s.
由于SHA-1和PBKDF2算法实现中采用流水线结构,占用了较多的LUT资源,因此在实现AES算法时,采用ST-box映射表的架构,并利用FPGA片内BRAM资源来实现.通过对AES轮运算(前9轮)的变换,可以得出以下公式:
ej=T-10[a0,j]T-11[a1,j+1]
T-12[a2,j+2]T-13[a3,j+3]kj,(5)
其中,T-1i对应的是逆T-box映射表,ai,j表示状态矩阵中第i行与j列的字节数据,kj为每一轮的轮密钥,ej为每轮运算后新状态矩阵的列.经过这样的变换后,可使AES中大部分关键的变换通过简单的查表来实现,减少LUT资源的占用.最后一轮由于没有逆列混合操作,因此需要逆S-box.本研究将逆S-box和逆T-box都存储在BRAM中,每个BRAM中存放一对.
根据式(5),本设计将AES-128解密算法的一轮操作分为3个部分:前端行移位部分、中部ST-box表部分和后端轮密钥加密部分.AES-128解密算法的输入为16 B的数据,分别对应于式(5)中状态矩阵ai,j,存放在16个寄存器中.将这些寄存器依据行移位规则连接到中部ST-box表部分的BRAM上,寄存器中的值就可以作为BRAM的地址,BRAM的输出端则输出对应地址的内容,完成式(5)中的行移位和逆T-box的代换.最后,再将状态矩阵中的1列所需的4个逆T-box代换的值与该列对应的轮密钥一同进行异或操作,就可以得到新的状态矩阵中所对应的列.
表4列出了本研究设计的AES架构的数据与其他文献的对比.文献[16]和[17]在时延(每处理一个数据块所需clock数)方面与本研究相同,但是本研究的AES架构在各平台都能达到较高的工作频率,在Virtex-7平台中,本研究的工作频率接近文献[16]中的2倍,且获得了最高的吞吐率8.346 Gbit/s.另外,本研究架构在7030平台上实现所需Slice数最少.在各种平台下,文献[16]和[17]分别使用了2和4个BRAM资源,而本研究使用了8个BRAM,可以节约Slice资源,不抢占PBKDF2模块的Slice资源,并且工作频率高,整体的LUKS认证算法电路的频率并不会因AES模块受到限制.综上所述,8个 BRAM的AES架构兼顾了时序和资源的需求,适合本研究的LUKS认证算法设计.
本研究的LUKS认证系统基于Xilinx的Picozed开发板,该开发板搭载的主芯片为ZYNQ 7030,使用的软件开发环境为Xilinx Vivado 2014.4,测试程序基于FreeRTOS操作系统,通过板级支持包来驱动LUKS协处理器完成认证计算和测试.板级支持包中包含有LUKS IP核的驱动、BRAM的驱动、串口驱动和以太网驱动等.本研究的设计占用了78.3%的Slice LUT资源,62.45%的Slice寄存器资源和15.47%的BRAM资源,如图7所示.此处没有列出用于连接不同模块和组成AXI总线控制器的Slice LUT和Slice寄存器资源的利用率,但是它们已经被计入整个设计的利用率.用来生成用户密钥的PBKDF2算法使用了整个芯片约一半的资源(55.3%).此外,还有12.08%的BRAM资源用于保存密钥数据区(这部分资源没有列入图7中).
1~4表示PBKDF2第1~4级,5表示AES AF-Merge,
6表示PBKDF2检验哈希值生成,7表示整个设计.
表5 各平台LUKS密码恢复速度和功耗对比(AES-128-ECB)
Tab.5 LUKS password recovery speed and power consumption of each platform(AES-128-ECB)
表5给出了针对密码组合AES-128-ECB和SHA-1在各平台中LUKS密码恢复速度和功耗的对比.此处功耗为运行LUKS认证算法的动态功耗,即运行时功耗减去待机时功耗的结果.从表5中可以看出,基于Picozed 7030平台,本研究的密码恢复速度是迭代结构LUKS算法的2倍,因此密码恢复不仅占用了较少的资源,而且得到较高的密码遍历速度,达342 s-1; 而迭代结构的LUKS算法即使耗费了更多的资源,但是密码遍历速度仅为178 s-1.另外,本研究的流水线架构所实现的密码遍历速度是文献[4]的16.6倍且已经超过了Nvidia GeForce GTX 480平台的LUKS密码遍历速度.
在功耗方面,基于迭代结构的设计在恢复一个密码时所要消耗的能量是0.034 J,而流水线架构仅需0.015 J,不到迭代结构的一半.在CPU和GPU平台上,恢复一个密钥所需要的能量则远远大于FPGA平台.在Nvidia GeForce GTX 480平台上,每个密钥所需能量为0.200 J,是流水线方法的13.3倍,而在Intel Core i7 920(4核8线程)平台上,每个密钥所需能量(4.597 J)是流水线方法的306.5倍.本研究实现的功耗仅为文献[4]中功耗的12.7%.因此,流水线架构的实现在密码恢复速度,资源利用和能效比方面都优于迭代结构的设计.
本研究基于FPGA研究和实现了一种LUKS认证算法的流水线架构,为了充分利用FPGA的有限资源,分析了整体架构以及所涉及的密码算法,进行了优化设计,并且采用流水线和查表的实现方式来达到吞吐率和资源利用率的平衡.通过对总体结构设计和底层算法的优化,系统的整体吞吐率、资源利用率和功耗等指标都得到较大的改善,主要体现在:1)对关键的PBKDF2-HMAC-SHA1算法采用8级流水线结构,通过优化降低了其迭代次数; 并且基于预计算和回路展开实现了4级流水SHA-1结构,并在具体实现时优化移除了部分寄存器.2)考虑到PBKDF2的流水线结构占用了较多的LUT资源,因此在实现AES算法时采用基于ST-box结构的AES算法,充分利用FPGA内部的BRAM资源实现ST-box映射表,通过使用8个双端口的BRAM资源,提升了AES算法部分的工作频率.3)对模块进行合理分割,平衡了各级之间的运算clock数,以实现流水线结构的较高工作频率; 并基于Picozed 7030 FPGA开发板实现了LUKS认证片上系统,包括LUKS硬件协处理器、软件驱动以及基于FreeRTOS操作系统的测试软件开发.系统运行结果显示本设计的密码遍历速度达到了342 s-1,而功耗只有5.27 W,每个密钥所需能量为0.015 J.工作在195 MHz的系统口令恢复速度超过了工作频率为700 MHz、流处理器数量为480的GTX 480 GPU,同时其能耗指标仅为GPU的1/13.