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

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



                 8.    Z[r+k] ← ((Z[r] ∧ m j ) << k) ∨ (Z[r+k] ∧ m j )
                 9.    Z[r] = t
                 10.   end
                 11. end
                  2.3   SIMD  指令集
                    SIMD  指令集是一种提升算法性能的重要技术, 其并行处理能力能够让处理器在同一时间处理多份数据, 被
                 广泛应用于对称密码和非对称密码的软件实现中. 表                  3  介绍了  x86  架构的  AVX2  指令集和  ARM  架构的  NEON
                 指令集, 其中   AVX2  指令集操作    256  比特长的寄存器, NEON    指令集操作    128  比特长的寄存器.

                                         表 3 x86  和  ARM  指令集中的指令以及对应关系

                                     指令简介                  AVX2指令              NEON指令
                                     数据加载              _mm256_loadu_si256       vld1q_u8
                                     数据存储              _mm256_storeu_si256      vst1q_u8
                                      逻辑与               _mm256_and_si256        vandq_u8
                                      逻辑或               _mm256_or_si256         vorrq_u8
                                     逻辑异或               _mm256_xor_si256        veorq_u8
                                  64比特逻辑左移              _mm256_slli_epi64     vqshlq_n_u64
                                  64比特逻辑右移              _mm256_srli_epi64     vrshrq_n_u64
                                 数据重排/4比特查表            _mm256_shuffle_epi8     vqtbl1q_u8
                                  64比特高位打包            _mm256_unpackhi_epi64    vzip2q_u64
                                  64比特低位打包            _mm256_unpacklo_epi64    vzip1q_u64
                                    128比特重排         _mm256_permute2x128_si256     -

                  3   灵活的  uBlock  算法比特切片优化方法          FBS-uBlock

                  3.1   算法轮函数结构分析
                    本文减少比特切片访存开销的核心思想是通过让每个寄存器表示多个                         uBlock  算法的比特位来减少寄存器的
                 使用. 使用  Biham  的比特切片方法优化      uBlock  算法时, 每个寄存器表示      1  个比特位, 占用的寄存器数量和        uBlock
                 算法的分组比特数相同. 本文尝试让每个寄存器表示                 uBlock  算法的  2  个、4  个、8  个和  16  个比特位, 从而使得占
                 用寄存器数量降低至之前的          1/2、1/4、1/8  和  1/16. 但一个寄存器表示多个比特位的方式会让数据中比特位与比
                 特位之间的联系变得更紧密, 因此会增加线性变换中不同比特位之间的运算开销. 本文针对                              uBlock  算法的结构,
                 充分考虑线性变换的结构特点, 精心设计了多种比特切片表示法, 在削减寄存器数量的同时尽量减少额外的运算
                 开销. 下面从算法迭代过程的数据结构、轮密钥加、S                 盒、线性变换     B  和线性变换    PL/PR  这些模块详细分析, 讨
                 论减少寄存器的可行性, 并说明本文是如何减少额外运算开销的.
                    uBlock  算法加密和解密的轮函数迭代分成了            X 0 和  X 1 左右两部分, 线性变换   B  是  X 0 和  X 1 相互的循环移位
                 与异或, 迭代最后一步的       PL  和  PR  置换分别对  X 0 和  X 1 进行. 因此, 本文将  X 0 和  X 1 这两部分占用的寄存器分别
                 考虑, 在减少寄存器占用时不再针对算法分组的整体, 而是针对                   X 0 和  X 1 这两部分.
                    uBlock  算法的轮密钥加模块是异或运算, 是对应比特位的模               2  加法, 不存在不同比特位之间的运算. 因此, 任
                 何比特切片表示法都不会对该模块的计算造成影响, 只需要预先把轮密钥的表示形式转变成和明文一致的表示形
                 式即可.
                    uBlock  算法的非线性变换由多个相同的          4  比特的  S  盒并置而成, 这意味着一个分组内的多个            S  盒可以同时
                 计算. 另外, 比特切片中的      S  盒需要通过逻辑门函数计算, 包含大量的不同比特位之间的复杂运算, 所以需要让输
                 入  S  盒的这  4  个比特位分散在不同寄存器之中, 否则会极大增加             S  盒计算过程的额外开销.
   430   431   432   433   434   435   436   437   438   439   440