基于RISC-V 的SM4 算法扩展指令的设计与实现*

2022-03-17 10:16李晨琪袁国材
计算机与数字工程 2022年2期
关键词:密钥指令密码

李晨琪 袁国材 樊 荣

(中国船舶集团有限公司第七二二研究所 武汉 430205)

1 引言

随着信息技术的发展,信息的传输与交互越来越频繁,由此带来的信息安全问题也在近年来成为人们关注的焦点[1]。在实现信息传输的过程中,使用密码技术对数据进行处理是保证信息安全的重要技术手段。其中,SM4分组密码算法由我国自主设计,于2012年3月由国家密码管理局作为我国采用的一种分组密码标准发布。

对于数据加密算法,常见的分组密码算法有美国的AES 标准[2]以及中国的SM4 标准,且SM4 的安全特性等效于AES-128[3]。SM4 作为一种分组密码算法,其分组长度及密钥长度均为128 bit,加密算法与密钥扩展算法均采用32 轮非线性迭代结构。SM4 算法常见的实现方式有硬件实现与软件实现。其中,基于硬件实现时,需要将算法部分固化进硬件电路,其高性能的表现建立在高资源开销的基础上。虽然目前已有诸多降低SM4 算法硬件电路开销的方法被提出,例如通过部分架构重用降低复杂度[4],通过基于复合域计算实现Sbox来降低存储Sbox 数据所需硬件开销[5]以及基于异步多米诺逻辑实现SM4 算法[6],但其总体硬件资源开销仍较大,且在需要支持多种算法的情况下会导致成本累加[7]。相比硬件实现,软件实现具有成本低、灵活性强的特点,但同时存在性能差的弊端。微处理器指令扩展技术作为一种相对折中的方式,通过增加SM4算法相关的微处理器指令,采用硬件实现影响密码算法性能的基本操作部件[8],实现以较低的硬件资源开销换取使用微处理器实现算法时性能的提升。

目前,通过扩展处理器指令集的方式实现对密码算法加速的方式已经被一定程度地应用到了实际的处理器中。例如,基于x86 指令集架构的Intel AES-NI[9],用于改进应用程序使用AES 算法执行加密和解密的速度;基于ARMv8-A 架构的密码指令扩展,包括在ARMv8.2-SM 中实现的面向SM3 以及SM4 算法的扩展指令。这些扩展指令均已被实际应用于人们日常使用的计算机等终端设备中,但却并不适用于一些小型处理器。RISC-V架构的处理器由于其开源、灵活以及资源节约等特性,更适用于资源有限的环境,基于RISC-V 的SM4 算法扩展指令也不断地被提出与设计实现,如文献[10]中针对SM4 算法的扩展指令使加密性能提升至少5倍,文献[11]中使用扩展指令形成SM4算法的软硬件协同实现机制使吞吐率提升至少4.47倍。

本文选择基于开源指令集RISC-V以及开源小型处理器VexRiscv[12],设计实现一种针对SM4密码算法的扩展指令,使用Xilinx Artix-7 FPGA 进行实际测试并对其硬件资源开销、加解密性能进行分析评估。通过本文设计实现的扩展指令的使用对比无扩展指令的SM4算法软件方式实现,针对不同字节长度数据块进行加密,性能提升约8~14 倍;在增加该扩展指令集后,处理器的总体硬件资源开销相比于不包含SM4 算法扩展指令仅增加59LUΤs,远低于增加基于硬件实现的SM4 算法部分带来的硬件开销。

2 SM4算法扩展指令

本文提出的SM4算法扩展指令,是基于已公开国密算法标准设计实现的硬件扩展指令。SM4 算法包括加密算法部分以及密钥算法扩展部分(如图1),加密算法以及密钥扩展算法均采用32 轮非线性迭代结构,因而我们只需减少单次迭代的实现时间即可达到针对性能的提升。由此,本文针对密码算法部分以及密钥扩展部分的轮函数提出表1 中所示两条SM4 算法扩展指令,指令sm4ed用于实现加解密算法轮函数中的部分运算,指令sm4ks用于实现密钥扩展轮函数中的部分运算。

图1 SM4密码算法

表1 SM4密码算法扩展指令集

本文设计实现的SM4密码算法扩展指令,使用两个源寄存器、一个目的寄存器以及长度为1 bit的标志位fn用以区别表示两条扩展指令,即表1 中所列标志位取值。指令的执行过程,将先获取源寄存器rs2 中的数据,根据fn的值选择相应的运算过程进行运算,并将指令执行结果写入目的寄存器rd。基于以上需求,结合图2(a)中所示RV32 主要指令结构,本文选择采用RV32 R-type 指令格式,设计SM4算法扩展指令编码格式如图2(b)所示。

图2 RV32 R-type及SM4扩展指令格式

3 SM4 密码算法扩展指令的实现与应用

在传统的处理器设计中,一条指令是分为多个流水阶段执行的。流水线阶段划分越多,越能减少流水线每阶段所需要的逻辑深度。经典的处理器设计中常应用五阶流水线结构,即取值、译码、执行、访存及写回阶段。在诸多基于传统硬件描述语言设计的开源RISC 处理器中,多阶段的流水线结构往往对应多个硬件描述语言编写成的模块,如SCR1[13]以及CV32E40P[14],在实现对指令集扩展的过程中需要对流水线各阶段的实现代码都进行一定程度的修改,这对于实现扩展指令的增加操作并不友好。因此,在诸多开源RISC-V的处理器中,我们选择了基于VexRiscv 处理器来实现我们的SM4密码算法扩展指令。

