参考文献:
- [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology--ASIACRYPT 2021: 27th International Conference on the Theory and Application of Cryptology and Information Security, Singapore, December 6--10, 2021, Proceedings, Part III 27. Springer International Publishing, 2021: 670-699.
- [LHH+21] Lu W, Huang Z, Hong C, et al. PEGASUS: bridging polynomial and non-polynomial evaluations in homomorphic encryption[C]//2021 IEEE Symposium on Security and Privacy (S&P). IEEE, 2021: 1057-1073.
- [LMP22] Liu Z, Micciancio D, Polyakov Y. Large-precision homomorphic sign evaluation using FHEW/TFHE bootstrapping[C]//International Conference on the Theory and Application of Cryptology and Information Security. Cham: Springer Nature Switzerland, 2022: 130-160.
- [KS23] Kluczniak K, Schild L. FDFB: Full Domain Functional Bootstrapping Towards Practical Fully Homomorphic Encryption[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2023: 501-537.
- 消除 TFHE 的限制:WoP-GenPBS-CSDN博客
- Large-Precision Sign using PBS-CSDN博客
文章目录
- Review
- FDFB
-
- Symbol
- [ACC Builder](#ACC Builder)
- [Full Domain PBS](#Full Domain PBS)
- Application
- Preformance
Review
在原始的 PBS 中,由于二的幂次分圆环是一个反循环卷积环,这导致 LUT 必须是反循环函数。除了单比特的一元运算,多比特的任意函数 并不能仅通过反循环函数以及仿射变换来实现。为了计算任意的函数,需要一个 Padding Bit 在 MSB 位置,这不仅导致明文空间缩小,还使得仿射变换之后必须执行 PBS 清理掉 Padding Bit,从而可以继续下一次仿射变换。
[CLOT21] 提出了 WoP-PBS,它使用 BV-like 同态乘法 。给定 m m m 的 LWE 密文(MSB 编码),令 f f f 是任意函数。
- 第一个版本:首先利用 Module-Raise 强行提升 1 1 1 比特模数 ,然后对消息 β ∥ m \beta\|m β∥m 自举获得带符号的函数值 ( − 1 ) β ⋅ f ( m ) (-1)^\beta \cdot f(m) (−1)β⋅f(m),其中 β \beta β 是 Q Q Q-overflow 的最低比特(随机的)。接着对消息 β ∥ m \beta\|m β∥m 再次自举获得符号本身 ( − 1 ) β (-1)^\beta (−1)β,两者做 LWE 同态相乘得到 f ( m ) f(m) f(m) 结果。共计 2 次 PBS,但是 LUT 规模扩大一倍。
- 第二个版本:切分原始消息为 m = β ∥ m ′ m=\beta\|m' m=β∥m′,然后把函数 f ( m ) f(m) f(m) 划分为两个子函数 f ( 0 ∥ m ′ ) f(0\|m') f(0∥m′) 以及 f ( 1 ∥ m ′ ) f(1\|m') f(1∥m′),它们的 LUT 大小都是原始 LUT 大小的一半,因此可以占用反循环 PBS 的一半空间来实现。接着,再一次 PBS 获得 β \beta β 的值,使用 LWE 同态乘法来构建 CMux Gate 挑选 正确的 f ( β ∥ m ′ ) f(\beta\|m') f(β∥m′) 结果。共计 3 次 PBS,保持 LUT 规模不变。
[LMP22] 提出了 Homomorphic Floor Function,它是通过迭代执行 PBS 算法 。给定高精度 m m m 的 LWE 密文(MSB 编码),提取它的符号。
- 第一个版本:使用 Module-Down 截取出 m m m 的一些低位(MSB 编码的 LWE 密文),接着做 PBS 提取出它的 MSB 从原始密文中减掉 ,再次截取低位就得到了 MSB 为零的 LWE 密文,从而做 PBS 提取出这些比特并从原始密文中减掉 ,这就消除了 m m m 最低的一些比特位。共计 2 次 PBS,但是要求噪声的规模小于 Δ / 4 \Delta/4 Δ/4 保证正确性。
- 第二个版本:由于 [ − 1 , 0 ∥ 1 , 0 ] [-1,0\|1,0] [−1,0∥1,0] 是反循环函数,使用它可以将 [ 0 b 00 , 0 b 01 , 0 b 10 , 0 b 11 ] [0b00,0b01,0b10,0b11] [0b00,0b01,0b10,0b11] 转变为 [ 0 b 11 , 0 b 01 , 0 b 11 , 0 b 11 ] [0b11,0b01,0b11,0b11] [0b11,0b01,0b11,0b11],于是容易将第二高的比特清理掉 。现在我们在截取后的消息的 MSB 和 LSB 之间构造了一个零的沟壑,我们使用第一个版本的技术来消除这些低位比特。共计 3 次 PBS,噪声的仅需小于 Δ / 2 \Delta/2 Δ/2 即可。
- PBS of Arbitrary Function:也是首先利用 Module-Raise 强行提升 1 1 1 比特模数 ,但是对消息 β ∥ m \beta\|m β∥m 先自举得到 β \beta β 并减掉 ,接着再对 0 ∥ m 0\|m 0∥m 自举得到 f ( m ) f(m) f(m) 的结果。共计 2 次 PBS,但是 LUT 规模扩大一倍。
[KS23] 使用了类似于 [CLOT21] 第二个版本的算法。既不是使用 BV-like 同态乘法(张量积 ,噪声增长快),也不是使用 [CGGI17] 的 OBDD 自动机(GSW 外积 ,需要电路自举)。他们首先使用 PBS 提取符号位,然后根据符号位从两个初始 ACC 中选择一个,再对选出的 ACC 执行自举 获得正确结果。共计 2 次 PBS(为了降低噪声,使用了 Decompose,次数会更多,但是用 multi-output PBS 可以一起做),并且保持 LUT 规模不变。
FDFB
Symbol
[KS23] 定义的一些记号:
- 噪声的方差上界 B B B,MLWE 矩阵维度 n n n,分圆环维度 N N N,模数 q q q
- Base L L L,分解长度 l = ⌈ log L q ⌉ l = \lceil\log_L{q}\rceil l=⌈logLq⌉,Gadget 向量 g l , L = [ L i − 1 ] i = 1 L ∈ N l g_{l,L}=[L^{i-1}]{i=1}^L \in \mathbb N^{l} gl,L=[Li−1]i=1L∈Nl,Gadget 矩阵 G l , L , k = I k ⊗ g l , L ∈ N k l × k G{l,L,k} = I_k \otimes g_{l,L} \in \mathbb N^{kl \times k} Gl,L,k=Ik⊗gl,L∈Nkl×k
- GLWE 密文, G L W E B , n , N , q ( s , m ) = ( b = a T s + m + e , a ) ∈ R N , q n + 1 GLWE_{B,n,N,q}(s,m) = (b=a^Ts+m+e,a) \in \mathcal R_{N,q}^{n+1} GLWEB,n,N,q(s,m)=(b=aTs+m+e,a)∈RN,qn+1
- LWE 密文, G L W E B , n , 1 , q ( s , m ) ∈ Z q n + 1 GLWE_{B,n,1,q}(s,m) \in \mathbb Z_{q}^{n+1} GLWEB,n,1,q(s,m)∈Zqn+1
- RLWE 密文, G L W E B , 1 , N , q ( s , m ) ∈ R N , q 2 GLWE_{B,1,N,q}(s,m) \in \mathcal R_{N,q}^{2} GLWEB,1,N,q(s,m)∈RN,q2
- GGSW 密文, G G S W B , n , N , q ( s , m ) = A + m G l , L , n + 1 ∈ R N , q ( n + 1 ) l × ( n + 1 ) GGSW_{B,n,N,q}(s,m) = A+mG_{l,L,n+1} \in \mathcal R_{N,q}^{(n+1)l \times (n+1)} GGSWB,n,N,q(s,m)=A+mGl,L,n+1∈RN,q(n+1)l×(n+1)
- GSW 密文, G G S W B , n , 1 , q ( s , m ) ∈ Z q ( n + 1 ) l × ( n + 1 ) GGSW_{B,n,1,q}(s,m) \in \mathbb Z_{q}^{(n+1)l \times (n+1)} GGSWB,n,1,q(s,m)∈Zq(n+1)l×(n+1)
- RGSW 密文, G G S W B , 1 , N , q ( s , m ) ∈ R N , q 2 l × 2 GGSW_{B,1,N,q}(s,m) \in \mathcal R_{N,q}^{2l \times 2} GGSWB,1,N,q(s,m)∈RN,q2l×2
- 缩放因子 Δ q , t = ⌊ q / t ⌉ \Delta_{q,t} = \lfloor q/t \rceil Δq,t=⌊q/t⌉,舍入函数 ⌊ a ⌉ t q = ⌊ t / q ⋅ ( Δ q , t ⋅ a ) ⌉ \lfloor a \rceil^{q}{t} = \lfloor t/q \cdot (\Delta{q,t} \cdot a) \rceil ⌊a⌉tq=⌊t/q⋅(Δq,t⋅a)⌉
此外 [KS23] 回顾了各种同态运算的噪声增长,略。
ACC Builder
[KS23] 利用 Public 版本的 CMux Gate 构建了一个 ACC Builder:使用控制位 m ∈ { 0 , 1 } m \in \{0,1\} m∈{0,1} 的密文,挑选两个明文多项式 p 0 , p 1 ∈ R N , q p_0,p_1 \in \mathcal R_{N,q} p0,p1∈RN,q。为了控制噪声增长,他们使用了数字分解技术,用 GLWE 加密控制位的各个 power-of- L L L,通过线性同态 来计算出 ( 1 − m ) ⋅ p 0 + m ⋅ p 1 ∈ R N , q (1-m)\cdot p_0+m\cdot p_1 \in \mathcal R_{N,q} (1−m)⋅p0+m⋅p1∈RN,q,
它们的正确性以及噪声增长:
Full Domain PBS
[KS23] 采用了 GINX/TFHE 自举策略,以及 [MP21] 的私钥分解技术。给定 LWE 私钥 s ∈ Z q n s \in \mathbb Z_q^n s∈Zqn,根据它的分布来选择集合 u ⃗ ∈ Z u \vec u \in \mathbb Z^u u ∈Zu,使得 s i = ∑ j x i j u j s_i=\sum_j x_{ij} u_{j} si=∑jxijuj,其中 x ⃗ i ∈ B u \vec x_i \in \mathbb B^u x i∈Bu 是分量 s i s_i si 的组合系数。盲旋转的时候,使用 R G S W ( x i j ) RGSW(x_{ij}) RGSW(xij) 作为 BSK,控制 CMux Gate 选择 A C C ACC ACC 或者 X a u j ⋅ A C C X^{au_j}\cdot ACC Xauj⋅ACC。我们将这个过程记为 B l i n d R o t a t e ( B S K , A C C , L W E , u ) BlindRotate(BSK,ACC,LWE,u) BlindRotate(BSK,ACC,LWE,u)
[KS23] 的 Full Domain PBS 的具体流程是:
- 输入 c t = L W E ( m ) ct=LWE(m) ct=LWE(m) 以及任意函数 f : Z t → Z Q f:\mathbb Z_t \to \mathbb Z_Q f:Zt→ZQ
- 将函数 f ∈ Z Q t f \in \mathbb Z_Q^{t} f∈ZQt(函数就是向量)划分为两个子函数 f 0 ∥ f 1 f_0\|f_1 f0∥f1,构造它们的冗余 LUT 多项式 P 0 , P 1 P_0,P_1 P0,P1
- 对密文 c t ct ct 做 PBS,计算它的符号位的 LWE 密文,这里生成了 power-of- L L L 来控制 PubMux 的噪声增长
- 利用 PubMux 选择性地构造出 P 0 P_0 P0 或者 P 1 P_1 P1 对应的初始 ACC
- 再次对密文 c t ct ct 做 PBS,计算出 f ( m ) f(m) f(m) 的正确结果
- 密钥切换、模切换,输出合适的 LWE 密文
与 [CLOT21] 的区别是:这里使用 PubMux 来挑选一个 ACC 的初始值 (弱线性同态 + 数字分解),而他们则使用 LWE-Mul 来挑选两个 ACC 的最终值(张量积 + 秘钥切换)。
我们根据任意函数 f f f 的冗余版本 F = F 0 ∥ F 1 ∈ Z Q 2 N F=F_0\|F_1 \in \mathbb Z_Q^{2N} F=F0∥F1∈ZQ2N,构造两个反循环 LUT 的多项式。根据 Blind Rotation 的要求, A C C ⋅ X m ACC \cdot X^{m} ACC⋅Xm 的常数项是 F ( m ) F(m) F(m),
- 对于区间 [ 0 , N − 1 ] [0,N-1] [0,N−1] 的子函数 F 0 F_0 F0,构造多项式 P 0 P_0 P0,
- 对于 m = 0 m=0 m=0,需要 F [ 0 ] ⋅ X − 0 = F [ 0 ] F[0]\cdot X^{-0} = F[0] F[0]⋅X−0=F[0],即 P 0 [ m ] = F [ 0 ] P_0[m] = F[0] P0[m]=F[0]
- 对于 m ∈ [ 1 , N − 1 ] m \in [1,N-1] m∈[1,N−1],需要 F [ m ] ⋅ X − m = − F [ m ] ⋅ X N − m F[m]\cdot X^{-m} = -F[m] \cdot X^{N-m} F[m]⋅X−m=−F[m]⋅XN−m,即 P 0 [ N − m ] = − F [ m ] P_0[N-m] = -F[m] P0[N−m]=−F[m]
- 对于区间 [ N , 2 N − 1 ] [N,2N-1] [N,2N−1] 的子函数 F 1 F_1 F1,构造多项式 P 1 P_1 P1,
- 对于 m = N m=N m=N,需要 F [ N ] ⋅ X − N = − F [ N ] F[N]\cdot X^{-N} = -F[N] F[N]⋅X−N=−F[N],即 P 1 [ 0 ] = − F [ N ] P_1[0]=-F[N] P1[0]=−F[N]
- 对于 m ∈ [ N + 1 , 2 N − 1 ] m \in [N+1,2N-1] m∈[N+1,2N−1],需要 F [ m ] ⋅ X − m = F [ m ] ⋅ X 2 N − m F[m] \cdot X^{-m} = F[m] \cdot X^{2N-m} F[m]⋅X−m=F[m]⋅X2N−m,即 P 1 [ 2 N − m ] = F [ m ] P_1[2N-m] = F[m] P1[2N−m]=F[m]
如图所示:
在上述算法中,为了 PubMux 的噪声控制,[KS23] 多次调用 PBS 来生成 power-of- L L L 的各个 LWE 密文。是否可以减少自举调用次数?
- 注意到它们都是对同一个密文 c t N ct_N ctN 的自举,我们可以使用 Multi-output PBS,先初始化 ACC 为符号函数(取值 ± Δ / 2 \pm \Delta/2 ±Δ/2 而非 0 , Δ 0,\Delta 0,Δ),盲旋转结束后使用不同 LUT 的一阶差分来数乘
- 其实这些 LUT 就是不同缩放因子 L b o o t i − 1 L^{i-1}{boot} Lbooti−1 下的符号函数,因此它们的一阶差分就是常数多项式 L b o o t i − 1 / 2 − ( − L b o o t i − 1 / 2 ) = L b o o t i − 1 L^{i-1}{boot}/2 - (-L^{i-1}{boot}/2) = L^{i-1}{boot} Lbooti−1/2−(−Lbooti−1/2)=Lbooti−1
- 对比直接把 L b o o t i − 1 ⋅ s g n P L_{boot}^{i-1} \cdot sgnP Lbooti−1⋅sgnP 初始化到 ACC 中,最后乘以 Test Vector 会导致错误的额外增长。因为最大的是 L b o o t l b o o t − 1 ∈ [ Q / L b o o t , Q ) L_{boot}^{l_{boot}-1} \in [Q/L_{boot}, Q) Lbootlboot−1∈[Q/Lboot,Q),导致错误必然会淹没消息。
主要原因是 f : Z t → Z Q f:\mathbb Z_t \to \mathbb Z_Q f:Zt→ZQ 的值域模数是 Q Q Q,对它做分解需要很大的 powers。但是真的需要这么大的模数么 ?相位的 LSB 就是噪声而已,写入函数值没有意义。应当约束为 f : Z t → Z t ′ , t ′ ≪ Q f:\mathbb Z_t \to \mathbb Z_{t'}, t' \ll Q f:Zt→Zt′,t′≪Q,毕竟 PubMux 中的 m ∈ { 0 , Δ q , t ′ } m \in \{0,\Delta_{q,t'}\} m∈{0,Δq,t′} 已经限制了 LUT 多项式 p 0 , p 1 p_0,p_1 p0,p1 的系数规模。将 LUT 多项式变小之后,甚至都不需要做分解了,PubMux 直接输入 G L W E ( s , m ) GLWE(s,m) GLWE(s,m) 即可。
Application
受益于 Full Domain,现在 LWE 密文没有 Padding Bit,因此仿射变换基本是免费的(只要噪声不会变的太大)
- 对于乘法运算,利用 x ⋅ y = ( ( x + y ) / 2 ) 2 − ( ( x − y ) / 2 ) 2 x \cdot y = ((x+y)/2)^2 - ((x-y)/2)^2 x⋅y=((x+y)/2)2−((x−y)/2)2,可以使用两次 FD-PBS 来计算平方,其余的运算都是仿射变换。由于不需要 tensor product,因此噪声增长很小,要求的参数规模不大。
- 对于 Max/Min 运算,可以转化为 max ( x − y , 0 ) + y \max(x-y,0)+y max(x−y,0)+y 以及 min ( x − y , 0 ) + y \min(x-y,0)+y min(x−y,0)+y,于是只需要一次 FD-PBS
- 对于同一个 m m m 上的多个函数,算法中的 a c c c , i acc_{c,i} accc,i 计算出的 powers 是可以复用的,只需改变 step 9-15 的运算
- 对于更大的明文模数,可以使用 CRT 技术,但这只适用于一些特殊的函数,它们需要按照 CRT 分裂为子函数
Preformance
参数集:
手写神经网络:
仿射变换: