APP下载

可变流水级SM4加解密算法硬件设计及FPGA实现*

2024-04-23朱麒瑾陈小文鲁建壮

计算机工程与科学 2024年4期
关键词:加解密明文流水线

朱麒瑾,陈小文,鲁建壮

(1.国防科技大学计算机学院,湖南 长沙 410073;2.先进微处理器芯片与系统重点实验室,湖南 长沙 410073;3.电子科技大学集成电路科学与工程学院,四川 成都 610054)

1 引言

随着现代科学技术的进步,计算机科学行业蓬勃发展,人类社会已然进入信息化时代。通过网络进行信息交互已经成为人们获取信息的主要方式,随之而来的网络信息安全问题就显得愈发重要。因此,发展保护信息安全的相关技术对于个人和国家而言都有着十分重要的现实意义。

加密技术可以分为硬件加密和软件加密。相对于硬件加密而言,软件加密具有更高的灵活性和自主性。但是,随着集成电路行业的发展,日常生活中信息传输的数据量也变得越来越大,用户对信息交互速度的要求也越来越高,软件加密逐渐不能满足实际的应用需求。因此,利用专用集成电路(ASIC)的硬件加密方式便成为了主流。使用传统集成电路芯片,可以在特定的加密算法下,高速地进行加解密运算,可在短时间内完成大量数据的加解密与传输。我国在2006年发布了国际无线网络安全标准WAPI(Wireless LAN Authentication and Privacy Infrastructure),SMS4是该标准的重要组成部分,SMS4加解密算法的出现标志着我国首个商用密码算法的诞生。后续我国国家密码管理局相继公布了SM1、SM2、SM3、SM4、SM7和SM9等一系列国密算法。SM4算法具有算法结构简单易实现、加解密速度快和安全性高等优点,迅速获得了业界认可,被广泛应用在数据加密存储和信息通信等领域中[1]。

本文为提高SM4加解密算法的效率,在设计上采用流水线结构,将轮密钥拓展和每一轮加解密分成若干小段,使得每一小段都能并行操作,从而提高吞吐率,当运算过程稳定后达到连续每个时钟周期输入128位明文数据,同时输出128位密文数据的效果。其次,为增强设计的通用性,本文将流水线设计拓展为可变流水线级设计,使其能根据不同的使用场景选择最合适的流水线级数进行工作。除此之外,本文还将SM4加解密算法进行IP封装,利用FPGA特性搭建了SoC(System on Chip),并对其进行了硬件测试。测试结果表明,该设计具有很强的通用性,在实际工程应用中有着十分重要的意义。

2 SM4加解密算法原理

SM4算法是一个对称式分组加解密算法,其主体采用了非平衡的Feistel网络[2]。该算法输入的明文与密钥都为128 bit。主体结构可分为轮密钥拓展算法和加解密算法,2种算法都采用了非线性迭代结构,都需要进行32轮迭代才能生成最终数据。SM4加密算法与解密算法几乎完全一致,唯一的不同点在于输入轮密钥的顺序互为逆序,对于加密算法所使用轮密钥顺序与轮密钥拓展顺序相同,而解密算法使用密钥的顺序与轮密钥拓展顺序相反[3-6]。

SM4加解密算法的原理如图1所示,轮密钥拓展原理如图2所示。

Figure 1 Principles of SM4 encryption and decryption

Figure 2 Principle of SM4-round key expansion

输入密钥信息后,经过系统参数异或后,送入函数F′,将输出数据与前96位数据重新组合后再次送入函数F′,反复迭代32轮便可得到32轮轮密钥数据。而加密模块将输入数据与轮密钥数据共同送入函数F,同样将得到的32位数据与前96位数据重新组合后再次送回到函数F迭代32次,最后做一个逆序操作便可得到最终的密文数据。

3 SM4加解密算法的可变流水级设计

本节主要介绍可变流水级SM4加解密算法硬件设计,并增加了带有APB(Advanced Peripheral Bus)接口的配置寄存器模块接受处理器给出的配置信息,还设计了带有AXI(Advanced eXtensible Interface)接口的数据接口模块,用于控制数据读写。

3.1 轮密钥模块设计