VexRiscv 处理器基于SpinalHDL 语言实现,指令的执行过程可根据需求配置为2~5 级流水线,同时,它不再以流水线的阶段作为模块的划分对象,而是根据功能划分实现处理器各组成部。因此,在实现指令的增加与扩展时,只需要按照功能增加相关的模块,而不需要对原有处理器结构等内容做出修改,这为我们的实现以及优化工作提供了便利。

根据两条指令的功能,我们将指令的执行过程适配于五阶流水线结构,数据的运算结果将在访存阶段运算完成并在写回阶段被写回至目的寄存器rd。依据图1 中所示SM4 密码算法实现过程并结合实际运行需要,本文中设计实现的两条SM4密码算法扩展指令其软件端的调用格式在表1 中给出,对应参数取值及运算过程如图3所示。

SM4 密码算法的实现过程包含图1 中所示32轮次迭代运算,单次迭代过程如图3(a)所示。对于第i次执行轮函数F,其输入参数可划分为图3(a)中rs1、rs2 框中所示两部分,对应sm4ed指令调用格式中所列参数rs1 与rs2;其输出结果如图3(a)中rd框中所示,对应sm4ed指令调用格式中rd。实际应用时,本文将每4 次迭代过程视为一组运算过程,对于SM4 密码算法的整体实现过程可看作8组运算过程,则SM4 加密算法中32 轮迭代可通过如下代码实现:

图3 SM4算法扩展指令实现内容

上述代码中,部分异或运算可以复用,因此在实际实现过程中,每组运算可进一步减少两次异或运算,即仅调用10次异或运算指令以及4次sm4ed指令,使得单次迭代指令条数为3.5 条。密钥扩展部分迭代过程与密码算法部分基本一致,sm4ks指令的调用参数取值及指令执行结果如图3(b)中rs1,rs2 以及rd框中所示。

4 实验结果与分析

为验证SM4 密码算法扩展指令功能并对其资源开销以及运算性能加以评估,本文基于开源RISC-V处理器VexRiscv,使用SpinalHDL语言描述实现,并基于Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)进行实际验证与测试。本文对硬件资源开销以及加解密性能方面进行了相关的测试并给出分析。

4.1 硬件资源开销

为了评估硬件资源所需的开销,本文将不包含SM4 算法扩展指令与包含SM4 算法扩展指令的VexRiscv 处理器分别以100MHz 的时钟频率进行综合,硬件资源开销数据结果如表2 所示。对表2中综合结果LUΤs 的开销进行分析,在增加SM4 密码算法扩展指令后,处理器整体硬件资源开销仅增加59 个LUΤs,相比于不包含SM4 算法扩展指令时处理器整体硬件资源开销增加约1.60%。文献[15]中针对SM4算法使用多种硬件架构进行实现,本文选取其硬件资源开销最小的数据作为本文硬件资源开销评估的参考。通过扩展指令集的方式实现SM4 算法带来的硬件资源开销远低于基于硬件实现方式所需的硬件资源开销。

表2 基于Artix-7 FPGA 综合结果

4.2 性能表现

基于SM4算法的软件实现过程中,将需要调用多条基础指令进行运算的可重复过程使用单条扩展指令替代,则可以通过大幅减少指令条数实现对性能的提升。文献[7]中以字节为单位设计实现SM4算法扩展指令,实现了单次迭代过程指令调用数为6.5条;本文设计实现的SM4算法扩展指令,单条指令可完成对4 字节的运算过程,因此能够实现单次迭代过程所需指令数仅为3.5 条,相较于文献[7]进一步减少。

为进一步对性能表现加以评估,本文将SM4算法基于VexRiscv 处理器分别采用使用指令集以及不使用指令集进行软件实现,并通过在Xilinx Artix-7 FPGA(XC7A50T-1FTG256C)上实际测试得出数据结果见图4。由于SM4 算法存在密钥扩展部分的特性,在实现加解密过程中,对较长数据进行加密时,其总体加密性能将优于对短字节长度数据进行加密,且在字节长度较大时密钥扩展部分实现过程的时钟消耗占比极低,则总体吞吐率将趋近于单独实现SM4算法部分的运算性能。由此,本文分别对比不同长度(16 字节~16384 字节)的数据块进行加密计算。从图4 可以看出,本文设计的SM4算法扩展指令对比无扩展指令的软件实现,基于不同长度数据性能提升8.96倍~14.33倍,对于长数据块进行加解密运算时带来的性能提升程度更大,最大吞吐率可达81.82Mbit/s。

图4 SM4算法性能测试结果

5 结语

本文针对SM4 算法,基于开源RISC-V 指令集以及VexRiscv微处理器,提出了两条针对实现SM4密钥扩展算法以及加解密算法的扩展指令,完成了相应的硬件电路设计与实现,基于Xilinx Artix-7 FPGA进行了实际应用及测试。通过实际测试结果来看,本文设计实现的SM4 算法扩展指令,在低硬件资源开销的同时,与无扩展指令的实现方式相比,减少了算法实现过程中调用的指令数,提升了加解密运算性能,在100MHz 时钟频率下,对于长字节数据块加解密过程吞吐率提升至无扩展指令时的14.33 倍,达到81.82Mbit/s。未来我们将继续完善基于现有SM4扩展指令的优化工作,并尝试实现针对其他密码算法的扩展指令来更好地满足不同使用环境下对不同密码算法实现性能加速的需求。

猜你喜欢
密钥指令密码
幻中邂逅之金色密钥
幻中邂逅之金色密钥
一样,不一样
《单一形状固定循环指令G90车外圆仿真》教案设计
新机研制中总装装配指令策划研究
Android密钥库简析
谁泄露了密码
密码藏在何处
破译密码
夺命密码