分组密码uBlock算法快速软件实现
doi: 10.11887/j.cn.202406010
高莹 , 汪龙昕 , 田蕾 , 胡洋 , 张宇鹏 , 严宇 , 伍前红
北京航空航天大学网络空间安全学院,北京 100191
基金项目: 国家重点研发计划资助项目(2022YFB2701600) ; 国家自然科学基金资助项目(61932011,61932011,61972017) ; 北京市自然科学基金资助项目(M21033)
Fast software implementation of the block cipher uBlock algorithm
GAO Ying , WANG Longxin , TIAN Lei , HU Yang , ZHANG Yupeng , YAN Yu , WU Qianhong
School of Cyber Science and Technology, Beihang University, Beijing 100191 , China
摘要
为对国产分组密码算法uBlock进行软件优化,选择支持256 bit数据位宽的AVX2指令集,提高编译器自动优化等级,优化函数的调用过程,优化数据存储结构,综合使用高位并行、低延迟指令逻辑优化等方法实现单线程并行计算。通过使用这种有效的组合方法,uBlock-128/128算法、uBlock-128/256算法和uBlock-256/256算法单密钥短消息加密的速度较原代码分别提升269%、182%和49%。基于这些优化方法,uBlock-128/128、uBlock-128/256和uBlock-256/256三个算法版本均实现了单密钥场景与多密钥场景。
Abstract
To optimize the software implementation of the domestic block cipher uBlock algorithm, the AVX2 instruction set supporting 256 bit data width was implemented, the automatic optimization level of the compiler was increased, optimizing the calling process of functions, and the methods of data storage structure optimization, high-level parallelism and low latency instruction logic optimization were used in order to implement parallel computing under the single-thread condition. Using this efficient combination method, the speed of single key short message encryption of uBlock-128/128 algorithm, uBlock-128/256 algorithm and uBlock-256/256 algorithm are 269%, 182% and 49% higher than the original code. Based on these optimization methods,the implementation of single-key scenario and multi-key scenario are given for three algorithm versions of uBlock-128/128, uBlock-128/256 and uBlock-256/256.
2016年,我国发布《国家网络空间安全战略》,其中明确指出我国网络安全正遭遇前所未有的挑战,也进一步确立了我国网络空间安全体系的建设目标和战略任务,同时也明确了国产密码算法在我国建设安全性更加完备的网络空间时代的重要地位。2020年,美国政府相继发布《5G安全国家战略》《关键与新兴技术国家战略》等重要文件。2021年,欧盟公开了经过修改完善的网络安全相关文件——《欧盟数字十年的网络安全战略》[1]。由此可见,各国已经开始加紧研究,力求在网络空间中占据有利地位。与此同时,全球网络安全博弈频度上升,网络安全已成为全领域影响因素。
信息安全是网络空间安全领域的重要部分。在我国信息化进程加速的背景下,各行各业对信息处理速度和数据安全性的要求越来越高。而密码技术作为网络世界最基本、最核心的安全技术之一,在保证协议安全、通信安全、文件安全、实体认证、抗抵赖等方面都具有重要作用[2-4],其对国家网络安全的支撑作用也日益明显。因此,各国纷纷加紧密码技术的研究,并且制定政策对密码技术及加密产品进行出口管制[5]。其中,美国作为网络强国,掌握大量先进密码技术,向世界各国提供相关产品及服务,几近垄断。但2013年美国国家安全局旨在监视并窃取全球数据的“棱镜计划”被曝光,为世界各国敲响了警钟:拥有自主可控的技术才能从根本上保障国家信息安全[6]
随着我国商用密码技术的应用推广,针对安全性高、可扩展性好、适应性强、可满足多个行业领域应用需求的国产密码算法受到了广泛关注。围绕这些优秀的国产密码算法,一个研究方向是评估它们的安全性,而另一个方向则是研究它们在各种应用环境下的软件优化实现技术。密码算法需要很高的软件实现性能,与面向硬件的设计相比,软件实现具有更好的灵活性和更低的实现成本。
密码算法的软件实现评估主要分为对软件速度的测试和对存储空间的测试,在计算资源十分受限的设备上进行密码算法实现时需要评估存储空间。因此,分组密码的软件快速实现有两个研究方向:一是轻量级分组密码算法的多平台软件实现[7];二是对现有的典型分组密码算法进行快速软件实现,多见于对国外的高级加密标准(advanced encryption standard,AES)等被广泛应用的分组密码的优化实现[8-9],对于国内分组密码算法的优化工作多见于对我国商用密码SM系列密码算法中的分组密码算法SM4的优化实现。郎欢等[10]在2018年提出了利用x86下的单指令多数据流(single instruction multiple data,SIMD)指令集选取粗粒度并行策略对SM4算法进行软件优化实现,优化后在Intel Core i7-6700处理器上,相较于传统的查表方法性能提高了1.38倍。张笑从等[11]在2020年提出利用比特切片方法结合SIMD的高级矢量扩展2(advanced vector extension 2,AVX2)指令集对SM4算法进行软件优化,相较于已发表的查表优化方法,其性能提高了1.8倍。
分组密码软件实现方法目前主要有3种[12],即查表实现、切片实现和内部指令实现。查表实现是一种增大存储空间,通过将固定的计算结果进行存储,从而用寻址代替计算的一种很简单的实现技巧,同时容易受到时间攻击和cache攻击等侧信道攻击威胁。于1997年提出的比特切片技术最早用于提升数据加密标准(data encryption standard,DES)算法的软件实现性能[13],之后受到广泛重视并被用于很多分组密码算法的设计之中。比特切片技术的原理是通过模拟硬件的实现方式来进行软件实现,从而对算法本身的架构进行优化。内部指令实现方法多见于指令集优化。针对不同的中央处理器(central processing unit,CPU)和不同的算法,指令集优化的方式并不唯一。对常见的x86系列CPU而言,目前常用的指令集有SIMD技术的数据流单指令序列扩展(streaming SIMD extensions,SSE)/AVX指令集等。该项技术可用于在同一操作中并行处理多组数据,分为细粒度并行和粗粒度并行两种,在分组密码特定结构与工作模式下可显著提升运算效率。此外,研究者们将比特切片技术与SIMD技术结合对分组密码进行软件优化实现也取得了不错的效果。Rebeiro等[14]在2006年提出了结合比特切片和SSE指令集的AES快速实现,其在Intel Core2处理器上实现了使用135个时钟周期完成一次AES加密任务的运算速度。Grabher等[15]在2008年提出了一种基于比特切片技术和SIMD指令集的密码学指令集扩展,实现了比特切片技术和SIMD指令集两方优点的融合。
uBlock算法是吴文玲等[16]提出的一族国产分组密码算法,其分组长度和密钥长度分别支持128 bit和256 bit,根据不同分组长度和密钥长度共分为三种算法,记为uBlock-128/128、uBlock-128/256和uBlock-256/256。uBlock算法的整体设计实现了安全、效率和适应性的平衡,并且在差分分析、线性分析等多种密码分析下具有足够的安全冗余。同时算法适应各种软硬件平台,可以结合不同的软硬件条件进行高速、轻量化实现[17]
在uBlock算法公开代码[18]中,其使用了位宽为128 bit的SSE指令集进行软件实现。同时该文献提出若使用AVX2指令集,将有望进一步提升uBlock-256/256算法的加解密速度,展现其性能优势。由于uBlock分组密码算法是2019年新提出的算法,目前国内外尚未有公开发表的关于uBlock算法软件快速实现方法的研究成果。提高uBlock国产分组密码算法的软件实现性能,有利于推动我国密码算法产品的研发和应用、促进实现密码算法产品的自主可控。
1 uBlock算法结构
1.1 符号
本文使用的符号如表1所示。
1符号
Tab.1 Symbols
1.2 uBlock整体结构
uBlock是一族分组密码算法,包括加密算法、解密算法、密钥扩展算法三个模块。其中,加密算法和解密算法包含r轮迭代,密钥扩展算法用于由初始密钥K生成r+1个轮密钥。uBlock算法的分组长度和密钥长度分别支持128 bit和256 bit,记为uBlock-128/128、uBlock-128/256和uBlock-256/256,它们的迭代轮数r分别为16、24和24。
uBlock算法整体结构为代换-置换(substitution-permutation,SP)结构的一种细化结构——PX结构,全称为Pshufb-Xor,指代向量置换和异或运算指令,其整体结构如图1所示。其中,S盒为4 bit的非线性变换层,提供混淆作用,P表示转换过程。PX结构中选择分块32的循环移位,利用Feistel结构构造16×16的二元域最优扩散层[19]
1.3 加密算法
加密算法由r轮迭代变换组成,加密轮变换如图2所示。
在具体操作中,输入n bit明文X和轮密钥RK0RK1,···,RKr,输出n bit密文Y。首先将明文X分为X0X1两部分,而后进入轮函数。在轮函数内,轮密钥RKi首先被分为RK0iRK1i两部分,而后X0X1的值更新为其分别与轮密钥的两部分异或后再经过S盒运算的值。之后,X1的值更新为X0X1。此后X0X1的值需各经过两次更新,其值变为另一部分的循环左移4 bit、8 bit、8 bit、20 bit的值与自身值的异或结果,顺序交错执行。完成后,X0的值更新为X0X1。最后,X0X1的值分别更新为PLnX0)和PRnX1)。将上述轮函数过程循环r次,RKii的值取遍0到r-1中的所有整数,并将RKrX0X1拼接后的字串的异或结果输出。其形式化伪代码如算法1所示。
1PX整体结构
Fig.1PX overall structure
2加密轮变换
Fig.2Encrypted round transformation
其中基本模块定义如下:
1)SnSnn/8个相同的4 bit S盒并置而成,定义如下:
Sn:{0,1}4n/8{0,1}4n/8x0,x1,,x(n/8)-1sx0,sx1,,sx(n/8)-1
(1)
4 bit S盒如表2所示。
算法1 加密算法
Alg.1 Encryption algorithm
24 bit S盒(s
Tab.2 4 bit S-box (s)
2)PLnPRnPLnPRn都是m=n16个字节的向量置换,具体见表3
3PLnPRn
Tab.3 PLn and PRn
例如,PL128的表达式为:
PL128:{0, 1}88{0, 1}88
y0,y1,y2,,y6,y7z0,z1,z2,,z6,z7z0=y1,z1=y3,z2=y4,z3=y6z4=y0,z5=y2,z6=y7,z7=y5
(2)
1.4 解密算法
解密算法由r轮迭代变换组成,输入n bit密文Y和轮密钥RKrRKr-1,···,RK0,输出n bit明文X。解密算法具体步骤与算法1类似,其形式化伪代码如算法2所示,其中,Sn-1PLn-1PRn-1分别是SnPLnPRn的逆,S盒与向量置换过程的逆运算具体见表4表5
算法2 解密算法
Alg.2 Decryption algorithm
44 bit S盒的逆(s-1
Tab.4 Inverse of 4 bit S-box (s-1)
5PLn-1PRn-1
Tab.5 PLn-1 and PRn-1
1.5 密钥扩展算法
k bit密钥K放置在k bit寄存器,取寄存器的左n bit作为轮密钥RK0,然后对i = 1,2,···,r更新寄存器,并取寄存器的左n bit作为轮密钥RKi。首先将密钥K分为K0K1K2K3四个部分,然后将K0K1经过PKt运算并更新其值。之后将K0与轮常数RCi进行异或后经过S盒运算,再与K2进行异或,得到的结果用于更新K2。接下来,再将K1进行Tk运算,得到的结果与K3进行异或运算,结果用于更新K3。最后将四部分进行连接,输出密钥K。密钥扩展寄存器更新伪代码如算法3所示。
算法3 密钥扩展寄存器更新
Alg.3 Key expansion register update
其中,Skk/16个4 bit S盒的并置,Tk是对K1的每半字节2,有限域GF(24)的不可约多项式mx)=x4+x+1;RCi为32 bit轮常数,作用在K0的左32 bit。PKtt取1,2,3时有三种情况:PK1PK2PK3,其分别用于uBlock-128/128、uBlock-128/256和uBlock-256/256的密钥扩展算法。PK1是16个半字节的向量置换,PK2PK3都是32个半字节的向量置换,具体向量值见表6。轮常数RCi i = 1,2,···,24)的16进制值如表7所示。
6向量置换PKt
Tab.6 Vector permutation PKt
7轮常数RCi
Tab.7 Round constants RCi
2 设计与实现方案
本文的代码实现包括6个版本,即uBlock-128/128、uBlock-128/256和 uBlock-256/256三个uBlock版本和其各自的单密钥和多密钥版本。在此对单密钥和多密钥使用场景进行说明。
单密钥版本指用一个密钥对输入的四个分组进行加解密,在并行计算环境下,可以实现单线程下对四个分组的高效加解密运算;多密钥版本则支持使用多个密钥对输入的四个分组同时进行加解密。当选择的四个分组来源于不同的四个文件时,由于四组运算相互并行,输入输出之间互不干扰,此时对于每个分组来说是串行操作,可支持密码块链接方式(cipher block chaining mode,CBC)工作模式。
多密钥版本本质上是对单密钥版本的扩展,因此uBlock-128/128、uBlock-128/256、uBlock-256/256各自的单密钥和多密钥版本使用相同的优化方法。在本节中,只对单密钥版本的实现进行说明。
2.1 指令集替换
SIMD,即单指令多数据流,其构造目标是将所有数据向量化,易于批处理。较大的位宽和统一的向量化的操作使得SIMD指令集与大量数据的相同计算需求具有极高的相适性,较为标准的计算格式也使得SIMD指令集的相关函数计算效率更加优良,从而提升主机的数据处理速度[20]
相较于支持128位数据宽度的SSE指令集,AVX2将可操作位宽扩展至其两倍,达到256位。虽然目前Intel处理器中已经存在比AVX2可操作位宽更大、性能更优越的指令集,如AVX512指令集,但考虑到AVX512指令集在密码算法优化应用中普及率低,基于AVX512指令集的相关产品少,同时目前大量密码算法优化相关文献仍选择使用AVX2指令集进行优化工作,并将其优化结果作为性能对比的指标[21],因此本文选用AVX2指令集进行优化实现。
本文对uBlock-128/128、uBlock-128/256和uBlock-256/256均采用AVX2指令集来替换原代码的SSE指令集。由于AVX2指令集相较于SSE指令集的可操作位宽提升了一倍,故对于以128 bit分组作为输入的前两个uBlock版本而言,可实现单线程下一次性加解密两个分组;对于256 bit分组,可减少加解密过程中使用的寄存器数量。大大体现了uBlock算法对于AVX2指令集的契合程度。
2.2 数据存储结构的优化
permute系列指令起向量重排作用,其根据一个整形控制常量imm8规定分割后向量各部分重排的顺序。使用的函数决定对输入向量进行分割操作的粒度,最后将结果输出至目标向量dst内。例如在函数 _mm256_permute2x128_si256(m256i a,m256i b,const int imm8)内,控制常数imm8中的每2 bit一组的四个分组分别对应两输入向量的四个128 bit分组,倒序进行输出结果dst的构造,同时可以指定任意一个dst中的128 bit分组为全零向量,达到重排输入向量的目的。
注意到在算法1的步骤6与算法2的步骤8均为输入组自身两部分的异或运算。
原代码中使用的SSE指令集数据位宽为128 bit,为单线程加解密,无须进行额外permute操作。然而在AVX2系列指令集中,用于计算两个m256i变量异或的指令仅有_mm256_xor_si256(m256i a,m256i b),并且只能得到两输入变量的直接异或结果,无法进行自定义分组运算。
对于128 bit分组的版本,考虑到AVX2指令集操作均以256 bit为单位执行,并且若在多组运算并行的场景下将一个完整的明密文分组依照原次序存储至一个m256i数据结构中,则在处理后续并行分组内的组内异或运算时,必须使用较高延迟的permute系列指令来对两个变量进行两组临时重排,即在运算前进行一次重排,使其错开顺序,满足异或要求,运算完成后,再进行逆重排,恢复顺序排布,具体操作如下。
X0, X1, X0', X1'
permute X0, X0', X1, X1'
X0, X0', X0X1, X0'X1'
permute X0,X0X1,X0',X0'X1'
(3)
此操作发生在轮函数内,高延迟指令与大量循环形成叠加效应,造成严重降速。故在整体数据结构上,从密钥生成到加解密轮函数的数据处理过程中,保持“左左+右右”型存储结构,即可避免为异或操作而临时进行的permute操作。由于从始至终顺序统一,运算的正确性不受影响。
对于密钥生成函数,替换示例如式(4),对于加解密轮函数,替换示例如式(5)。
Subkey 1,l, Subke 1,r, Subke 2,l, Subkey 2,r Subkey 1,l, Subkey 2,l, Subkey 1,r, Subke 2,r
(4)
X0,X1,X0',X1'X0,X0',X1,X1'Y0,Y1,Y0',Y1'Y0,Y0',Y1,Y1'
(5)
所有中间计算完成后,利用一组permute操作来更正存储顺序,这样消除了在大量中间过程中使用高延迟permute系列指令所带来的降速。
在uBlock-256/256版本中,消息分组为256 bit,使用AVX2指令集时会出现组间元素相互运算的情况,故本优化方法仅适用于uBlock-128/128和uBlock-128/256版本。
2.3 低延迟指令构造与等价替换
本文对三个算法版本的代码均进行了部分低延迟指令等价替换。下面以uBlock-128/128为例具体说明替换原理。
在原代码中,8 bit分组内高4位为0,以便直接进行半字节S盒替换。因此需先将读入的128 bit分组通过增加高位0的方式“稀释”到两个m128i中。经过读入、移位以及通过异或初始工作向量con的方式添加高位0后,在原代码中使用了四个排序向量c1~c4来进行顺序调整。
优化工作是在数据存储结构改变的基础上使用低延迟指令进行替换,两版本代码片段如表8所示。
优化代码片段中的_mm256_unpacklo_epi8(m256i a,m256i b)和_mm256_ unpackhi_epi8(m256i a,m256i b)函数是针对两个输入向量ab的组内重排函数。unpacklo函数是将两变量lane左右两侧128 bit部分的两个低64位bit进行组合输出,而unpackhi函数是将两变量lane左右两侧128 bit部分的两个高64位bit进行组合输出。通过查找Intel®Intrinsics Guide[22],计算得到如上两代码片段的总延迟如表9所示。
8低延迟指令等价替换前后代码片段
Tab.8 Low latency instruction equivalent substitution before and after code snippet
9低延迟指令等价替换前后代码延迟
Tab.9 Low latency instruction equivalent substitution before and after code delay
可见优化后,该部分总延迟较优化前降低2/3。
2.4 S盒的优化实现
uBlock算法中的S盒查表操作是由n/8个相同的4 bit S盒并置完成(其中n为128 bit或256 bit的分组长度),故S盒的查表操作可在寄存器允许位宽的基础上使用并行进行优化。基于此思路,本文对三个版本代码的S盒查表操作均进行了优化。
利用AVX2指令集的256 bit数据位宽,可将128 bit分组使用一个寄存器进行存储,而256 bit分组则需分为两部分分别存储。通过将S盒使用一个寄存器单独存储,分组的每部分都可进行并行S盒替换,最后将结果输出至目标向量dst。具体使用的指令为AVX2的向量重排指令_mm256_shuffle_epi8(m256i a,m256i b)。在该函数中,当第一个输入的参数为S盒,第二个参数为输入向量时,输出即为依据S盒得到的输出结果。这样只需对分组的左右两部分各使用一条指令即完成一轮的S盒查表工作。
state1 = _mm256_shuffle_epi8 (S, state1 ) ; state2 = _mm256_shuffle_epi8 (S, state2 ) ;
2.5 扩散层的优化实现
2.5.1 向量置换部分
uBlock算法中向量置换P是将输入的256 bit向量以字节为单位分组,然后将分组之后的数据位置进行重新排列。
对于__m256i数据,将左右128 bit之间的间隔称为lane。在处理128 bit分组时,P置换并不会涉及跨lane的操作。而处理256 bit分组时,分组左半部分将存放在同一个寄存器的两个lane中,右半部分同理。故此时,P置换涉及跨越lane的操作。由于字节的数据位宽是4 bit的倍数,故类似于S盒置换的操作,同样可以使用_mm256_shuffle_epi8(___m256i a,___m256i b)指令对uBlock-256/256进行优化。但该指令将两个lane分开进行处理,不支持跨越lane的操作,因此相较128 bit向量的处理有些不同。
具体地,对于PL256构造出如下的控制掩码。
pl0=(4,5,14,15,16,17,26,27,6,7,12,13,18,19,24,25,2,3,8,9,30,31,20,21,28,29,22,23,10,11,0,1)
(6)
之后将数据分为四类:
1)原位于低128 bit,置换至低128 bit;
2)原位于低128 bit,置换至高128 bit;
3)原位于高128 bit,置换至低128 bit;
4)原位于高128 bit,置换至高128 bit。
其中,属于第1、4类的元素不需要跨越lane,后续运算将其放在一起处理,属于第2、3类的元素需要跨越lane,也将其放在一起处理。为了分辨出属于四种不同情况的元素,可利用重排函数_mm256_shuffle_epi8(__m256i a,__m256i b)的特点,构造如下选择向量进行不同类型元素的处理。
K0=(0×70,,0×7016,0×F0,,0×xF016)
(7)
K1=(0xF0,,0xF016,0x70,,0x7016)
(8)
其中,K0选择出不需要跨越lane的第1、4类,K1选择出需要跨越lane的第2、3类。对于第2、3类,需要将置换之前的向量先交换高低128 bit,然后再进行置换操作。将控制数置为0x4E可以实现高低128 bit的交换。
整体的256 bit向量置换伪代码如算法4所示。
算法4 256 bit向量置换
Alg.4 256 bit vector permutation
注意到其中加法的部分每次运算都是一样的,可以提前计算出来,故简化算法如算法5所示。
2.5.2 循环移位部分
三个版本代码中移位位数分别为4位、8位、20位,均为4的倍数。若按4位分组,则输入的每一组在循环移位后会对应到相应的输出组。故循环移位可通过_mm256_shuffle_epi8(m256i a,m256i b)实现,其第一个参数为循环移位前的分组,掩模可设置为元素对应输入前的位置,例如使一个元素循环左移四位的掩模A1如下,每轮四次的循环移位操作对应四个向量的四次重排。
_m256i A1 = _mm256_setr_epi8 (1,2,3,4,5,6,7,0,9,10,11,12,13,14,15,8,17,18,19,20,21,22,23,16,25,26,27,28,29,30,31,24)
(9)
算法5 简化后的256 bit向量置换
Alg.5 Simplified 256 bit vector permutation
2.5.3 异或部分
使用指令_mm256_xor_si256(m256i a,m256i b)快速完成32 B异或,并输出结果。
2.6 并行运算实现
uBlock算法中的所有操作均为半字节操作,故原代码中寄存器每8位只有低4位有值,高4位均为空值0而未被利用。在使用数据位宽加倍的AVX2指令集后,可继续利用高4位存放下一轮待处理的数据,以实现单线程下密钥的并行扩展及分组的并行加解密。三个版本代码均是如此。
2.6.1 并行密钥扩展
在进行密钥扩展时,在高位中放入下一个待扩展的密钥,以达到同时扩展的目的。需要指出的是,高4位的使用对xor函数、and函数以及普通的shuffle函数等操作均不会有影响。但由于uBlock算法半字节操作的特性,S盒操作和紧接着的Tk操作均会受到影响。因此在每轮变换中,只在S盒操作前将寄存器的当前值又重新分为由高位和低位组成的新的两组半字节数组。在Tk操作之后,再将高、低位数组合并,进行后续的其他运算。在每轮变换中,输入数据只需分开一次即可。另外,由于高位也需要参与到所有的运算中,代码中的常量RCi也需要有所改变,其高位应设置为与低位相同的值,例如:0x09 → 0x99。
2.6.2 并行加解密
在进行加解密时,在高位中放入后一个或两个分组。对于uBlock-128/128版本,优化后的代码可以同时加解密四个分组;对于uBlock-256/256版本,则可以同时加解密两个分组。而每轮所进行的操作只是少量增加,这样会使加解密性能得到极大提升。需要指出的是,由于涉及密钥的操作只有明密文和密钥的异或,因此只需要保证将明密文和其所对应的密钥放在相对应的位置即可。在进行S盒运算时依然需要经过先分开、分别查表、最后合并的过程,而其他运算不受影响。
经上述优化后,原先未被利用的高位0现可被利用,在uBlock-128/128、uBlock-128/256中可实现单线程四个分组的加解密运算,在uBlock-256/256中可实现单线程两个分组的加解密运算。
2.7 编译优化
2.7.1 针对编译器的优化方案
编译时,编译参数设置为:-Ofast-mfma-mavx2-funroll-loops-march=native,其可以使编译器在编译时根据CPU型号等情况进行较为完整的优化,提升整体运行速度。
2.7.2 针对函数调用的优化方案
在函数前使用inline内联方式进行加速。在基础实现中,循环内多次调用子函数,存在函数大量调用的问题。故可在函数前加上inline字段,使其成为内联函数,解决频繁调用导致大量消耗栈空间的问题,使程序速度得到明显提升[23-24]
3 实验及结果
3.1 实验环境和测试数据的选择
测试环境:Microsoft Windows 10 Professional Edition 20H2 Build 19042.1466。
CPU:AMD Ryzen 9 5900X @3.70 GHz。
程序运行内存:32 GB。
编译器:gcc(x86_64-win32-seh-rev0,Built by MinGW-W64 project)8.1.0。
系统测试方案:分别对uBlock-128/128、uBlock-128/256和uBlock-256/256进行测试。每个版本设置了在单/多密钥、短/长消息情景下的加/解密测试,故每个版本测试8轮(例如单密钥短消息加密测试为1轮),为保证测试结果的有效性,每轮测试进行10次后取平均数值。
测试使用数据量:短消息分组为128 bit或256 bit,循环加密1 000 000轮为一次测试。长消息分组为2 Mbit数据,循环加密1 024轮为一次测试,在普通加解密模式和CBC模式中使用。
3.2 测试结果
按照上述方案进行测试后,uBlock-128/128、uBlock-128/256和uBlock-256/256优化前后速度对比如图3图4图5所示。其中,AVX2平凡实现测试的代码只在原代码基础上进行了AVX2指令集替换,并未进行其他优化,以此来比较除指令集替换之外其他优化方法的效果。
3uBlock-128/128 速度对比图
Fig.3uBlock-128/128 speed comparison figure
4uBlock-128/256 速度对比图
Fig.4uBlock-128/256 speed comparison figure
5uBlock-256/256速度对比图
Fig.5uBlock-256/256 speed comparison figure
分析图表,可以发现:
1)在CBC四密钥加密模式下,uBlock-128/128、uBlock-128/256和uBlock-256/256三个算法版本运行速度较原代码分别提升143%、167%和47%,较AVX2平凡实现分别提升34%、37%和79%。
2)图3显示,在uBlock-128/128单密钥版本中,长消息加解密速度慢于短消息。针对这样的反常情况,进行了在不同电脑环境下的反复测试。结果表明,性能较好的电脑普遍更倾向于反常情况。这可能是由于在进行短消息加解密时,每轮使用的数据相同,存储位置未变,因此磁头无须移动;而进行长消息加解密时,每轮需要依次读取多个分组,每个分组存储位置不同,因此磁头需要持续移动。由于uBlock-128/128处理的数据量与另外两个版本相比而言更少,因此磁头的移动对速度的影响成为主导因素。而对于 uBlock-128/256和uBlock-256/256,由于密钥扩展处理的数据量更大,因此密钥扩展对速度的影响成为主导因素,故长消息加解密速度明显快于短消息。
3) 在uBlock-256/256中,AVX2平凡实现的速度较原代码慢。这是因为在AVX2平凡实现中未使用2.2节中改变输入顺序的优化方法,需要使用较多的permute系列指令来保证程序正确性,同时在未扩展高位的情况下无法实现两组并行。综合两者原因导致了uBlock-256/256 AVX2平凡实现的速度较慢。
4 结论
本文通过使用支持256 bit数据位宽的AVX2指令集,提高编译器自动优化等级,优化数据存储结构,综合使用高位并行、低延迟指令逻辑优化等方法实现了单线程并行计算,对国产分组密码uBlock算法的软件性能进行了优化。
在AMD Ryzen 9 5900X @ 3.70 GHz环境下进行性能测试,结果显示:
1)uBlock-128/128算法单密钥短消息加密速度达到7 205 Mbit/s,较原代码提升269%;四密钥短消息加密速度达到6 340 Mbit/s,较原代码提升225%。
2)uBlock-128/256算法单密钥短消息加密速度达到4 099 Mbit/s,较原代码提升182%;四密钥短消息加密速度达到3 422 Mbit/s,较原代码提升136%。
3)uBlock-256/256算法单密钥短消息加密速度达到3 182 Mbit/s,较原代码提升49%;四密钥短消息加密速度达到2 813 Mbit/s,较原代码提升32%。
优化后的算法在未来的工程实现中将具有广泛的硬件基础,同时作为国产密码满足了自主可控的需求。最后,对于三个版本的代码,均实现了单密钥与多密钥版本,适应不同的加解密场景。
1PX整体结构
Fig.1PX overall structure
2加密轮变换
Fig.2Encrypted round transformation
3uBlock-128/128 速度对比图
Fig.3uBlock-128/128 speed comparison figure
4uBlock-128/256 速度对比图
Fig.4uBlock-128/256 speed comparison figure
5uBlock-256/256速度对比图
Fig.5uBlock-256/256 speed comparison figure
1符号
24 bit S盒(s
3PLnPRn
44 bit S盒的逆(s-1
5PLn-1PRn-1
6向量置换PKt
7轮常数RCi
8低延迟指令等价替换前后代码片段
9低延迟指令等价替换前后代码延迟
王姗姗, 徐雷, 张曼君. 浅析网络安全发展趋势[J]. 通信世界,2022(2):22-24. WANG S S, XU L, ZHANG M J. Analysis on the development trend of network security[J]. Communications World,2022(2):22-24.(in Chinese)
QADIR A M, VAROL N. A review paper on cryptography[C]//Proceedings of the 7th International Symposium on Digital Forensics and Security(ISDFS),2019.
SAINI N, MANDAL S. Review paper on cryptography[J]. International Journal of Research,2015,2(5):45-49.
RANA M, MAMUN Q, ISLAM R. Lightweight cryptography in IoT networks:a survey[J]. Future Generation Computer Systems,2022,129:77-89.
仲利波, 赵婧琳. 美国密码技术的出口管制法律制度研究[J]. 信息安全研究,2018,4(3):211-218. ZHONG L B, ZHAO J L. The evolution and enlightenment of US encryption export controls legal system[J]. Journal of Information Security Research,2018,4(3):211-218.(in Chinese)
姗姗. 使用国产密码技术是应对“棱镜”首选[J]. 计算机与网络,2013,39(21):6-7. SHAN S. Using domestic cryptographic technology is the first choice to deal with“prism”[J]. Computer & Network,2013,39(21):6-7.(in Chinese)
公丽丽, 张文涛, 包珍珍, 等. 轻量级分组密码RECTANGLE在X86和X64平台的软件实现评估[J]. 中国科学院大学学报,2015,32(6):816-824. GONG L L, ZHANG W T, BAO Z Z,et al. Evaluation of software implementation of lightweight block cipher RECTANGLE on X86 and X64 platforms[J]. Journal of University of Chinese Academy of Sciences,2015,32(6):816-824.(in Chinese)
WEI M M, YANG G Q, KONG F Y. Software implementation and comparison of ZUC-256, SNOW-V,and AES-256 on RISC-V platform[C]//Proceedings of IEEE International Conference on Information Communication and Software Engineering(ICICSE),2021.
SUO S L, CUI C, JIAN G Y,et al. Implementation of the high-speed SM4 cryptographic algorithm based on random pseudo rounds[C]//Proceedings of IEEE International Conference on Information Technology, Big Data and Artificial Intelligence(ICIBA),2020.
郎欢, 张蕾, 吴文玲. SM4的快速软件实现技术[J]. 中国科学院大学学报,2018,35(2):180-187. LANG H, ZHANG L, WU W L. Fast software implementation of SM4[J]. Journal of University of Chinese Academy of Sciences,2018,35(2):180-187.(in Chinese)
张笑从, 郭华, 张习勇, 等. SM4算法快速软件实现[J]. 密码学报,2020,7(6):799-811. ZHANG X C, GUO H, ZHANG X Y,et al. Fast software implementation of SM4[J]. Journal of Cryptologic Research,2020,7(6):799-811.(in Chinese)
DIXIT P, ZALKE J, ADMANE S. Speed optimization of AES algorithm with hardware-software co-design[C]//Proceedings of the 2nd International Conference for Convergence in Technology,2017
BIHAM E. A fast new DES implementation in software[C]//Proceedings of the 4th International Workshop on Fast Software Encryption,1997.
REBEIRO C, SELVAKUMAR D, DEVI A S L. Bitslice implementation of AES[C]//Proceedings of the 5th Cryptology and Network Security International Conference,2006.
GRABHER P, GROSCHDL J, PAGE D. Light-weight instruction set extensions for bit-sliced cryptography[C]//Proceedings of the 10th International Workshop on Cryptographic Hardware and Embedded Systems,2008.
吴文玲, 张蕾, 郑雅菲, 等. 分组密码uBlock[J]. 密码学报,2019,6(6):690-703. WU W L, ZHANG L, ZHENG Y F,et al. The block cipher uBlock[J]. Journal of Cryptologic Research,2019,6(6):690-703.(in Chinese)
吴文玲. 分组密码专刊序言(中英文)[J]. 密码学报,2019,6(6):687-689. WU W L. Preface of special issue on block cipher[J]. Journal of Cryptologic Research,2019,6(6):687-689.(in Chinese)
吴文玲, 张蕾, 郑雅菲, 等. 分组密码uBlock详细设计[EB/OL].(2019-02-01)[2022-03-02].https://sfjs.cacrnet.org.cn/site/content/387.html. WU W L, ZHANG L, ZHENG Y F,et al. Detailed design of uBlock block cipher[EB/OL].(2019-02-01)[2022-03-02].https://sfjs.cacrnet.org.cn/site/content/387.html.(in Chinese)
GUO Z Y, WU W L, GAO S. Constructing lightweight optimal diffusion primitives with Feistel structure[C]//Proceedings of the 22nd International Conference on Selected Areas in Cryptography,2015.
AMIRI H, SHAHBAHRAMI A. SIMD programming using Intel vector extensions[J]. Journal of Parallel and Distributed Computing,2020,135:83-100.
杨昊, 刘哲, 黄军浩, 等. AKCN-MLWE算法AVX2高效实现[J]. 计算机学报,2021,44(12):2560-2572. YANG H, LIU Z, HUANG J H,et al. High-speed AVX2 implementation of AKCN-MLWE[J]. Chinese Journal of Computers,2021,44(12):2560-2572.(in Chinese)
Intel Corporation. Intel® intrinsics guide v3.6.7[EB/OL].(2023-12-07)[2022-03-02].https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html.
ALLEN R, JOHNSON S. Compiling C for vectorization,parallelization,and inline expansion[J]. ACM SIGPLAN Notices,1988,23(7):241-249.
杨光宇, 高晓蓉, 王黎, 等. 基于TI C6000系列DSP的C/C++程序优化技术[J]. 现代电子技术,2009,32(8):56-59. YANG G Y, GAO X R, WANG L,et al. Technology of C/C++ program optimization based on TI C6000 DSP[J]. Modern Electronics Technique,2009,32(8):56-59.(in Chinese)