根据SM4轮密钥拓展原理,将输入密钥与系统参数FK异或之后送入轮函数F′迭代32次。所以,本文设置了一个大小为128 bit的密钥暂存寄存器,用于存储每次迭代后的数据和最开始送入轮函数F′的信息。设置了一个32进制计数器,用于确定迭代次数,从而选取对应的固定参数CK和确定何时完成32轮轮密钥拓展。将每次由函数F′生成的32 bit数据存储到轮密钥寄存器组中,同时将密钥暂存寄存器中的数据左移32位,并将新生成的32 bit数据放入密钥暂存寄存器的低32位,将新得到的128位数据作为输入送入轮函数F′。如此循环32次便可得到32轮轮密钥数据。当32轮轮密钥完全生成后将输出密钥有效信号置1并开始输出轮密钥信息。因为该设计是为了缩短大批量数据的加密时间,相对而言轮密钥生成和传输时间可忽略不计,所以为节约资源,在这里采取串行传输的方式将轮密钥信息送入到加解密模块中。

3.2 加解密模块设计

该模块主要负责对数据进行加解密。当轮密钥拓展模块向加解密模块发送完轮密钥信息后,根据模式选择信息select信号,所有的轮密钥信息将会分组存入rki_rg[0:31]的寄存器组中。若select为0表示加密,轮密钥按顺序存储;若select为1表示解密,轮密钥按逆序存储。当全部存入后,将表示轮密钥传输完成的信号置1,表示该模块已经存储完所有轮密钥,可以开始接收数据。外部接受到该信号后便可以开始向内部传送数据。

在加密时对加密算法进行流水线设计。流水线技术实际上是将大规模组合逻辑电路进行分级,在每一级当中插入一个流水寄存器用于存储每个流水段处理的中间数据。在设计中使用流水线可以大大提高电路的吞吐率,使得每个流水段都能得到有效利用。流水线技术还减少了组合逻辑中的级数,缩短了存储器之间的组合逻辑路径,从而使得电路能在更高的时钟频率下工作。但是,流水线实际上是一种使用资源空间换取时间的方法,在电路设计中插入流水线势必会加大电路的开销,增加电路的面积。所以,对于流水线级数的设计并不代表级数越多越好,需要在面积和速度之间根据使用场景进行折衷选择。下面根据不同流水线级数分别介绍设计方法:

32级流水线设计相对简单,它由32个流水寄存器的时序逻辑电路和32个轮函数F的组合逻辑电路构成。采用32级流水线可以在速度上得到最大的提升,但是电路面积也是最大的。当明文数据被采集后送入第1级轮函数F电路中,对明文数据进行合成置换后得到下一个32位数据,将其和前96位数据重新组合后送入对应流水段的流水寄存器当中。数据输入端每个时钟周期接收一个数据,加解密电路每个时钟周期依次进行加解密,当经过32个时钟周期后,便可以得到一个密文数据。为保证能及时捕捉到输出数据,本设计将输入有效信号invalid同时送入到流水线当中。该有效信号在流水寄存器中传递,每经过一个时钟周期向后一个流水寄存器传输数据。所以,在密文生成后,有效信息也同时从第32个流水寄存器中传出,表示数据有效,将此时的有效信号作为输出有效信号,就可以使输出信号成功地被及时捕捉。同时,如果在输出过程中由于某些原因导致输入明文数据有一个或多个时钟周期的间隙,在加密到该间隙时间时,数据输出无效,不会影响到加解密结果。而4级、8级、16级流水线设计的区别仅仅在于流水寄存器数目的不同,如对于16级流水线而言,采用了16个流水寄存器,每2个轮函数F构成一个流水段。同理,8级流水线中每4个轮函数F构成一个流水段,4级流水线中每8个轮函数F构成一个流水段。

所以,要实现可变流水级,需要在32级流水线设计的基础上,在每一个流水寄存器后加上一个多路复用器,用于选择输入到下一个轮函数F组合逻辑电路的输入是来自于流水寄存器还是上一个轮函数F组合逻辑电路,具体示意图如图3所示。控制信号给出流水线级数信息,多路复用器根据控制信号信息选择输出信号,如16级流水线时,从前往后计数为奇数的多路复用器选择组合逻辑信号作为输出信号,计数为偶数的多路复用器选择流水寄存器作为输出信号。

