Page 439 - 《软件学报》2025年第10期
P. 439

4836                                                      软件学报  2025  年第  36  卷第  10  期



                                                      表 4 符号定义

                                      符号                       符号解释
                                       X                    uBlock算法的数据
                                       n             数据X的比特长度, 代表X是n比特数据
                                       X  i                 第i组输入的数据
                                       X[j]                  数据X的第j比特
                                       r       寄存器缩减率, 代表将寄存器占用个数减少到原先的1/r
                                                                         0   1    k–1
                                               数据第i比特的集合, 长度n/(2r), b[i] = X [i] X [i] … X [i],
                                       b[i]
                                                               k=n/(2r)

                    图  6  中矩阵共  n/2  列, 但并不代表只适合    n/2  比特长度的寄存器. 该切片表示法可以通过水平拼接矩阵的方式
                 拓展到任意比特长度的寄存器中, 处理的数据量也等比例翻倍. 处理器的                      SIMD  指令集支持并行的向量运算, 拼接
                 后能够更好地发挥处理器的并行能力.
                  3.3   非线性  S  盒表达式
                    uBlock  算法设计文档中的     S  盒逻辑函数需要     8  个硬件逻辑门, 但在比特切片软件实现中, 处理器没有提供或
                 非、与非等复合逻辑门的逻辑运算指令, 需要把或非门拆分成或门和非门这两步运算, 所以在软件比特切片中,
                 图  2  的逻辑函数需要耗费     14  条逻辑运算指令, 比特切片逻辑门复杂度为            14.
                    为了降低    S  盒的计算开销, 本文采用       Lighter 工具  [15] 搜索比特切片逻辑门复杂度更低的         S  盒逻辑表达式.
                 Lighter 工具可以指定搜索时使用的逻辑门, 还能够设置各逻辑门的开销权重. 在                     x86  架构的  AVX2  指令集中, 支
                 持的逻辑运算是      and、or、xor、andn、not, 开销相同; 在   ARM  架构的   NEON  指令集中, 支持的逻辑运算是         and、
                 or、xor、orn、not, 开销相同. 因此, 本文分别针对       x86  架构和  ARM  架构这两个处理器平台架构进行           S  盒逻辑函
                 数的搜索与化简, 限制最终的逻辑函数仅能使用特定处理器平台支持的逻辑运算, 以减少比特切片门复杂度为目
                 标搜索适合比特切片实现的          uBlock  算法  S  盒逻辑函数.
                    表  5  是  Lighter 工具搜索的结果, 图  7  是对应的逻辑函数. 根据搜索结果, 经过        Lighter 工具优化后的   S  盒比特
                 切片门复杂度为      9, S  盒的逆也为  9. 并且搜索得到的逻辑函数不包含           andn  或  orn  逻辑运算, 这意味着同样的表达
                 式可以同时用于      x86  和  ARM  架构两个平台.


                                               表 5 比特切片逻辑门复杂度 (个)

                                      模块         设计文档         x86-AVX2     ARM-NEON
                                       s(x)        14            9             9
                                       −1
                                      s (x)        -             9             9

                    图  8  是  uBlock  算法  S  盒与逆  S  盒的实现方式, 式中对  4  比特的  X  执行多次逻辑运算来更新每个比特位的值,
                 执行完毕后的     X  是算法  S  盒或逆  S  盒的输出, 计算过程只需要使用       1  个额外的临时变量.
                  4   具体实现

                    本节主要介绍如何利用处理器的            SIMD  指令集实现本文提出的        FBS-uBlock, 依次介绍数据编排、轮密钥加、
                 非线性   S  盒、线性变换   B、线性变换     PL  与  PR  这  5  部分的实现方法, 并理论分析需要的运算指令条数.
                  4.1   实现过程
                    数据编排指将原始输入数据转变成适合比特切片运算的数据的过程, 数据编排的逆过程称为数据逆编排. 本
                 文的数据编排和数据逆编排算法在使用              AVX2  指令集实现时的指令开销都是          2n/r+8n/r×log 2 [n/(2r)] 条, 包括数据
                 打包和数据切片两个子算法. 在数据打包算法中, 输入的                 n  比特数据原本位于一个寄存器中, 需要拆分成高              n/2  比
                 特和低   n/2  比特, 并分别统一放在两个不同的寄存器中. 在数据切片算法中, 采用第                  2.2  节提到的数据转置算法, 完
   434   435   436   437   438   439   440   441   442   443   444