参考文献:
- [Dae95] Daemen J .Cipher and hash function design strategies based on linear and differential cryptanalysis[J].Doctoral Dissertation K.u.leuven, 1995.
- [GPP11] Guo J, Peyrin T, Poschmann A. The PHOTON family of lightweight hash functions[C]//Advances in Cryptology–CRYPTO 2011: 31st Annual Cryptology Conference, Santa Barbara, CA, USA, August 14-18, 2011. Proceedings 31. Springer Berlin Heidelberg, 2011: 222-239.
- [DGH+23] Dobraunig C, Grassi L, Helminger L, et al. Pasta: A Case for Hybrid Homomorphic Encryption[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2023, 2023(3): 30-73.
文章目录
- HHE Benchmarking Framework
- Inefficiency of Z 2 \mathbb Z_2 Z2 Ciphers
- Efficient Cipher for HHE over F p \mathbb F_p Fp
- S-Box
- Linear Layer
 
- Pasta
[DGH+23] 给出了 HHE 的形式化定义,设计了一个通用的 HHE 测试框架,并评估了目前已有的 HHE 方案的执行效率。他们发现即使是很小的用例(use case)它们也都是不实用的。然后它们提出了 Pasta 方案,专门对 Leveled FHE 支持的 F p t \mathbb F_p^t Fpt 明文空间做了优化。对于 Leveled FHE,优化准则是最小化 SE 的乘法深度;对于 Pure FHE,优化准则应该修改为最小化 SE 的乘法数量。[DGH+23] 很早就在 eprint 上可用了,后续有多种 HHE 使用了 Pasta 的构造模块,例如 Rubato
HHE Benchmarking Framework
[DGH+23] 选择了如下的基准测试用例(Benchmarking a Generic Use Case),以反映真实世界中的 HHE 效率
- 三个仿射变换 x i ′ = M i ⋅ x i + b i x_i' = M_i \cdot x_i + b_i xi′=Mi⋅xi+bi,其中 x i , x i ′ , b i ∈ F p 200 x_i,x_i',b_i \in \mathbb F_p^{200} xi,xi′,bi∈Fp200 以及 M i ∈ F p 200 × 200 M_i \in \mathbb F_p^{200 \times 200} Mi∈Fp200×200,素数 p p p 的规模是 60 60 60 比特
- 给定某个(加密的)向量 x 0 x_0 x0,依次执行三个仿射变换,在它们之间插入了两个平方函数
- 这被视为是三层神经网络,使用的平方激活函数
[DGH+23] 使用 SEAL(明文空间 F p \mathbb F_p Fp)测试了:BFV 本身,对 F p \mathbb F_p Fp 优化的 Pasta,对 F 2 \mathbb F_2 F2 优化的 Agrasta,AES 加密,以及 LWE-Native 加密。基准测试的结果如下,

可以观察到:HE 需要大量的随机性,并且通信开销很大。LWE 对随机性的需要以及通信开销都大幅降低了,但依旧不算好。使用 Z 2 \mathbb Z_2 Z2 上的 SE 方案,由于 FHE 支持的明文空间是 Z p \mathbb Z_p Zp,布尔电路在这上面的深度很大,导致 Server 无法同态解密。[DGH+23] 所设计的 Pasta over F p \mathbb F_p Fp 做到了 Client 和 Server 之间的很好平衡。三种 HHE 在客户端的表现相似,但是在服务器上的差异巨大,主要就是因为 SE 是否设计在了 F p \mathbb F_p Fp 算术运算上,而非布尔电路。
考虑通信带宽的影响,Client 的时间开销为:

Inefficiency of Z 2 \mathbb Z_2 Z2 Ciphers
[DGH+23] 还展示了布尔电路上设计的 SE 应用到 HHE 时的低效。在这里,他们使用了很小的用例 r = M ⋅ x + b r=M \cdot x+b r=M⋅x+b,其中 r , x , b ∈ Z 65536 5 r,x,b \in \mathbb Z_{65536}^5 r,x,b∈Z655365 以及 M ∈ Z 65536 5 × 5 M \in \mathbb Z_{65536}^{5 \times 5} M∈Z655365×5,去执行完整的 HHE 计算流程。可以发现即使是这么小的用例,这些 SE 的效率也会非常的低。
[DGH+23] 测试了如下的 Ciphers(它们的设计细节请看原文),

在 SEAL 下的测试结果为:

他们把 SE 的解密称之为 decompressing the HHE ciphertext。在小用例的计算中,由于 SEAL 不支持 Z 2 \mathbb Z_2 Z2 上的打包,因此他们将单个 bit 加密在单个 BFV 密文的 coeff 常数项(好傻啊)
Efficient Cipher for HHE over F p \mathbb F_p Fp
在 Pasta 之前,已经存在了一些针对 F p \mathbb F_p Fp 而设计的 SE 方案,其中 2 12 < p < 2 60 2^{12}<p<2^{60} 212<p<260 是 SEAL 所支持的可打包的素数范围。
- Masta:它是把 Rasta 简单地从 Z 2 \mathbb Z_2 Z2 扩展到了 F p \mathbb F_p Fp 上,使用了 randomized linear layers 策略
- Hera:它被用于 RtF Framework,使用了 randomized key schedule 策略
SEAL 不支持自举,因此计算代价的度量应该首选为乘法深度,当然 ct-ct 甚至 pt-ct 乘法的数量也不可忽视。[DGH+23] 也遵循 Rasta 的设计,将它扩展到 F p \mathbb F_p Fp 上。为了降低乘法深度,采取的措施有:最小化轮数,低次数的 S-box(代价是更大的状态,但设计 packing-friendly cipher),平衡乘法深度和运算时间。
S-Box
[DGH+23] 考虑了多种 S-boxes 的计算代价和限制,
 
      
       
        
        
          χ 
         
        
       
         \chi 
        
       
     χ-S-box:原始的 Rasta 使用了 [Dae95] 的  
     
      
       
       
         χ 
        
       
      
        \chi 
       
      
    χ-transformation over  
     
      
       
        
        
          Z 
         
        
          2 
         
        
          t 
         
        
       
      
        \mathbb Z_2^t 
       
      
    Z2t 作为非线性层,但是它在一般的  
     
      
       
        
        
          F 
         
        
          p 
         
        
          t 
         
        
       
      
        \mathbb F_p^t 
       
      
    Fpt 中不再是一个置换。不过 Rasta 使用了随机化的线性层(已经抵御了统计攻击),因此它的非线性层只需要求逆的次数很高即可(抵御代数攻击)。定义
  
      
       
        
        
          [ 
         
        
          χ 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
         
         
           ] 
          
         
           i 
          
         
        
          = 
         
         
         
           x 
          
         
           i 
          
         
        
          + 
         
         
         
           x 
          
          
          
            i 
           
          
            + 
           
          
            2 
           
          
         
        
          ⋅ 
         
        
          ( 
         
        
          1 
         
        
          + 
         
         
         
           x 
          
          
          
            i 
           
          
            + 
           
          
            1 
           
          
         
        
          ) 
         
         
         
        
          ( 
         
         
         
           m 
          
         
           o 
          
         
           d 
          
         
         
        
          p 
         
        
          ) 
         
        
       
         [\chi(x)]_i = x_i+x_{i+2}\cdot(1+x_{i+1}) \pmod{p} 
        
       
     [χ(x)]i=xi+xi+2⋅(1+xi+1)(modp)
 其中的 indices 都是  
     
      
       
        
        
       
         ( 
        
        
        
          m 
         
        
          o 
         
        
          d 
         
        
        
       
         t 
        
       
         ) 
        
       
      
        \pmod{t} 
       
      
    (modt) 循环的。在 BFV 的打包技术下,上述运算只需要使用 2 次旋转和 1 次乘法(如果  
     
      
       
       
         t 
        
       
         ≠ 
        
       
         N 
        
       
      
        t \neq N 
       
      
    t=N,还需要使用 masking vectors 模拟)。
Cube S-box:假如  
     
      
       
       
         gcd 
        
       
          
        
       
         ( 
        
       
         p 
        
       
         − 
        
       
         1 
        
       
         , 
        
       
         3 
        
       
         ) 
        
       
         = 
        
       
         1 
        
       
      
        \gcd(p-1,3)=1 
       
      
    gcd(p−1,3)=1,那么存在  
     
      
       
        
        
          3 
         
         
         
           − 
          
         
           1 
          
         
        
       
         ∈ 
        
        
        
          F 
         
        
          p 
         
        
          ∗ 
         
        
       
      
        3^{-1} \in \mathbb F_p^* 
       
      
    3−1∈Fp∗,从而  
     
      
       
        
        
          x 
         
        
          3 
         
        
       
      
        x^3 
       
      
    x3 是双射。定义:
  
      
       
        
        
          [ 
         
        
          S 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
         
         
           ] 
          
         
           i 
          
         
        
          = 
         
         
         
           x 
          
         
           i 
          
         
           3 
          
         
        
       
         [S(x)]_i = x_i^3 
        
       
     [S(x)]i=xi3
 在打包技术下,它只需两次阿达玛乘法,不需要 Rotate 运算。
Feistel-Like S-Box(via a Quadratic Function):定义一个使用  
     
      
       
        
        
          x 
         
        
          2 
         
        
       
      
        x^2 
       
      
    x2 函数的 Feistel 网络,
  
      
       
        
        
          [ 
         
         
         
           S 
          
         
           ′ 
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
         
         
           ] 
          
         
           i 
          
         
        
          = 
         
         
         
           { 
          
          
           
            
             
              
               
               
                 x 
                
               
                 i 
                
               
              
                , 
               
              
             
            
            
             
              
             
            
            
             
              
              
                i 
               
              
                = 
               
              
                0 
               
              
             
            
           
           
            
             
              
               
               
                 x 
                
               
                 i 
                
               
              
                + 
               
               
               
                 x 
                
                
                
                  i 
                 
                
                  − 
                 
                
                  1 
                 
                
               
                 2 
                
               
              
                , 
               
              
             
            
            
             
              
             
            
            
             
             
               otherwise 
              
             
            
           
          
         
        
       
         [S'(x)]_i = \left\{\begin{aligned} x_i, && i=0\\ x_i + x_{i-1}^2, && \text{otherwise} \end{aligned}\right. 
        
       
     [S′(x)]i={xi,xi+xi−12,i=0otherwise
 使用  
     
      
       
       
         [ 
        
       
         0 
        
       
         , 
        
       
         1 
        
       
         , 
        
       
         1 
        
       
         , 
        
       
         ⋯ 
         
       
         ] 
        
       
      
        [0,1,1,\cdots] 
       
      
    [0,1,1,⋯] 作为 masking vector,容易实现它的 SIMD 运算。
Alternative Feistel-Like S-Box(via the  
     
      
       
       
         χ 
        
       
      
        \chi 
       
      
    χ-Function):定义一个使用  
     
      
       
       
         χ 
        
       
      
        \chi 
       
      
    χ 函数的 Feistel 网络,
  
      
       
        
        
          [ 
         
         
         
           S 
          
          
          
            ′ 
           
          
            ′ 
           
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
         
         
           ] 
          
         
           i 
          
         
        
          = 
         
         
         
           { 
          
          
           
            
             
              
               
               
                 x 
                
               
                 i 
                
               
              
                , 
               
              
             
            
            
             
              
             
            
            
             
              
              
                i 
               
              
                ∈ 
               
              
                { 
               
              
                0 
               
              
                , 
               
              
                1 
               
              
                } 
               
              
             
            
           
           
            
             
              
               
               
                 x 
                
               
                 i 
                
               
              
                + 
               
               
               
                 x 
                
                
                
                  i 
                 
                
                  − 
                 
                
                  1 
                 
                
               
              
                ⋅ 
               
               
               
                 x 
                
                
                
                  i 
                 
                
                  − 
                 
                
                  2 
                 
                
               
              
             
            
            
             
              
             
            
            
             
             
               otherwise 
              
             
            
           
          
         
        
       
         [S''(x)]_i = \left\{\begin{aligned} x_i, && i \in \{0,1\}\\ x_i + x_{i-1}\cdot x_{i-2} && \text{otherwise} \end{aligned}\right. 
        
       
     [S′′(x)]i={xi,xi+xi−1⋅xi−2i∈{0,1}otherwise
 使用  
     
      
       
       
         [ 
        
       
         0 
        
       
         , 
        
       
         0 
        
       
         , 
        
       
         1 
        
       
         , 
        
       
         1 
        
       
         , 
        
       
         ⋯ 
         
       
         ] 
        
       
      
        [0,0,1,1,\cdots] 
       
      
    [0,0,1,1,⋯] 作为 masking vector,也容易实现它的 SIMD 运算。
上述四种 S-boxes 的计算开销为:

综合考虑乘法深度以及 KS 的开销,最终 Pasta 选取 Feistel 作为 main S-box。但同时也使用了 Cube 作为补充,去提升 Cipher 的次数(从而抵御线性分析,降低状态规模)。
Linear Layer
[DGH+23] 使用的是随机化线性层的策略,但是  
     
      
       
        
        
          F 
         
        
          p 
         
        
       
      
        \mathbb F_p 
       
      
    Fp 上的矩阵可逆性的检查是昂贵的(在明文下生成随机矩阵,而非在同态下)。[DGH+23] 采用了 [GPP11] 提出的 sequential matrix 生成方式,直接随机生成一个必然可逆的矩阵。对于  
     
      
       
       
         d 
        
       
      
        d 
       
      
    d 阶矩阵,随机采样  
     
      
       
        
        
          α 
         
        
          1 
         
        
       
         , 
        
       
         ⋯ 
         
       
         , 
        
        
        
          α 
         
        
          d 
         
        
       
         ∈ 
        
        
        
          F 
         
        
          p 
         
        
       
         \ 
        
       
         { 
        
       
         0 
        
       
         } 
        
       
      
        \alpha_1,\cdots, \alpha_d \in \mathbb F_p\backslash\{0\} 
       
      
    α1,⋯,αd∈Fp\{0},首先构造
  
      
       
        
        
          A 
         
        
          = 
         
        
          S 
         
        
          e 
         
        
          r 
         
        
          i 
         
        
          a 
         
        
          l 
         
        
          ( 
         
         
         
           α 
          
         
           1 
          
         
        
          , 
         
        
          ⋯ 
          
        
          , 
         
         
         
           α 
          
         
           d 
          
         
        
          ) 
         
        
          : 
         
        
          = 
         
         
         
           [ 
          
          
           
            
             
             
               0 
              
             
            
            
             
             
               1 
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               ⋯ 
              
             
            
            
             
             
               0 
              
             
            
           
           
            
             
             
               0 
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               1 
              
             
            
            
             
             
               ⋯ 
              
             
            
            
             
             
               0 
              
             
            
           
           
            
             
              
              
                ⋮ 
               
               
                
               
              
             
            
            
             
              
             
            
            
             
              
             
            
            
             
             
               ⋱ 
              
             
            
            
             
              
              
                ⋮ 
               
               
                
               
              
             
            
           
           
            
             
             
               0 
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               ⋯ 
              
             
            
            
             
             
               1 
              
             
            
           
           
            
             
              
              
                α 
               
              
                1 
               
              
             
            
            
             
              
              
                α 
               
              
                2 
               
              
             
            
            
             
              
              
                α 
               
              
                3 
               
              
             
            
            
             
             
               ⋯ 
              
             
            
            
             
              
              
                α 
               
              
                d 
               
              
             
            
           
          
         
           ] 
          
         
        
          ∈ 
         
         
         
           F 
          
         
           p 
          
          
          
            d 
           
          
            × 
           
          
            d 
           
          
         
        
       
         A = Serial(\alpha_1,\cdots,\alpha_d) := \begin{bmatrix} 0 & 1 & 0 & \cdots & 0\\ 0 & 0 & 1 & \cdots & 0\\ \vdots & & & \ddots & \vdots\\ 0 & 0 & 0 & \cdots & 1\\ \alpha_1 & \alpha_2 & \alpha_3 & \cdots & \alpha_d \end{bmatrix} \in \mathbb F_p^{d \times d} 
        
       
     A=Serial(α1,⋯,αd):= 
              00⋮0α1100α2010α3⋯⋯⋱⋯⋯00⋮1αd 
              ∈Fpd×d
 然后计算  
     
      
       
       
         M 
        
       
         = 
        
        
        
          A 
         
        
          d 
         
        
       
      
        M = A^d 
       
      
    M=Ad 作为随机的可逆矩阵。由于  
     
      
       
       
         A 
        
       
      
        A 
       
      
    A 是具有特殊结构的稀疏矩阵,计算  
     
      
       
       
         M 
        
       
      
        M 
       
      
    M 只需要  
     
      
       
       
         d 
        
       
         ( 
        
       
         d 
        
       
         − 
        
       
         1 
        
       
         ) 
        
       
      
        d(d-1) 
       
      
    d(d−1) 次乘法以及  
     
      
       
       
         ( 
        
       
         d 
        
       
         − 
        
       
         1 
        
        
        
          ) 
         
        
          2 
         
        
       
      
        (d-1)^2 
       
      
    (d−1)2 次加法(怎么快速计算的?)。
如果采用的分圆环维度  
     
      
       
       
         N 
        
       
      
        N 
       
      
    N 是二的幂次,那么  
     
      
       
        
        
          Z 
         
         
         
           2 
          
         
           N 
          
         
        
          ∗ 
         
        
       
         = 
        
       
         { 
        
       
         1 
        
       
         , 
        
       
         3 
        
       
         , 
        
       
         ⋯ 
         
       
         , 
        
       
         2 
        
       
         N 
        
       
         − 
        
       
         1 
        
       
         } 
        
       
         = 
        
       
         ⟨ 
        
       
         − 
        
       
         1 
        
       
         , 
        
       
         3 
        
       
         ⟩ 
        
       
      
        \mathbb Z_{2N}^* = \{1,3,\cdots,2N-1\} = \langle-1,3\rangle 
       
      
    Z2N∗={1,3,⋯,2N−1}=⟨−1,3⟩,其中  
     
      
       
       
         o 
        
       
         r 
        
       
         d 
        
       
         ( 
        
       
         − 
        
       
         1 
        
       
         ) 
        
       
         = 
        
       
         2 
        
       
         , 
        
       
         o 
        
       
         r 
        
       
         d 
        
       
         ( 
        
       
         3 
        
       
         ) 
        
       
         = 
        
       
         N 
        
       
         / 
        
       
         2 
        
       
      
        ord(-1)=2, ord(3)=N/2 
       
      
    ord(−1)=2,ord(3)=N/2,因此明文槽组成了形状是  
     
      
       
        
        
          F 
         
        
          p 
         
         
         
           2 
          
         
           × 
          
         
           N 
          
         
           / 
          
         
           2 
          
         
        
       
      
        \mathbb F_p^{2 \times N/2} 
       
      
    Fp2×N/2 的立方。为了使得 babystep-giantstep optimized diagonal method 中使用的旋转操作的开销更小,[DGH+23] 使用了 Rotate1D 而非 Rotate,并行地执行两个  
     
      
       
       
         t 
        
       
         ∣ 
        
       
         ( 
        
       
         N 
        
       
         / 
        
       
         2 
        
       
         ) 
        
       
      
        t \mid (N/2) 
       
      
    t∣(N/2) 阶线性变换,然后再组合它们。
确切地,假设  
     
      
       
       
         x 
        
       
         = 
        
       
         [ 
        
        
        
          x 
         
        
          L 
         
        
       
         , 
        
        
        
          x 
         
        
          R 
         
        
       
         ] 
        
       
         ∈ 
        
        
        
          F 
         
        
          p 
         
         
         
           2 
          
         
           t 
          
         
        
       
      
        x = [x_L,x_R] \in \mathbb F_p^{2t} 
       
      
    x=[xL,xR]∈Fp2t,那么仿射层的运算如下:
  
      
       
        
         
         
           [ 
          
          
           
            
             
              
              
                2 
               
              
                I 
               
              
             
            
            
             
             
               I 
              
             
            
           
           
            
             
             
               I 
              
             
            
            
             
              
              
                2 
               
              
                I 
               
              
             
            
           
          
         
           ] 
          
         
        
          ⋅ 
         
         
         
           ( 
          
          
          
            [ 
           
           
            
             
              
               
               
                 M 
                
               
                 L 
                
               
              
             
             
              
              
                O 
               
              
             
            
            
             
              
              
                O 
               
              
             
             
              
               
               
                 M 
                
               
                 R 
                
               
              
             
            
           
          
            ] 
           
          
         
           ⋅ 
          
          
          
            [ 
           
           
            
             
              
               
               
                 x 
                
               
                 L 
                
               
              
             
            
            
             
              
               
               
                 x 
                
               
                 R 
                
               
              
             
            
           
          
            ] 
           
          
         
           + 
          
          
          
            [ 
           
           
            
             
              
               
               
                 c 
                
               
                 L 
                
               
              
             
            
            
             
              
               
               
                 c 
                
               
                 R 
                
               
              
             
            
           
          
            ] 
           
          
         
           ) 
          
         
        
       
         \begin{bmatrix} 2I & I\\ I & 2I \end{bmatrix} \cdot \left( \begin{bmatrix} M_L & O\\ O & M_R \end{bmatrix} \cdot \begin{bmatrix} x_L\\ x_R \end{bmatrix} + \begin{bmatrix} c_L\\ c_R \end{bmatrix} \right) 
        
       
     [2III2I]⋅([MLOOMR]⋅[xLxR]+[cLcR])
 这里的  
     
      
       
        
        
          M 
         
        
          L 
         
        
       
         , 
        
        
        
          M 
         
        
          R 
         
        
       
      
        M_L, M_R 
       
      
    ML,MR 都是  
     
      
       
       
         t 
        
       
      
        t 
       
      
    t 阶矩阵, 
     
      
       
       
         O 
        
       
      
        O 
       
      
    O 和  
     
      
       
       
         I 
        
       
      
        I 
       
      
    I 分别是零矩阵和单位阵。首先使用自同构  
     
      
       
        
        
          τ 
         
         
         
           3 
          
         
           i 
          
         
        
       
      
        \tau_{3^i} 
       
      
    τ3i 执行两个并行的 BSGS 矩阵乘法,然后再使用自同构  
     
      
       
        
        
          τ 
         
         
         
           − 
          
         
           1 
          
         
        
       
      
        \tau_{-1} 
       
      
    τ−1 实现这两个仿射变换的结果混合。
Pasta
现在我们描述 Pasta 方案。选择 t = t 1 ⋅ t 2 t=t_1 \cdot t_2 t=t1⋅t2 是两个大小接近的整数的乘积,选择满足 gcd  ( p − 1 , 3 ) = 1 \gcd(p-1,3)=1 gcd(p−1,3)=1 的一个 NTT 友好的大素数。它同时使用了 Feistel 和 Cube 两种 S-boxes,

对于第 i i i 个消息分组,使用 XOF 来产生随机化的仿射层(在明文下),对主密钥 K K K(在密文下)执行 AES-like 轮函数迭代(状态大小为 2 t 2t 2t),最后截断长度为 t t t 的密钥流,加到消息分组上。

经过不同攻击的分析,[DGH+23] 给出了推荐的参数集。用例为 Z 65536 5 × 5 \mathbb Z_{65536}^{5 \times 5} Z655365×5 上仿射变换,Pasta 的计算效率:




