Figure 3 Design of variable pipeline stage

3.3 配置寄存器模块设计

配置寄存器拥有一个APB接口[7],用于接收处理器发出的配置信息。在设计APB接口时,需要对内部寄存器进行偏移地址分配,便于APB总线对内部寄存器的读写。配置寄存器需要接受的信息为:加解密模式选择信息、读地址信息、写地址信息、密钥信息和数据长度信息。为确保信息读取成功,在每一个信息对应的寄存器旁都加入一个标志位寄存器,当接收到数据后使标志位置为1。每次数据传输都只能传输32 bit数据,所以密钥信息要分4次才能完整传输。当数据全部输入后,所有信息标志位都置为1,所以将准备标志位置1表示配置完成,当寄存器检测到该数据从0变到1后,且表示SM4加解密核工作的寄存器数值为0时,将SM4加解密核启动信号置1,启动SM4加解密核,将密钥信息和加解密模式选择信息发送到加解密核中,将读/写地址信息发送到AXI接口模块。由于AXI接口每次传输最大只支持传输256个数据,所以在配置寄存器中要根据输入的数据长度信息判断需要传输的次数,利用一个寄存器暂存剩余数据长度信息,一个寄存器用于控制每次读数据突发长度。在每一次读数据突发后判断剩余数据长度,如果大于最大突发长度,则读数据以最大突发长度读取数据,当剩余数据长度信息小于最大突发长度时,表示为最后一次突发,最后一次突发的标志位置1,并以剩余数据长度进行读数据突发。每次突发后读地址寄存器也同样增加突发长度乘以16的偏移量,以新地址作为每次突发的首地址。当最后一次突发的标志位为高后,便不再启动读数据信号,标志着读数据处理完成。当SM4工作状态从1重新变为0后,所有寄存器复位。

3.4 读写接口模块设计

AXI接口[8]负责控制加解密数据的读写,当该模块收到配置寄存器模块传来的读启动信号后,根据读突发长度信息,从存储器读取数据。并且设置2个计数器用于计数读启动和写启动次数。当数据加密完成后,需要写回存储器时,根据输出有效信号,每当该信号从0跳变为1时,启动写启动信号,并将写启动寄存器加1。当写启动次数与读启动次数不等时,每次的写突发长度为最大突发长度;当写启动次数与读启动次数相等时,写突发长度为最后一次读突发长度。这样就可以完成大数据量的加解密处理[9]。

4 FPGA实现

为验证设计的可行性,本文将SM4设计封装为IP。搭建了小型SoC,通过模拟IP在计算机中实际的运行方式对设计进行验证。验证SoC所用的开发平台为XILINX ZYNQ-7000系列[10-14]。

整体设计如图4所示,首先要在XILINX ZYNQ-7020开发板[15]上使用本文设计的SM4加解密算法,就需要将SM4流水线设计封装为一个带有AXI接口的IP设计。为了有效利用SM4流水线设计的速度优势,对于SM4工作方式采取了类似于DMA的设计方式。首先在SM4 IP当中放置了一个配置寄存器,CPU可以通过APB总线访问该寄存器,并对该寄存器进行配置。CPU可对配置寄存器配置读数据地址信息、写地址信息、加解密模式选择信息和轮密钥信息。当配置完成后,配置寄存器就可以启动AXI接口和SM4加解密核。将存储器中的数据经过AXI总线读出,完成加解密后,再将数据送回到寄存器当中。这种工作方式与DMA工作方式十分类似,存储器既可以被CPU访问,也可以被SM4 IP访问。SM4 IP与存储器之间进行数据交互,完全由SM4 IP所控制,这样CPU可以与SM4 IP并行工作,有效地提高了CPU的工作效率。CPU只需要在SM4 IP启动前对其进行配置,并在SM4 IP完成数据加解密后申请中断,就完成了加解密。

Figure 4 SoC design with SM4 IP core

下面以32级流水线为例介绍SoC具体工程流程:当CPU通过APB总线向配置寄存器传输读写地址信息、密钥信息、数据长度信息和模式选择信息后,配置寄存器向SM4加解密核发送启动信号,将密钥送入SM4核进行轮密钥拓展。当32轮轮密钥全部完成后,轮密钥存储在寄存器当中。当第1轮轮密钥生成后,便开始串行地向加解密模块传输轮密钥信息。当1 024 bit的轮密钥信息全部完成后,SM4加解密模块向SM4 AXI接口发送轮密钥准备完成信息,表示可以开始接收明文数据。设定突发方式为INCR(INCRement),SM4 AXI接口将读数据首地址发送到总线后,根据地址映射,每一个周期开始自动从存储器读出一个128位数据,当数据送入SM4加解密核后便开始进行加解密。由于设计的是32级流水线,所以一定时间后,每一个流水寄存器都存储着一个正在被加解密的数据。当第1个数据完成32次加解密后,数据被送入SM4 AXI接口,同样设定突发模式为INCR,根据写数据首地址,将数据送入存储器当中,之后每一个时钟周期都将写入一个128位数据,直至数据全部写入。当处理大量数据时,通过利用AXI的流水特性和SM4加解密核32级流水的设计特点,存储器能够在一个周期内同时读出128位明文并写入128位密文,高效利用流水线操作的并行性,进一步提升加解密过程的吞吐量和性能,提高系统的整体效率和响应速度。当所有明文数据完成加密后,加解密核将SM4工作状态标志位置为0,表示加解密工作完成,当CPU检测到这个标志位跳转为0时,便发出中断信号,表示成功完成加解密工作。

5 验证

本节主要利用Vivado进行功能验证,利用 SDK软件对设计进行软件验证。为模拟SM4加解密IP在实际工程应用中的场景,确保设计的正确性和实用性,将此IP加入到SoC工程当中,并将SoC设计在XILINX ZYNQ开发板上运行。通过软件控制处理器,控制SM4 IP核在SoC中正常运行进行加解密操作。

5.1 SoC整体设计

轮密钥拓展模块仿真如下:根据设计轮密钥模块有4个输入信号、2个输出信号,为便于验证,所用密钥为官方手册中给出的实例,将密钥设定为0x0123456789abcdeffedcba9876543210。轮密钥拓展模块采用低电平信号复位,当信号复位后,置使能信号为1,并将密钥信息送入数据输入接口key_in,根据图5所示的仿真波形可以发现,当输入密钥进入轮密钥拓展模块后,经过32个周期完成了轮密钥拓展,输出模块在第1个周期后便开始传输数据,并将输出有效信号置为高,在连续输出1 024个周期后完成32个轮密钥数据的输出。

Figure 5 Simulation results of SoC round key expansion module

加解密模块仿真如下:在之前轮密钥模块仿真的基础之上,添加加解密模块进行功能验证。加解密模块接收来自轮密钥模块所提供的32轮轮密钥信息。当加解密模块收集到所有轮密钥信息后,将轮密钥传输完成信号置1,表示可以开始接收数据进行加解密。在这里分别测试加密和解密是否正确。设置模式输入选择信号为0,表示进行加密操作。在验证平台中设置一个小型RAM,按序分别存储5个数据,具体数据如表1所示,这5个数据流水输入到加解密模块当中。

Table 1 Input plaintext表1 输入的明文

如图6所示的波形图,当密钥输入经过1 024个周期后得到完整轮密钥数据,把轮密钥传输完成信号置1后,经过5个时钟周期,明文数据进入加解密模块。经过32个时钟周期后,开始输出密文数据,当第1个密文数据输出后每经过一个时钟周期输出下一个密文数据。为验证数据的正确性,使用官方所给明文数据0x0123456789abcdeffedcba- 9876543210,以及对应密文数据0x681edf34d206- 965e86b3e94f536e4246,与图6中的加密结果进行对比,以验证加密功能的正确性。为了验证后续所有明文数据加密结果的正确性,编写软件代码进行验证,软件加密结果如图7所示。与图6中结果对比可知,加密结果完全正确。当数据量十分庞大时可以达到每周期输入一个明文,每一个周期输出一个密文的效果。

Figure 6 Simulation results of 32-stage pipeline encryption module

Figure 7 Software encryption results

采用同样的明文数据,调整流水线级数,16级、8级和4级流水线的波形图分别如图8~图10所示。

Figure 8 Simulation results of 16-stage pipeline encryption module

Figure 9 Simulation results of 8-stage pipelin encryption module

Figure 10 Simulation results of 4-stage pipeline encryption module

为验证解密功能,将加密得到的密文重新作为输入密文输入到加解密模块中,将加解密模式设置为解密。输入密文信号如表2所示。加密结果如图11所示。观察结果可以发现,解密得到的明文数据与表1完全相同,所以加解密功能验证成功。根据SM4算法结构特点,SM4加密算法与SM4解密算法结构几乎完全相同,仅在输入轮密钥顺序上有所不同,在设计4种不同流水线级数的流水线时,对于轮密钥的使用情况是同一设计,所以这里以32级流水线为例,对解密模式进行功能仿真,不再具体分析16级、8级和4级流水线的解密模式功能仿真结果。

Table 2 Input ciphertext表2 输入的密文

Figure 11 Simulation results of 32-stage pipeline decryption module

5.2 软件验证

Vivado的Block Design可以基于IP进行设计,用户可以调用官方提供的和用户自己封装的IP进行设计。将本文设计的SM4 IP进行封装,封装为含有AXI的主机接口和APB的从机接口。按照图4所示SoC设计框架,进行SoC搭建。SoC包含作为PS(Processing System)端的处理器模块XILINX ZYNQ7 Processing System、用于PL(Progarmmable Logic)端与PS端连接的AXI总线模块AXI Interconnect、存储器模块Block Memory Generator以及用于与AXI接口对接的存储器控制器AXI BRAM Controller,调用一个AXI2APB的总线桥用于与SM4 IP的APB接口相连接。处理器通过AXI总线和AXI2APB的总线桥将配置信息传入到SM4 IP的配置寄存器中,当SM4 IP收到配置信息后启动加解密功能,通过AXI总线申请从存储器中读出明文数据,明文数据通过AXI总线传输到SM4 IP当中,当加解密完成后,SM4 IP再通过AXI端口申请写寄存器,将明文数据通过AXI总线写入到存储器当中。PS端不断查询SM4 IP配置寄存器中SM4工作状态标志位,当该标志位从1跳转为0后,PS端接收到加解密工作完成的信息。

测试过程如图12所示。Vivado支持使用SDK对硬件设计进行软件调试。在软件调试时,首先对存储器的明文数据区域和密文数据区域进行初始化,将存储器全部清0。在进行地址分配时存储器地址范围为0x4000_0000~0x4000_FFFF,将0x4000_4000~0x4000_7FFF划分为明文区域,0x4000_8000~0x4000_BFFF划分为密文区域。设定突发长度为256,将256个明文数据存储到存储器明文区域,存储完成后便可以开始对配置寄存器进行配置。配置完成后PL部分就会自动完成加解密操作。为验证加解密的正确性,在加密完成后清零存储器明文数据区。然后重新配置配置寄存器,命令SM4 IP完成解密操作,并将得到的明文数据写入明文存储区。最后将明文存储区中的数据读出与输入明文进行对比判断是否一致,若一致则代表加解密功能无误。根据对比输入明文与解密密文写回到存储区的解密数据可以判断,加解密成功。

Figure 12 Software test results

下面对加解密速度进行测试。在XILINX ZYNQ的PS处理器中,XILINX提供了可供用户进行调用的定时器模块,2个Cortex-A9处理器共用一个64位的全局定时器GT(Globle Timer),每个处理器又有专属的32位私有定时器和32位的看门狗计时器。私有定时器和看门狗计时器总是以CPU频率的一半为时钟频率。本文利用处理器的私有计时器来计时,处理器设置的时钟频率为600 MHz,所以私有定时器的时钟频率为300 MHz。当SM4 IP核中配置寄存器配置完毕后,马上就会开始工作,所以在配置最后一个信息之前记录当前私有定时器计数值。当SM4 IP核工作完成,工作状态标志位跳变回0,处理器检测到后再记录私有定时器计数值。因为私有定时器是倒计时,所以将前一个计数值减后一个计数值后乘以时钟周期便可得到加解密工作用时。

为对比硬件执行加解密算法与软件执行加解密算法的速度差异,软件加解密利用XILINX ZYNQ的处理器执行软件程序,执行过程中同样从存储器同一位置取出明文进行加密并写回存储器密文区域,再将密文数据读出并进行解密操作,将解密后的明文数据重新写回到存储区的明文区域。处理器频率为600 MHz,利用纯软件的方式实现SM4算法,并对10 000个数据进行加解密的时间约为60 000 μs。

当利用硬件进行加解密时,同样突发为10 000个数据,输入明文与密钥相同。为同时对比不同流水线级数的速度差异,本文对4种流水线都进行了软件速度测试,结果如图13所示。由结果可以得出,在10 000个数据突发的情况下,利用硬件实现SM4加解密算法可以比软件实现加解密算法在加解密速度上提高约1 939~8 283倍。所以,随着处理数据量的增加,硬件与软件的执行速度差异会更大,所以实际工程中利用硬件电路对数据进行处理能大大提高工作效率。

Figure 13 Hardware encryption and decryption time

6 性能测试

本节将通过软件仿真结果分析设计性能。

本文对不同级流水线设计进行了性能测试。根据综合报告显示,32级、16级、8级和4级流水线能达到的最大工作频率分别为140 MHz,128 MHz,65 MHz和33 MHz,如图14所示。观察发现,16级、8级和4级流水线的最高工作频率基本上呈现倍数关系。而32级与16级流水线的最高工作频率差别较小,因为此时电路的最短路径是由轮密钥拓展模块决定的,而16级、8级和4级流水线的最高工作频率的差别是由于流水段中组合逻辑规模增大而导致最短路径变长。

Figure 14 Maximum operating frequency

图15显示了可变流水级的硬件资源消耗。如图15所示流水线设计的LUT(Look Up Table)消耗都基本相同,而寄存器资源随着流水线级数增加而减少。这是符合设计要求的,因为不同流水线级数之间的差别仅仅在于流水线寄存器数目的不同,而组合逻辑资源都是32个单次加解密电路,只是用不同数目的流水线寄存器对电路进行了划分。

Figure 15 Hardware resource consumption

根据软件测试结果测试中不同流水线的吞吐率与理想吞吐率进行对比,结果如图16所示,不同级数流水线实际的吞吐率与理想吞吐率几乎保持一致。

Figure 16 Throughput

7 结束语

SM4算法作为我国第一个商用加解密算法,凭借其实现方式简单、安全性高和稳定性强的优点,在业界有着广泛的应用。硬件方式实现加解密算法相对于软件实现来说,在处理速度上有着很大的优势,十分适合应用在大批量数据加解密的工作场景。本文基于SM4加解密算法,实现了硬件可变流水级的设计,并且搭建了SoC,利用XILINX ZYNQ型开发板模拟了实际的应用场景,具有十分重要的工程意义。

本文实现了可变流水级SM4加解密算法硬件设计。同时,将SM4加解密算法封装为符合APB和AXI协议的标准IP,在IP内部设置配置寄存器和AXI接口,使得CPU可以通过APB总线配置加解密要求,使得加解密模块能通过AXI总线读写大量数据,模拟大批量数据收发的实际情形。通过Vivado和Vivado SDK对设计进行了功能验证和软件验证。由软件验证结果可以清晰地得出利用软件进行加解密和利用硬件进行加解密的速度差异,硬件实现方式能满足每个周期输入一个数据、每个周期输出一个数据的性能指标。同时,将软件测试吞吐率与理想吞吐率进行了对比,证明本文设计的可行性。该设计可以根据不同的应用场景设置流水线级数,具有很强的通用性和工程意义。

猜你喜欢

加解密明文流水线
Gen Z Migrant Workers Are Leaving the Assembly Line
流水线
奇怪的处罚
PDF中隐私数据的保护方法
电子取证中常见数据加解密理论与方法研究
奇怪的处罚
基于FPGA的LFSR异步加解密系统
报废汽车拆解半自动流水线研究
四部委明文反对垃圾焚烧低价竞争