BGV 和 BFV 的统一框架

参考文献:

  1. [GHS12] Gentry C, Halevi S, Smart N P. Homomorphic evaluation of the AES circuit[C]//Annual Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 850-867.
  2. [AP13] Alperin-Sheriff J, Peikert C. Practical bootstrapping in quasilinear time[C]//Annual Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013: 1-20.
  3. [CS15] Costache A, Smart N P. Which ring based somewhat homomorphic encryption scheme is best?[C]//Topics in Cryptology-CT-RSA 2016: The Cryptographers’ Track at the RSA Conference 2016, San Francisco, CA, USA, February 29-March 4, 2016, Proceedings. Springer International Publishing, 2016: 325-340.
  4. [CP16] Crockett E, Peikert C. Λολ: Functional Lattice Cryptography[C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016: 993-1005.
  5. [BEHZ16] Bajard J C, Eynard J, Hasan M A, et al. A full RNS variant of FV like somewhat homomorphic encryption schemes[C]//International Conference on Selected Areas in Cryptography. Cham: Springer International Publishing, 2016: 423-442.
  6. [HPS19] Halevi S, Polyakov Y, Shoup V. An improved RNS variant of the BFV homomorphic encryption scheme[C]//Topics in Cryptology–CT-RSA 2019: The Cryptographers’ Track at the RSA Conference 2019, San Francisco, CA, USA, March 4–8, 2019, Proceedings. Springer International Publishing, 2019: 83-105.
  7. [KPZ21] Kim A, Polyakov Y, Zucca V. Revisiting homomorphic encryption schemes for finite fields[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: 608-639.

[CS15] 使用了启发式的平均噪声估计,研究了四种同态方案:BGV、BFV(scale-invariant version of BGV)、NTRU、YASHE(scale-invariant version of NTRU),并研究了两种 key-Switching 方案:BV 和 GHS。他们以相似的安全强度( 80 80 80 比特的安全性),给出了密文模数的选取建议,比较了密文规模以及运算效率。发现:对于 t = 2 t=2 t=2 明文模数 YASHE 的效率略高一些,对于较大的明文模数 BGV 的效率要高的多。另外,对于大明文模数 BGV 的噪声控制更好。

[KPZ21] 比较了 BGV 和 BFV,并对两者进行一定程度的修改,尽可能缩小两者的差距。与 [CS15] 的结论不同,在修改了 BFV 的加密方式后,无论什么规模的明文模数,BFV 的噪声控制总是表现的比 BGV 更好

Original Scheme

分圆整数环 R = Z [ X ] / ( X N + 1 ) \mathcal R=\mathbb Z[X]/(X^N+1) R=Z[X]/(XN+1)中心化余数 [ a ] Q ∈ [ − Q / 2 , Q / 2 ) [a]_Q \in [-Q/2,Q/2) [a]Q[Q/2,Q/2)经典余数 r Q ( a ) ∈ [ 0 , Q ) r_Q(a) \in [0,Q) rQ(a)[0,Q)

环常数 δ R \delta_\mathcal R δR,定义为 ∥ a ⋅ b ∥ ∞ ≤ δ R ⋅ ∥ a ∥ ∞ ∥ b ∥ ∞ , ∀ a , b ∈ R \|a\cdot b\|_\infty \le \delta_\mathcal R \cdot \|a\|_\infty\|b\|_\infty,\forall a,b \in \mathcal R abδRab,a,bR

对于分圆环 δ R = N \delta_\mathcal R=N δR=N,但是实际只有指数小的概率可以达到这个界,一般可以使用 δ R = 2 N \delta_\mathcal R=2\sqrt N δR=2N 作为更紧的启发式噪声上界。一般地 N ≤ 2 14 N \le 2^{14} N214,从而计算出 δ R ≤ 256 \delta_\mathcal R \le 256 δR256 作为经验值。

秘密分布 χ s \chi_s χs均匀三元分布,噪声分布 χ e \chi_e χe 是标准差 σ = 3.19 \sigma=3.19 σ=3.19截断高斯分布,上界 B e r r = 6 σ B_{err}=6\sigma Berr=6σ B k e y = 1 B_{key}=1 Bkey=1

BGV

私钥 s ← χ s s \gets \chi_s sχs 是短的,RLWE 公钥为
p k = ( [ a s + t e ] Q , [ − a ] Q ) ∈ R Q 2 pk=([as+te]_Q, [-a]Q) \in \mathcal R_Q^2 pk=([as+te]Q,[a]Q)RQ2
要求明密文模数互素, gcd ⁡ ( t , Q ) = 1 \gcd(t,Q)=1 gcd(t,Q)=1,那么 p k pk pk 可以转化为 RLWE 样本 ( [ t − 1 a s + e ] Q , [ − t − 1 a ] Q ) ([t^{-1}as+e]_Q, [-t^{-1}a]_Q) ([t1as+e]Q,[t1a]Q)

原始 BGV 采取 LSD 编码,加密算法为
E n c ( [ m ] t ) = ( u ⋅ p k 0 + t e 0 + [ m ] t , u ⋅ p k 1 + t e 1 ) ∈ R Q 2 Enc([m]_t) = \left( u \cdot pk_0+te_0+[m]_t, u \cdot pk_1+te_1\right) \in \mathcal R_Q^2 Enc([m]t)=(upk0+te0+[m]t,upk1+te1)RQ2
其中 u ← χ s , e 0 , e 1 ← χ e u \gets \chi_s, e_0,e_1\gets \chi_e uχs,e0,e1χe 都是随机的短元素,新鲜密文的噪声是 v f r e s h = u e + e 1 s + e 0 v_{fresh}=ue+e_1s+e_0 vfresh=ue+e1s+e0

假设 ( c 0 , c 1 ) (c_0,c_1) (c0,c1) 的噪声是 v v v,那么:
c 0 + c 1 s = [ m ] t + t v ( m o d Q ) c_0+c_1s= [m]_t + tv \pmod Q c0+c1s=[m]t+tv(modQ)
纠错步骤就是: [ [ c 0 + c 1 s ] Q ] t [[c_0+c_1s]_Q]_t [[c0+c1s]Q]t,为了解密正确, [ [ m ] t + t v ] Q [[m]_t+tv]_Q [[m]t+tv]Q(注意不只是 [ t v ] Q [tv]_Q [tv]Q)不能发生回绕(wrap-around),其中 [ m ] t ∈ [ − t / 2 , t / 2 ) [m]_t \in [-t/2,t/2) [m]t[t/2,t/2)
∥ v ∥ ∞ < Q 2 t − 1 2 \|v\|_\infty < \dfrac{Q}{2t}-\dfrac{1}{2} v<2tQ21
同态加法:简记 r m = ( [ m ] t + [ m ′ ] t − [ m + m ′ ] t ) / t r_m=([m]_t + [m']_t-[m+ m']_t)/t rm=([m]t+[m]t[m+m]t)/t,满足 ∥ r m ∥ ∞ ≤ 1 \|r_m\|_\infty \le 1 rm1
( c 0 + c 1 s ) + ( c 0 ′ + c 1 ′ s ) = ( [ m ] t + t v ) + ( [ m ′ ] t + t v ′ ) = [ m + m ′ ] t + t ⋅ r m + t ( v + v ′ ) ∥ v a d d ∥ ∞ = ∥ v + v ′ + r m ∥ ∞ ≤ ∥ v ∥ ∞ + ∥ v ′ ∥ ∞ + 1 \begin{aligned} (c_0+c_1s)+(c_0'+c_1's) &= ([m]_t + tv)+([m']_t + tv')\\ &= [m+m']_t + t\cdot r_m + t(v+v')\\ \|v_{add}\|_\infty &= \|v+v'+r_m\|_\infty\\ &\le \|v\|_\infty + \|v'\|_\infty + 1 \end{aligned} (c0+c1s)+(c0+c1s)vadd=([m]t+tv)+([m]t+tv)=[m+m]t+trm+t(v+v)=v+v+rmv+v+1
同态乘法(不执行重现性化):简记 r m = ( [ m ] t ⋅ [ m ′ ] t − [ m ⋅ m ′ ] t ) / t r_m=([m]_t \cdot [m']_t-[m\cdot m']_t)/t rm=([m]t[m]t[mm]t)/t,满足 ∥ r m ∥ ∞ ≤ δ R t / 2 \|r_m\|_\infty \le \delta_\mathcal Rt/2 rmδRt/2(环乘法导致范数增长 δ R \delta_\mathcal R δR 倍)
( c 0 + c 1 s ) ⋅ ( c 0 ′ + c 1 ′ s ) = ( [ m ] t + t v ) ⋅ ( [ m ′ ] t + t v ′ ) = [ m ⋅ m ′ ] t + t ⋅ r m + t ( [ m ] t ⋅ v ′ + [ m ′ ] t ⋅ v + t v v ′ ) ∥ v m u l t ∥ ∞ = ∥ [ m ] t ⋅ v ′ + [ m ′ ] t ⋅ v + t v v ′ + r m ∥ ∞ ≤ δ R t 2 ⋅ ( ∥ v ′ ∥ ∞ + ∥ v ∥ ∞ + 2 ∥ v ′ ∥ ∞ ⋅ ∥ v ∥ ∞ + 1 ) \begin{aligned} (c_0+c_1s)\cdot(c_0'+c_1's) &= ([m]_t + tv)\cdot([m']_t + tv')\\ &= [m\cdot m']_t + t \cdot r_m + t([m]_t\cdot v'+[m']_t\cdot v+tvv')\\ \|v_{mult}\|_\infty &= \|[m]_t\cdot v'+[m']_t\cdot v+tvv'+r_m\|_\infty\\ &\le \frac{\delta_\mathcal R t}{2} \cdot(\|v'\|_\infty+\|v\|_\infty + 2\|v'\|_\infty \cdot \|v\|_\infty + 1) \end{aligned} (c0+c1s)(c0+c1s)vmult=([m]t+tv)([m]t+tv)=[mm]t+trm+t([m]tv+[m]tv+tvv)=[m]tv+[m]tv+tvv+rm2δRt(v+v+2∥vv+1)
模切换(任意明文模数):输入 c t = ( c 0 , c 1 ) ct=(c_0,c_1) ct=(c0,c1),需要满足条件 ∥ [ c 0 + c 1 s ] Q k ∥ ∞ < Q k / 2 − q k t ( 1 + δ R B k e y ) / 2 \|[c_0+c_1s]_{Q_{k}}\|_\infty < Q_k/2-q_kt(1+\delta_\mathcal RB_{key})/2 [c0+c1s]Qk<Qk/2qkt(1+δRBkey)/2
δ = ( t [ − c 0 t − 1 ] q k , t [ − c 1 t − 1 ] q k ) c t ′ = [ ( c 0 + δ 0 , c 1 + δ 1 ) q k ] Q k − 1 \begin{aligned} \delta &= (t[-c_0t^{-1}]_{q_k}, t[-c_1t^{-1}]_{q_k})\\ ct' &= \left[\dfrac{(c_0+\delta_0, c_1+\delta_1)}{q_k}\right]_{Q_{k-1}} \end{aligned} δct=(t[c0t1]qk,t[c1t1]qk)=[qk(c0+δ0,c1+δ1)]Qk1
易知 δ ≡ 0 ( m o d t ) \delta \equiv 0 \pmod t δ0(modt) 以及 δ ≡ − c t ( m o d q k ) \delta \equiv -ct \pmod{q_k} δct(modqk),计算 c t ′ ct' ct 中的除法就是整除,可被替代为乘以逆元
( c 0 ′ + c 1 ′ s ) = [ q k − 1 ( ( c 0 + δ 0 ) + ( c 1 + δ 1 ) s ) ] Q k − 1 = [ q k − 1 m ] t + q k − 1 ( t v + δ 0 + δ 1 s + r m ) ∥ v ′ ∥ ∞ = ∥ v ∥ ∞ / q k + ∥ v m s ∥ ∞ \begin{aligned} (c_0'+c_1's) &= \left[q_k^{-1}((c_0+\delta_0)+ (c_1+\delta_1)s)\right]_{Q_{k-1}}\\ &= [q_k^{-1}m]_t + q_k^{-1}(tv+\delta_0+\delta_1s+r_m)\\ \|v'\|_\infty &= \|v\|_\infty/q_k+\|v_{ms}\|_\infty \end{aligned} (c0+c1s)v=[qk1((c0+δ0)+(c1+δ1)s)]Qk1=[qk1m]t+qk1(tv+δ0+δ1s+rm)=v/qk+vms
其中 ∥ v m s ∥ ∞ ≤ ( 1 + δ R B k e y ) / 2 \|v_{ms}\|_\infty \le (1+\delta_\mathcal RB_{key})/2 vms(1+δRBkey)/2 是额外引入的小噪声, c t ′ ct' ct 加密的是扭曲的消息 [ q k − 1 m ] t [q_k^{-1}m]_t [qk1m]t

[GHS12] 变体:使用 Double-CRT 格式存储密文

  1. 每次模切换,消息 [ m ] t [m]_t [m]t 都被缩放为 [ q k − 1 m ] t [q_k^{-1}m]_t [qk1m]t
    • [BGV12] 选取 q i ≡ 1 ( m o d t ) q_i \equiv 1 \pmod t qi1(modt),但是这限制了 RNS 素数的选取
    • [GHS12] 追踪这个缩放因子(模切换改变它,简单取模不改变它)
    • 或者初始加密 [ Q L m ] t [Q_Lm]_t [QLm]t,那么模切换之后自然地成为 [ Q k m ] t [Q_km]_t [Qkm]t
  2. 加密之后, v f r a s h v_{frash} vfrash 的规模比 v m s v_{ms} vms 的规模大得多,因此 [GHS12] 建议立即执行一次模切换,这可以降低各个 Q k + 1 / Q k Q_{k+1}/Q_k Qk+1/Qk 的比值,从而获得更小的 Q L Q_L QL
  3. 并非乘法之后模切换,而是在乘法之前模切换,这对其他运算产生的噪声也做了约简控制

BFV

私钥 s ← χ s s \gets \chi_s sχs 是短的,RLWE 公钥为
p k = ( [ a s + e ] Q , [ − a ] Q ) ∈ R Q 2 pk=([as+e]_Q, [-a]Q) \in \mathcal R_Q^2 pk=([as+e]Q,[a]Q)RQ2
在原始 BFV 方案采取 MSD 编码,使用缩放因子 Δ = ⌊ Q / t ⌋ \Delta=\lfloor Q/t\rfloor Δ=Q/t,加密算法为
E n c ( [ m ] t ) = ( u ⋅ p k 0 + e 0 + Δ [ m ] t , u ⋅ p k 1 + e 1 ) ∈ R Q 2 Enc([m]_t) = \left( u \cdot pk_0+e_0+\Delta[m]_t, u \cdot pk_1+e_1\right) \in \mathcal R_Q^2 Enc([m]t)=(upk0+e0+Δ[m]t,upk1+e1)RQ2
其中 u ← χ s , e 0 , e 1 ← χ e u \gets \chi_s, e_0,e_1\gets \chi_e uχs,e0,e1χe 都是随机的短元素,新鲜密文的噪声是 v f r e s h = u e + e 1 s + e 0 v_{fresh}=ue+e_1s+e_0 vfresh=ue+e1s+e0,这和 BGV 是一样的。

我们定义 r t ( Q ) = Q − t Δ ∈ [ 0 , t ) r_t(Q) = Q-t\Delta \in [0,t) rt(Q)=QtΔ[0,t),假设 ( c 0 , c 1 ) (c_0,c_1) (c0,c1) 的噪声是 v v v,那么
c 0 + c 1 s = Δ [ m ] t + v ( m o d Q ) c_0+c_1s= \Delta[m]_t + v \pmod Q c0+c1s=Δ[m]t+v(modQ)
纠错时,计算
⌊ t Q [ c 0 + c 1 s ] Q ⌉ = ⌊ t Q ( Δ [ m ] t + v ) ⌉ = ⌊ ( 1 − r t ( Q ) Q ) [ m ] t + t v Q ⌉ = [ m ] t + ⌊ − r t ( Q ) Q [ m ] t + t v Q ⌉ \begin{aligned} \left\lfloor \dfrac{t}{Q}[c_0+c_1s]_Q \right\rceil &= \left\lfloor \dfrac{t}{Q}(\Delta[m]_t + v) \right\rceil \\ &= \left\lfloor \left(1-\dfrac{r_t(Q)}{Q}\right)[m]_t + \dfrac{tv}{Q} \right\rceil\\ &= [m]_t + \left\lfloor -\dfrac{r_t(Q)}{Q}[m]_t + \dfrac{tv}{Q} \right\rceil \end{aligned} Qt[c0+c1s]Q=Qt(Δ[m]t+v)=(1Qrt(Q))[m]t+Qtv=[m]t+Qrt(Q)[m]t+Qtv
由于 [ m ] t ∈ [ − t / 2 , t / 2 ) [m]_t \in [-t/2,t/2) [m]t[t/2,t/2),因此解密正确的条件是:
∥ v ∥ ∞ < Q 2 t − r t ( Q ) 2 \|v\|_\infty < \dfrac{Q}{2t} - \dfrac{r_t(Q)}{2} v<2tQ2rt(Q)
对比 BGV 的解密条件 ∥ v ∥ ∞ < Q 2 t − 1 2 \|v\|_\infty < \dfrac{Q}{2t} - \dfrac{1}{2} v<2tQ21,由于 Δ \Delta Δ Q / t Q/t Q/t 之间的差距,原始 BFV 的解密临界值比 BGV 偏小

对于 t = 2 t=2 t=2,素数 q 1 , ⋯   , q k q_1,\cdots,q_k q1,,qk 都满足 r t ( Q ) = 1 r_t(Q)=1 rt(Q)=1,但是对于一般的 t t t(尤其是较大的,如 t = 2 16 + 1 t=2^{16}+1 t=216+1),余数 r t ( Q ) r_t(Q) rt(Q) 的规模将接近 t / 2 t/2 t/2,对噪声增长有较大的贡献。如果强行设置 q i ≡ 1 ( m o d t ) q_i \equiv 1 \pmod t qi1(modt),这限制了 RNS 素数的选取;或者放松一些,使得 r t ( Q ) < N r_t(Q)<\sqrt N rt(Q)<N 是个较小的数,但依旧不能根本上解决问题。

同态加法:简记 r m = ( [ m ] t + [ m ′ ] t − [ m + m ′ ] t ) / t r_m=([m]_t + [m']_t-[m+ m']_t)/t rm=([m]t+[m]t[m+m]t)/t t t t-overflow,满足 ∥ r m ∥ ∞ ≤ 1 \|r_m\|_\infty \le 1 rm1
( c 0 + c 1 s ) + ( c 0 ′ + c 1 ′ s ) = ( Δ [ m ] t + v ) + ( Δ [ m ′ ] t + v ′ ) = Δ [ m + m ′ ] t + Δ t r m + v + v ′ = Δ [ m + m ′ ] t − r t ( Q ) r m + v + v ′ ∥ v a d d ∥ ∞ = ∥ v + v ′ − r t ( Q ) r m ∥ ∞ ≤ ∥ v ∥ ∞ + ∥ v ′ ∥ ∞ + r t ( Q ) \begin{aligned} (c_0+c_1s)+(c_0'+c_1's) &= (\Delta[m]_t + v)+(\Delta[m']_t + v')\\ &= \Delta[m+m']_t + \Delta tr_m + v+v'\\ &= \Delta[m+m']_t - r_t(Q)r_m + v+v'\\ \|v_{add}\|_\infty &= \|v+v'-r_t(Q)r_m\|_\infty\\ &\le \|v\|_\infty + \|v'\|_\infty + r_t(Q) \end{aligned} (c0+c1s)+(c0+c1s)vadd=(Δ[m]t+v)+(Δ[m]t+v)=Δ[m+m]t+Δtrm+v+v=Δ[m+m]trt(Q)rm+v+v=v+vrt(Q)rmv+v+rt(Q)
因此原始 BFV 的噪声增长也比 BGV 更大

同态乘法(不执行重现性化):注意 BFV 的张量运算是在 Z \mathbb Z Z 上的(不要模 Q Q Q),然后执行缩放 ⌊ t / Q ⋅ c t t e n s o r ⌉ \lfloor t/Q \cdot ct_{tensor}\rceil t/Qcttensor,最后才模掉 Q Q Q,简记 r m r_m rm [ m ] t ⋅ [ m ′ ] t [m]_t \cdot [m']_t [m]t[m]t t t t-overflow,简记 k m , k m ′ k_m,k_m' km,km c 0 + c 1 s , c 0 ′ + c 1 ′ c_0+c_1s,c_0'+c_1' c0+c1s,c0+c1 Q Q Q-overflow,易知 ∥ k m ∥ ∞ < δ R ∥ c 1 ∥ ∞ ∥ s ∥ ∞ / Q < δ R / 2 \|k_m\|_\infty < \delta_\mathcal R\|c_1\|_\infty\|s\|_\infty/Q < \delta_\mathcal R/2 km<δRc1s/Q<δR/2
( c 0 + c 1 s ) ⋅ ( c 0 ′ + c 1 ′ s ) = ( Δ [ m ] t + v + Q k m ) ⋅ ( Δ [ m ′ ] t + v ′ + Q k m ′ ) = Δ 2 [ m ] t ⋅ [ m ′ ] t + Δ [ m ] t ( v ′ + Q k m ′ ) + Δ [ m ′ ] t ( v + Q k m ) + ( v + Q k m ) ( v ′ + Q k m ′ ) = Q t ( Δ [ m ⋅ m ′ ] t + v t e n s o r + Q ⋅ k t e n s o r ) \begin{aligned} (c_0+c_1s)\cdot(c_0'+c_1's) &= (\Delta[m]_t + v + Qk_m)\cdot(\Delta[m']_t + v' + Qk_m')\\ &= \Delta^2[m]_t \cdot [m']_t + \Delta[m]_t(v'+Qk_m') + \Delta[m']_t(v+Qk_m) + (v+Qk_m)(v'+Qk_m')\\ &= \dfrac{Q}{t}(\Delta[m\cdot m']_t + v_{tensor} + Q\cdot k_{tensor}) \end{aligned} (c0+c1s)(c0+c1s)=(Δ[m]t+v+Qkm)(Δ[m]t+v+Qkm)=Δ2[m]t[m]t+Δ[m]t(v+Qkm)+Δ[m]t(v+Qkm)+(v+Qkm)(v+Qkm)=tQ(Δ[mm]t+vtensor+Qktensor)
其中的噪声项 v t e n s o r , k t e n s o r v_{tensor},k_{tensor} vtensor,ktensor 的公式特别复杂。接着执行 t / Q t/Q t/Q 缩放,舍入运算额外引入噪声 v r v_r vr,最后模掉 Q Q Q 消除了 k t e n s o r k_{tensor} ktensor 部分,最终噪声是 v m u l t = v t e n s o r + v r v_{mult} = v_{tensor}+v_r vmult=vtensor+vr,它的范数上界公式及其复杂,详见 [KPZ21] 推导。

原始 BFV 不需要缩放/模切换(隐式地嵌入到了同态乘法中),但是如果使用 GHS 秘钥切换,需要从 [ c ] P Q [c]_{PQ} [c]PQ 缩放到 [ c / P ] Q [c/P]_{Q} [c/P]Q,这依旧需要用到 Scale 过程。类似于 BGV 的兼容 Full-RNS 的模切换,计算差距 δ \delta δ 使得 c + δ c+\delta c+δ P P P 整除,但是简单设置 δ = [ [ c ] P ] P Q \delta=[[c]_P]_{PQ} δ=[[c]P]PQ 即可(因为 BFV 是 MSD 编码的,而 BGV 还要考虑对 [ c ] t [c]_t [c]t 的保护)。算法如下:

  1. 输入 c = ( c 0 , c 1 ) ∈ R P Q c=(c_0,c_1) \in \mathcal R_{PQ} c=(c0,c1)RPQ,我们试图计算 c ′ = ⌊ c / P ⌉ c'=\lfloor c/P \rceil c=c/P(Lift 到 Z \mathbb Z Z 上)
  2. 计算 δ = ( [ c 0 ] P , [ c 1 ] P ) \delta = ([c_0]_P,[c_1]_P) δ=([c0]P,[c1]P),扩展到 [ δ ] P Q [\delta]_{PQ} [δ]PQ 上(需要使用 RNS Basis Externsion,从基 P P P 到基 Q Q Q
  3. 此时 P ∣ ( c + δ ) P \mid (c+\delta) P(c+δ),计算出 c ′ = [ ( c + δ ) ⋅ P − 1 ] Q c'=[(c+\delta)\cdot P^{-1}]_Q c=[(c+δ)P1]Q,它恰好就是 ( [ c ] P Q + δ ) / P ([c]_{PQ}+\delta)/P ([c]PQ+δ)/P 的精确值(落在 [ − Q / 2 , Q / 2 ) [-Q/2,Q/2) [Q/2,Q/2) 内,不取模)

Multiply LSD and MSD

事实上,BGV 和 BFV 之间最大的不同,就是所采取的编码方式,这导致了不同的噪声控制技术。[AP13] 证明了 LSD 和 MSD 是等价的,只要 gcd ⁡ ( t , Q ) = 1 \gcd(t,Q)=1 gcd(t,Q)=1,那么两者之间可以相互转化(BGV 和 BFV 密文的转换)

[CP16] 指出 LSD-form Ciphertext 和 MSD-form Ciphertext 之间存在三种同态乘法,分别是:LSD x LSD、LSD x MSD、MSD x MSD。不过文中介绍的主要是它设计的算法库如何使用(全是他们设计的伪代码),并没有详细介绍原理。LSD x LSD 和 LSD x MSD 的效率类似,而 MSD x MSD 的效率则低得多(要 Lift 到 Z \mathbb Z Z 上,计算缩放和舍入)

这里推导下 LSD x MSD 形式的乘法,
c ( s ) = [ m ] t + t v + Q k m c ′ ( s ) = Δ [ m ′ ] t + v ′ + Q k m ′ \begin{aligned} c(s) &= [m]_t + tv + Qk_m\\ c'(s) &= \Delta[m']_t + v' + Qk_m' \end{aligned} c(s)c(s)=[m]t+tv+Qkm=Δ[m]t+v+Qkm
类似于 LSD x LSD,张量积可以直接在 R Q \mathcal R_Q RQ 中计算(因为不需要缩放,所以不需要 Lift 到够大的 Z P Q \mathbb Z_{PQ} ZPQ 上模拟 Z \mathbb Z Z),
c ( s ) ⋅ c ′ ( s ) = ( [ m ] t + t v ) ⋅ ( Δ [ m ′ ] t + v ′ ) = Δ ( [ m ⋅ m ′ ] t + r m t ) + [ m ] t v ′ + t Δ [ m ′ ] t v + t v v ′ ( m o d Q ) \begin{aligned} c(s) \cdot c'(s) &= ([m]_t + tv)\cdot (\Delta[m']_t + v' )\\ &= \Delta([m \cdot m']_t + r_mt) + [m]_tv' + t\Delta[m']_tv + tvv' \pmod Q \end{aligned} c(s)c(s)=([m]t+tv)(Δ[m]t+v)=Δ([mm]t+rmt)+[m]tv+tΔ[m]tv+tvv(modQ)
计算结果是 MSD-form 的,因为 t Δ = Q − r t ( Q ) t\Delta=Q-r_t(Q) tΔ=Qrt(Q),噪声为
v t e n s o r = [ m ] t v ′ − r t ( Q ) ( r m + [ m ′ ] t v ) + t v v ′ v_{tensor} = [m]_tv' -r_t(Q)(r_m + [m']_tv) + tvv' vtensor=[m]tvrt(Q)(rm+[m]tv)+tvv
噪声增长也与 r t ( Q ) r_t(Q) rt(Q) 有关,需要控制它。使用下文的技术,可以修改 MSD-form 的加密方式,移除 Δ \Delta Δ 导致的 r t ( Q ) r_t(Q) rt(Q)
c ( s ) ⋅ c ′ ( s ) = ( [ m ] t + t v ) ⋅ ( Q t [ m ′ ] t + ϵ ′ + v ′ ) = Q t ( [ m ⋅ m ′ ] t + r m t ) + [ m ] t ( ϵ ′ + v ′ ) + Q [ m ′ ] t v + t v ( ϵ ′ + v ′ ) ( m o d Q ) v t e n s o r = [ m ] t ( ϵ + v ′ ) + t v ( ϵ ′ + v ′ ) \begin{aligned} c(s) \cdot c'(s) &= ([m]_t + tv)\cdot (\frac{Q}{t}[m']_t + \epsilon' + v' )\\ &= \frac{Q}{t}([m \cdot m']_t + r_mt) + [m]_t(\epsilon'+v') + Q[m']_tv + tv(\epsilon'+v') \pmod Q\\ v_{tensor} &= [m]_t(\epsilon+v') + tv(\epsilon'+v') \end{aligned} c(s)c(s)vtensor=([m]t+tv)(tQ[m]t+ϵ+v)=tQ([mm]t+rmt)+[m]t(ϵ+v)+Q[m]tv+tv(ϵ+v)(modQ)=[m]t(ϵ+v)+tv(ϵ+v)

Modified BFV

Remove Δ \Delta Δ

[KPZ21] 将原始 BFV 使用的 Δ \Delta Δ 移除,加密算法修改为更加自然的方式:
E n c ( [ m ] t ) = ( p k 0 ⋅ u + e 0 + ⌊ Q t [ m ] t ⌉ , p k 1 ⋅ u + e 1 ) ∈ R Q 2 Enc([m]_t) = \left( pk_0\cdot u+e_0+\left\lfloor\dfrac{Q}{t}[m]_t\right\rceil, pk_1 \cdot u+e_1\right) \in \mathcal R_Q^2 Enc([m]t)=(pk0u+e0+tQ[m]t,pk1u+e1)RQ2

其中的 ⌊ Q t [ m ] t ⌉ ( m o d Q ) \left\lfloor\frac{Q}{t}[m]_t\right\rceil \pmod Q tQ[m]t(modQ) 可以直接在 RNS 下计算:
⌊ Q t [ m ] t ⌉ = Q [ m ] t − [ Q m ] t t = [ Q m ] t ⋅ ( − t − 1 ) ( m o d Q ) \left\lfloor\frac{Q}{t}[m]_t\right\rceil = \frac{Q[m]_t - [Qm]_t}{t} = [Qm]_t \cdot (-t^{-1}) \pmod Q tQ[m]t=tQ[m]t[Qm]t=[Qm]t(t1)(modQ)
其中的 [ Q ] t [Q]_t [Q]t [ − t − 1 ] Q [-t^{-1}]_Q [t1]Q 的 RNS 表示,都是预计算的。

我们简记 ⌊ [ m ] t Q / t ⌉ = [ m ] t Q / t + ϵ \lfloor [m]_tQ/t \rceil = [m]_tQ/t + \epsilon ⌊[m]tQ/t=[m]tQ/t+ϵ,易知 ∥ ϵ ∥ ∞ ≤ 1 / 2 \|\epsilon\|_\infty \le 1/2 ϵ1/2,假设 v v v 是密文噪声, k k k 是线性解密的 Q Q Q-overflow,
⌊ t Q [ c 0 + c 1 s ] Q ⌉ = ⌊ t Q ( Q t [ m ] t + ϵ + v + k Q ) ⌉ = [ m ] t + t k + ⌊ t Q ( ϵ + v ) ⌉ \begin{aligned} \left\lfloor\dfrac{t}{Q}[c_0+c_1s]_Q\right\rceil &= \left\lfloor\dfrac{t}{Q}\left( \dfrac{Q}{t}[m]_t+\epsilon+v+kQ \right)\right\rceil\\ &= [m]_t + tk + \left\lfloor\dfrac{t}{Q}(\epsilon+v )\right\rceil \end{aligned} Qt[c0+c1s]Q=Qt(tQ[m]t+ϵ+v+kQ)=[m]t+tk+Qt(ϵ+v)
解密正确的条件是:
∥ t Q ( ϵ + v ) ∥ ∞ < 1 / 2 ⟹ ∥ v ∥ ∞ < Q 2 t − 1 2 \left\|\dfrac{t}{Q}(\epsilon+v )\right\|_\infty<1/2 \Longrightarrow \|v\|_\infty < \dfrac{Q}{2t}-\dfrac{1}{2} Qt(ϵ+v) <1/2v<2tQ21
这与 BGV 的解密临界值是完全相同的了。同理,同态加法的噪声也与 BGV 的完全一样:
( c 0 + c 1 s ) + ( c 0 ′ + c 1 ′ s ) = ( Q t [ m ] t + ϵ + v ) + ( Q t [ m ′ ] t + ϵ ′ + v ′ ) = Q t ( [ m + m ′ ] t + r m t ) + v + v ′ + ϵ + ϵ ′ ( m o d Q ) ∥ v a d d − n e w ∥ ∞ = ∥ v + v ′ + ϵ + ϵ ′ ∥ ∞ ≤ ∥ v ∥ ∞ + ∥ v ′ ∥ ∞ + 1 \begin{aligned} (c_0+c_1s)+(c_0'+c_1's) &= (\frac{Q}{t}[m]_t +\epsilon + v)+(\frac{Q}{t}[m']_t +\epsilon' + v')\\ &= \frac{Q}{t}([m+m']_t+r_mt) +v+v'+\epsilon+\epsilon' \pmod Q\\ \|v_{add-new}\|_\infty &= \|v+v'+\epsilon+\epsilon'\|_\infty\\ &\le \|v\|_\infty + \|v'\|_\infty + 1 \end{aligned} (c0+c1s)+(c0+c1s)vaddnew=(tQ[m]t+ϵ+v)+(tQ[m]t+ϵ+v)=tQ([m+m]t+rmt)+v+v+ϵ+ϵ(modQ)=v+v+ϵ+ϵv+v+1
同态乘法的噪声,也被移除了 r t ( Q ) r_t(Q) rt(Q) 导致的噪声增长,
( c 0 + c 1 s ) ⋅ ( c 0 ′ + c 1 ′ s ) = ( Q t [ m ] t + ϵ + v + Q k m ) ⋅ ( Q t [ m ′ ] t + ϵ ′ + v ′ + Q k m ′ ) = Q t ( Q t [ m ] t ⋅ [ m ′ ] t + [ m ] t ( ϵ ′ + v ′ + Q k m ′ ) + [ m ′ ] t ( ϵ + v + Q k m ) ) + ( ϵ + v + Q k m ) ( ϵ ′ + v ′ + Q k m ′ ) = Q t ( Q t [ m ⋅ m ′ ] t + v t e n s o r − n e w + Q ⋅ k t e n s o r − n e w ) ∈ R \begin{aligned} (c_0+c_1s)\cdot(c_0'+c_1's) &= (\frac{Q}{t}[m]_t + \epsilon + v + Qk_m)\cdot(\frac{Q}{t}[m']_t + \epsilon' + v' + Qk_m')\\ &= \frac{Q}{t}\left(\frac{Q}{t}[m]_t \cdot [m']_t + [m]_t(\epsilon'+v'+Qk_m') + [m']_t(\epsilon+v+Qk_m)\right) + (\epsilon+v+Qk_m)(\epsilon'+v'+Qk_m')\\ &= \dfrac{Q}{t}(\dfrac{Q}{t}[m\cdot m']_t + v_{tensor-new} + Q\cdot k_{tensor-new}) \in \mathcal R \end{aligned} (c0+c1s)(c0+c1s)=(tQ[m]t+ϵ+v+Qkm)(tQ[m]t+ϵ+v+Qkm)=tQ(tQ[m]t[m]t+[m]t(ϵ+v+Qkm)+[m]t(ϵ+v+Qkm))+(ϵ+v+Qkm)(ϵ+v+Qkm)=tQ(tQ[mm]t+vtensornew+Qktensornew)R
其中的 v t e n s o r − n e w , k t e n s o r − n e w v_{tensor-new},k_{tensor-new} vtensornew,ktensornew 依旧是较为复杂的式子(详见 [KPZ21]),上式在 R \mathcal R R(不要取模)中的主项是 Q 2 k m k m ′ Q^2k_mk_m' Q2kmkm,缩放 t / Q t/Q t/Q 之后的主项是 Q t k m k m ′ Qtk_mk_m' Qtkmkm,紧接着的舍入引入噪声 v r v_r vr,模 Q Q Q 消除 k t e n s o r − n e w k_{tensor-new} ktensornew 的部分,最终的噪声为 v m u l t − n e w = v t e n s o r − n e w + v r v_{mult-new}=v_{tensor-new}+v_r vmultnew=vtensornew+vr,它的范数上界是个很复杂的式子(移除了 r t ( Q ) r_t(Q) rt(Q) 的影响,实际上接近 BGV 的界)

Enc with larger modulus

类似于 GHS-BGV,它加密之后立即模切换,将噪声从 v f r e s h v_{fresh} vfresh 降低到 v m s v_{ms} vms 水平。[KPZ21] 也使用类似的技术,在 Q p Qp Qp 上加密,然后使用 Scale 过程回到 Q Q Q 上。

我们首先在 Q ′ = Q p Q'=Qp Q=Qp(噪声比率下降了)上执行 E n c ( [ m ] t ) Enc([m]_t) Enc([m]t),获得密文 c t f r e s h ct_{fresh} ctfresh,噪声为 v f r e s h v_{fresh} vfresh,接着使用 Scale 过程缩放 1 / p 1/p 1/p
c t s c a l e = ⌊ c t p ⌉ ( m o d Q ) ∥ v s c a l e ∥ ∞ ≤ ∥ v f r e s h ∥ ∞ p + 1 2 p + 1 + δ R B k e y 2 \begin{aligned} ct_{scale} &= \left\lfloor \frac{ct}{p} \right\rceil \pmod Q\\ \|v_{scale}\|_\infty &\le \frac{\|v_{fresh}\|_\infty}{p} + \frac{1}{2p} + \frac{1+\delta_\mathcal R B_{key}}{2} \end{aligned} ctscalevscale=pct(modQ)pvfresh+2p1+21+δRBkey
选取合适的 p p p,使得缩放后的噪声降低为 ∥ v s c a l e ∥ ∞ ≈ ( 1 + δ R B k e y ) / 2 \|v_{scale}\|_\infty \approx (1+\delta_\mathcal R B_{key})/2 vscale(1+δRBkey)/2,使得它接近 Scale 过程本身带来的噪声项。如果采用 GHS Key-Switch,那么 p p p 可以复用临时模数 P P P 中的某个 RNS 基,从而不影响安全性。

Modified Multiplication

因为 BFV 需要在 Z \mathbb Z Z 上计算 tensor 运算,因此对于 RNS 系统,需要选取一个合适的 P P P(这和 GHS Key-Switch 使用的不同),使得 c t ( s ) ⋅ c t ( s ′ ) ∈ R ct(s) \cdot ct(s') \in \mathcal R ct(s)ct(s)R 的系数不回绕 P Q PQ PQ,并且缩放后的主项 Q t k m k m ′ Qtk_mk_m' Qtkmkm 不回绕 P P P,因此需要设置 P > t δ R 3 Q / 4 P > t\delta_\mathcal R^3 Q/4 P>tδR3Q/4。一般地 t ≤ 2 30 , N ≤ 2 14 t \le 2^{30}, N \le 2^{14} t230,N214,那么 t δ R 3 / 4 ≤ 2 52 t\delta_\mathcal R^3/4 \le 2^{52} tδR3/4252。令 Q , P Q,P Q,P 分别分解为 k , l k,l k,l 个规模尽可能大(一般是 2 60 2^{60} 260,令 RNS 中的 NTT 更少) 的素数,实际中设置 l = k + 1 l=k+1 l=k+1 即可

RNS 下的原始 BFV 乘法:

在这里插入图片描述

[KPZ21] 提出,并非两个模数 Q Q Q 下的密文做张量积(它的主项是 Q 2 Q^2 Q2 的倍数,需要 P Q PQ PQ 够大从而不回绕),而是一个是模数 P P P 下的、另一个是模数 Q Q Q 下的,此时密文张量积的主项是 P Q PQ PQ 的倍数,可以被 ( m o d P Q ) \pmod{PQ} (modPQ) 正确地消除,从而 P P P 只需要满足其他较小的项不回绕即可,它的规模可以减小。

给定两个密文 c , c ′ ∈ R Q c,c' \in \mathcal R_Q c,cRQ,首先对 c c c 进行缩放,
c ^ = ⌊ P Q c ⌉ ∈ R P \hat c = \left\lfloor \frac{P}{Q} c \right\rceil \in \mathcal R_P c^=QPcRP
简记 ϵ ^ = ( c ^ − P / Q ⋅ c ) ( s ) \hat \epsilon = (\hat c-P/Q\cdot c)(s) ϵ^=(c^P/Qc)(s) 是上述舍入导致的噪声,上界是 ( 1 + δ R B k e y ) / 2 (1+\delta_\mathcal R B_{key})/2 (1+δRBkey)/2,那么
c ^ ( s ) = P t [ m ] t + P Q ( ϵ + v ) + P k m + ϵ ^ \hat c(s) = \frac{P}{t}[m]_t + \frac{P}{Q}(\epsilon + v) + Pk_m + \hat \epsilon c^(s)=tP[m]t+QP(ϵ+v)+Pkm+ϵ^
于是新的密文张量的运算是:
   ( P t [ m ] t + P Q ( ϵ + v ) + P k m + ϵ ^ ) ⋅ ( Q t [ m ′ ] t + ϵ ′ + v ′ + Q k m ′ ) = P t ( Q t [ m ⋅ m ′ ] t + Q r m + [ m ] t ( ϵ ′ + v ′ + Q k m ′ ) ) + ( P Q ( ϵ + v ) + ϵ ^ ) ⋅ ( Q t [ m ′ ] t + ϵ ′ + v ′ ) + ( P Q ( ϵ + v ) + ϵ ^ ) ⋅ Q k m ′ + P k m ⋅ ( Q t [ m ′ ] t + ϵ ′ + v ′ ) + P Q k m k m ′ ( m o d P Q ) \begin{aligned} &\,\, \left(\frac{P}{t}[m]_t + \frac{P}{Q}(\epsilon + v) + Pk_m + \hat \epsilon\right) \cdot \left(\frac{Q}{t}[m']_t + \epsilon' + v' + Qk_m'\right)\\ &= \frac{P}{t} \left(\frac{Q}{t}[m \cdot m']_t + Qr_m + [m]_t(\epsilon' + v' + Qk_m') \right) +\left(\frac{P}{Q}(\epsilon + v) + \hat \epsilon\right) \cdot \left(\frac{Q}{t}[m']_t + \epsilon' + v'\right) \\ &+ \left(\frac{P}{Q}(\epsilon + v) + \hat \epsilon\right) \cdot Qk_m' + Pk_m \cdot \left(\frac{Q}{t}[m']_t + \epsilon' + v'\right) + PQk_mk_m' \pmod{PQ} \end{aligned} (tP[m]t+QP(ϵ+v)+Pkm+ϵ^)(tQ[m]t+ϵ+v+Qkm)=tP(tQ[mm]t+Qrm+[m]t(ϵ+v+Qkm))+(QP(ϵ+v)+ϵ^)(tQ[m]t+ϵ+v)+(QP(ϵ+v)+ϵ^)Qkm+Pkm(tQ[m]t+ϵ+v)+PQkmkm(modPQ)
其中的主项 P Q k m k m ′ ≡ 0 ( m o d P Q ) PQk_mk_m' \equiv 0 \pmod{PQ} PQkmkm0(modPQ) 可被消除,只要其他部分不回绕 P Q PQ PQ 即可。接着对上述的 c ^ t e n s o r \hat c_{tensor} c^tensor 缩放 t / P t/P t/P 回到 Q Q Q 上,它的噪声比 v m u l t − n e w v_{mult-new} vmultnew 额外增加了一项(详见 [KPZ21]),但是只要选取 P ≈ Q P \approx Q PQ 即可使得额外的这项的规模降低为 t δ R 3 / 4 t\delta_\mathcal R^3/4 tδR3/4。随着 BFV 的计算(除了新鲜密文的噪声规模仅为 δ R / 2 \delta_\mathcal R/2 δR/2),密文中的噪声会远大于这个数(注意 BGV 控制噪声的绝对大小,而 BFV 的噪声则一直在变大),因此额外的噪声项可以被忽略。因此选取 l = k l = k l=k 即可,这减小了基 P P P 的 RNS 系统中的一个分量。

新的 RNS 下的 BFV 乘法:

在这里插入图片描述

在原始乘法中,初始时将 c , c ′ c,c' c,c(degree-1)扩展到 P Q PQ PQ 需要 4 4 4 次 RNS 扩展,缩放 c t e n s o r c_{tensor} ctensor(degree-2)时把 [ δ ] P [\delta]_P [δ]P 扩展到 [ δ ] P Q [\delta]_{PQ} [δ]PQ 需要 3 3 3 次 RNS 扩展,最后 c s c a l e c_{scale} cscale(degree-2)从 P P P 回到 Q Q Q 再需要 3 3 3 次 RNS 扩展,共计 10 10 10。[KPZ21] 的乘法中,初始将 c c c 切换到 P P P 需要 2 2 2 次 RNS 扩展,将 c ^ , c ′ \hat c,c' c^,c 扩展到 P Q PQ PQ 需要 4 4 4 次 RNS 扩展,最后的缩放 c ^ t e n s o r \hat c_{tensor} c^tensor 的过程需要 3 3 3 次 RNS 扩展,它的结果已经是 Q Q Q 下的(不再需要 RNS 扩展),共计 9 9 9。此外,新算法的临时模数 P P P 也略小(一个 RNS 分量)。

Level Multiplication

此外,类似于 [GHS12] 的 BGV 变体,我们可以动态估计噪声,然后在 BFV 乘法的内部执行 ScaleDown 和 ScaleUp,在较小的模数 Q l ≤ Q Q_l \le Q QlQ 上执行同态乘法(RNS 的分量更少,使得 NTT 和 RNS Basis Extersion 都更快)

假设两密文的噪声为 v , v ′ v,v' v,v,缩放后的噪声是
v ^ = Q l Q v + ϵ ,    v ^ ′ = Q l Q v ′ + ϵ ′ \hat v = \frac{Q_l}{Q}v + \epsilon,\,\, \hat v' = \frac{Q_l}{Q}v' + \epsilon' v^=QQlv+ϵ,v^=QQlv+ϵ
其中的 ϵ , ϵ ′ \epsilon,\epsilon' ϵ,ϵ 是缩放时的舍入噪声,规模 ( 1 + δ R B k e y ) / 2 ≈ δ R / 2 (1+\delta_\mathcal R B_{key})/2 \approx \delta_\mathcal R/2 (1+δRBkey)/2δR/2,因此我们应当选取合适的 Q l Q_l Ql使得缩放后的噪声 Q l Q v \frac{Q_l}{Q}v QQlv 的范数远比 δ R / 2 \delta_\mathcal R/2 δR/2(从而令舍入噪声 ϵ \epsilon ϵ 的影响不算大)。[KPZ21] 给出的建议是,选取 Q l Q_l Ql 为满足下式的、尽可能小的模数,
∥ v ∥ ∞ > 8 Q δ R Q l \|v\|_\infty > \frac{8Q\delta_\mathcal R}{Q_l} v>Ql8QδR
为了估计 v v v 的(平均)规模,[KPZ21] 使用了最坏噪声估计,额外添加一个启发式的缓冲(heuristic “cushion” to worst-case bound)。

Level BFV 的同态乘法:

在这里插入图片描述

上述的 Modulus-Switch,既可以是精确的(使用 [HPS19] 的浮点纠错技术),也可以是近似的(携带着 Q Q Q-overflow, u < k / 2 u < k/2 u<k/2),后者需要估计噪声 v v v 时额外添加 log ⁡ k \log k logk 比特。

这个 “Leveled optimization” 也可以应用到其他过程上,比如 Key-Switch,不过 Q l Q_l Ql 的选取规则改变为:使得缩放后的噪声 v ^ \hat v v^ 远大于 v k s v_{ks} vks,从而保证秘钥切换过程本身对噪声增长的贡献可忽略。

BFV Optimizations

Lazy Scaling

在 RNS 下每一次 Scale 过程需要花费一次 RNS Basis Externsion,对于内积运算,我们可以将它们延迟到最后统一执行,并非每次乘法之后立即执行。好处有两个:复杂度降低、噪声下降(每次 Scale 本身会引入一定的噪声)。

在这里插入图片描述

[KPZ21] 测试后发现,这导致了 2x 加速。

Digit Decomposition Technique for RNS

[HPS19] 的 BFV 变体,它使用了浮点指令来纠正 RNS Basis Externsion、Scale 中的错误。对于后者,给定 x ∈ Z Q x \in \mathbb Z_Q xZQ,计算 y = ⌊ t / Q ⋅ x ⌉ ∈ Z t y=\lfloor t/Q \cdot x\rceil \in \mathbb Z_t y=t/QxZt 的公式为:
y = ⌊ t Q ⋅ x ⌉ = ⌊ t Q ⋅ ∑ i = 1 k x i ⋅ q i ∗ ⋅ q ~ i − u ⋅ t ⌉ = ⌊ ∑ i = 1 k x i ⋅ ( t q i ⋅ q ~ i ) ⌉ − u ⋅ t ( m o d t ) \begin{aligned} y &= \left\lfloor \dfrac{t}{Q} \cdot x \right\rceil = \left\lfloor \dfrac{t}{Q} \cdot \sum_{i=1}^k x_i \cdot q_i^* \cdot \tilde q_i - u \cdot t \right\rceil\\ &= \left\lfloor \sum_{i=1}^k x_i \cdot \left(\dfrac{t}{q_i} \cdot \tilde q_i\right) \right\rceil - u \cdot t \pmod{t}\\ \end{aligned} y=Qtx=Qti=1kxiqiq~iut=i=1kxi(qitq~i)ut(modt)
[HPS19] 预计算其中的常数,分为整数和小数两部分,
t q i ⋅ [ q ~ i ] q i = ω i + θ i ,    ω i ∈ Z t ,    θ i ∈ [ − 0.5 , 0.5 ) \dfrac{t}{q_i}\cdot[\tilde q_i]_{q_i} = \omega_{i}+\theta_{i},\,\, \omega_{i} \in \mathbb Z_{t},\,\, \theta_{i} \in [-0.5,0.5) qit[q~i]qi=ωi+θi,ωiZt,θi[0.5,0.5)
小数部分使用浮点表示 θ i ∗ = θ i + ϵ i , ∣ ϵ i ∣ < ϵ \theta_i^*=\theta_i+\epsilon_i, |\epsilon_i|<\epsilon θi=θi+ϵi,ϵi<ϵ(如果使用 IEEE-754 double 则误差规模是 ϵ = 2 − 53 \epsilon=2^{-53} ϵ=253),计算出的 v ∗ = ⌊ ∑ i = 1 k x i ( ω i + θ i ∗ ) ⌉ v^*=\left\lfloor \sum_{i=1}^k x_i (\omega_{i}+\theta_{i}^*) \right\rceil v=i=1kxi(ωi+θi) 可能会和 v = ⌊ ∑ i = 1 k x i ( ω i + θ i ) ⌉ v=\left\lfloor \sum_{i=1}^k x_i (\omega_{i}+\theta_{i}) \right\rceil v=i=1kxi(ωi+θi) 有差异。假如我们约束 y = ⌊ t Q ⋅ x ⌉ y = \left\lfloor \frac{t}{Q} \cdot x \right\rceil y=Qtx 满足 y ( m o d Z ) ∈ [ − 1 / 4 , 1 / 4 ] y \pmod{\mathbb Z} \in [-1/4,1/4] y(modZ)[1/4,1/4](控制密文中的噪声规模小于 Q / 4 t Q/4t Q/4t,而非通常的 Q / 2 t Q/2t Q/2t),那么只要累积误差满足 ∣ ∑ i x i ϵ i ∣ < 1 / 4 |\sum_i x_i \epsilon_i| < 1/4 ixiϵi<1/4(精度足够高的浮点数),就总是可以正确舍入( v = v ∗ v=v^* v=v

浮点数的精度要求是: ϵ < 1 2 k q m \epsilon < \frac{1}{2kq_m} ϵ<2kqm1,其中 q m q_m qm 是 RNS 模数的规模,一般而言 k < 32 k<32 k<32,假如 q m > 2 47 q_m > 2^{47} qm>247,那么就需要 ϵ < 2 − 53 \epsilon<2^{-53} ϵ<253(IEEE-754 double 精度不够了,需要使用更高精度的)。[KPZ21] 提出了一种通用目的数字分解技术(类似于 BV Key-Switch),降低 q m q_m qm 的规模,从而只需要常规的单精度数据类型:选取 base B s ≥ 2 B_s \ge 2 Bs2,设置 d s = ⌈ log ⁡ B s ( q m ) ⌉ d_s=\lceil \log_{B_s}(q_m)\rceil ds=logBs(qm)⌉,将 x i ∈ [ − q m / 2 , q m / 2 ) x_i \in [-q_m/2,q_m/2) xi[qm/2,qm/2) 分解为 ∑ j = 0 d s − 1 x i j B s j \sum_{j=0}^{d_s-1} x_{ij} B_s^j j=0ds1xijBsj,其中 x i j ∈ [ 0 , B s ) x_{ij} \in [0,B_s) xij[0,Bs)(符号怎么处理?)

那么 Scale 过程的公式为:
y = ⌊ ∑ i = 1 k ∑ j = 0 d s − 1 x i j ( B s j ⋅ t q ~ i q i ) ⌉ − u ⋅ t ( m o d t ) \begin{aligned} y &= \left\lfloor \sum_{i=1}^k \sum_{j=0}^{d_s-1} x_{ij} \left(B_s^j \cdot \dfrac{t\tilde q_i}{q_i}\right) \right\rceil - u \cdot t \pmod t \end{aligned} y=i=1kj=0ds1xij(Bsjqitq~i)ut(modt)
类似的,预计算
t q i ⋅ [ q ~ i B s j ] q i = ω i j + θ i j ,    ω i j ∈ Z t ,    θ i j ∈ [ − 0.5 , 0.5 ) \dfrac{t}{q_i} \cdot [\tilde q_iB_s^j]_{q_i} = \omega_{ij}+\theta_{ij},\,\, \omega_{ij} \in \mathbb Z_{t},\,\, \theta_{ij} \in [-0.5,0.5) qit[q~iBsj]qi=ωij+θij,ωijZt,θij[0.5,0.5)
其中的 θ i j \theta_{ij} θij 被近似表示为 θ i j ∗ \theta_{ij}^* θij,在线计算 v ∗ = ⌊ ∑ i = 1 k ∑ j = 0 d s − 1 x i j ( ω i j + θ i j ∗ ) ⌉ v^* = \left\lfloor \sum_{i=1}^k \sum_{j=0}^{d_s-1} x_{ij} (\omega_{ij}+\theta_{ij}^*) \right\rceil v=i=1kj=0ds1xij(ωij+θij),累积误差是 ∣ ∑ i ∑ j x i j ϵ i j ∣ < k d s B s ϵ < 1 / 4 |\sum_i\sum_j x_{ij}\epsilon_{ij}| < kd_sB_s\epsilon < 1/4 ijxijϵij<kdsBsϵ<1/4,浮点精度只需满足 ϵ < 1 4 k d s B s \epsilon<\frac{1}{4kd_sB_s} ϵ<4kdsBs1 即可

一般地 q m ≤ 2 63 q_m \le 2^{63} qm263,因此设置 d s = 2 d_s=2 ds=2 即可,对应的 B s ≈ 2 32 B_s \approx 2^{32} Bs232,带入 k ≤ 32 k \le 32 k32,计算出 ϵ < 2 − 40 \epsilon < 2^{-40} ϵ<240(IEEE-754 double)

上述分解技术可以应用到 mixed integer/floating-poinit 的其他 RNS 操作中。另外,计算 ∣ ∑ i ∑ j x i j w i j ∣ < k d s B s t |\sum_i\sum_j x_{ij}w_{ij}| < kd_sB_st ijxijwij<kdsBst,只要它不大于 2 64 2^{64} 264,完全可以累积在 long int 中(不立即取模),直到最后才统一模掉 t t t

BGV Optimizations

[GHS12] 使用 dynamic noise estimation,以确定什么是否需要做模切换,以及模切换的缩放因子是多少。但是这导致了 BGV 的对于噪声估计错误的脆弱性:BGV 是 LSD 编码的,每次的缩放因子 q k q_k qk 大约就是噪声规模。而 BFV 的鲁棒性好很多:它是 MSD 编码的,缩放因子 Q / t Q/t Q/t 是很大的,只需要预设乘法深度,并不需要实时估计噪声规模。

[KPZ21] 为了使得 BGV 更加 Usable(主要是易用,但是性能比 GHS 的差),设置了一个恒定的噪声水平 ∥ v c ∥ ∞ ≈ 1 + δ R B k e y \|v_c\|_\infty \approx 1+\delta_\mathcal RB_{key} vc1+δRBkey(模切换自身导致的噪声增长是 ∥ v m s ∥ ∞ = ( 1 + δ R B k e y ) / 2 \|v_{ms}\|_\infty =(1+\delta_\mathcal RB_{key})/2 vms=(1+δRBkey)/2,设为它的两倍),在同态乘法之前自动执行模切换,将噪声水平降低到 ∥ v c ∥ ∞ \|v_c\|_\infty vc 之下,那么有 ∥ v m u l t ∥ ∞ ≤ δ R t 2 ⋅ ( 2 ∥ v c ∥ ∞ 2 + 2 ∥ v c ∥ ∞ + 1 ) \|v_{mult}\|_\infty \le \frac{\delta_\mathcal R t}{2} \cdot(2\|v_c\|_\infty^2 + 2\|v_c\|_\infty + 1) vmult2δRt(2∥vc2+2∥vc+1)

根据要计算的电路的一些信息:乘法深度 L L L、每层的加法次数 n a d d n_{add} nadd、每层的自同构次数 n k s n_{ks} nks,我们设置合适的比率 Q i + 1 / Q i Q_{i+1}/Q_{i} Qi+1/Qi,使得
Q i Q i + 1 ( ( n a d d + 1 ) ⋅ ∥ v m u l t ∥ ∞ + n k s ⋅ ∥ v k s ∥ ∞ ) + ∥ v m s ∥ ∞ ≤ ∥ v c ∥ ∞ \frac{Q_i}{Q_{i+1}}\Big((n_{add}+1) \cdot \|v_{mult}\|_\infty + n_{ks} \cdot \|v_{ks}\|_\infty\Big) + \|v_{ms}\|_\infty \le \|v_c\|_\infty Qi+1Qi((nadd+1)vmult+nksvks)+vmsvc
加密之后,第一次乘法之前,也会做一些运算,我们设置合适的 Q L + 1 / Q L Q_{L+1}/Q_L QL+1/QL(类似 GHS 变体,加密后立即模约简,将 v f r e s h v_{fresh} vfresh 降低到 v m s v_{ms} vms 水平),
Q L Q L + 1 ( ( n a d d + 1 ) ⋅ ∥ v f r e s h ∥ ∞ + n k s ⋅ ∥ v k s ∥ ∞ ) + ∥ v m s ∥ ∞ ≤ ∥ v c ∥ ∞ \frac{Q_L}{Q_{L+1}}\Big((n_{add}+1) \cdot \|v_{fresh}\|_\infty + n_{ks} \cdot \|v_{ks}\|_\infty\Big) + \|v_{ms}\|_\infty \le \|v_c\|_\infty QL+1QL((nadd+1)vfresh+nksvks)+vmsvc
解密之前,从 Q 1 Q_1 Q1 切换到 Q 0 Q_0 Q0 使得噪声水平为 ∥ v c ∥ ∞ \|v_c\|_\infty vc,我们确定合适的模数,使得解密正确( ∥ v ∥ ∞ < Q 2 t − 1 2 \|v\|_\infty < \frac{Q}{2t}-\frac{1}{2} v<2tQ21),
Q 0 > 2 t ∥ v c ∥ ∞ − t Q_0> 2t\|v_c\|_\infty-t Q0>2tvct
因此我们先确定底层模数 Q 0 Q_0 Q0,接着根据比值 Q i + 1 / Q i Q_{i+1}/Q_i Qi+1/Qi 计算出中间模数 Q i + 1 Q_{i+1} Qi+1,最后根据比值 Q L + 1 / Q L Q_{L+1}/Q_L QL+1/QL 确定顶层模数 Q L + 1 Q_{L+1} QL+1。为了兼容 RNS,我们设置 q i = Q i / Q i − 1 q_i=Q_{i}/Q_{i-1} qi=Qi/Qi1 是满足 q i ≡ 1 ( m o d 2 N ) q_i \equiv 1 \pmod{2N} qi1(mod2N) 的素数(除了 q L + 1 = Q L + 1 / Q L q_{L+1}=Q_{L+1}/Q_L qL+1=QL+1/QL,它只用于模切换,并不用于密文乘法)

Comparison of BGV and BFV

BFV:

  1. 对于很小的明文模数(比如 t = 2 t=2 t=2),随着同态运算噪声的规模不断增长,秘钥切换的噪声远远小于乘法的噪声,基本可以忽略
  2. 缩放因子是 t / Q t/Q t/Q,RNS 使用的素数规模尽可能的大(数量比乘法层数小)接近机器字的规模(比如 60 60 60 比特),因此 RNS 素数的个数 l l l 更少
  3. BFV 的乘法复杂度为 14 l 14l 14l 个 NTT(两个 c , c ′ c,c' c,c 各自从 Q Q Q 扩展到 P Q PQ PQ,其中 P ≈ Q P \approx Q PQ,花费 ( 4 + 4 ) l (4+4)l (4+4)l 个 forward NTT, c t e n s o r c_{tensor} ctensor 回到系数表示以执行 Scale 过程,花费 6 l 6l 6l 个 inverse NTT),这比 BGV 高很多
  4. 移除 Δ \Delta Δ 的 BFV,噪声控制总是比 BGV 更好,但是渐进复杂度比 BGV 更高。对于小模数,实际性能会比 BGV 好一些
  5. Level BFV 相比原始 BFV 提速明显,同态乘法最高有 3-4x 的提速

BGV:

  1. 对于很小的明文模数(比如 t = 2 t=2 t=2),由于模切换降低了噪声的绝对大小,秘钥切换的噪声接近乘法的噪声,影响较为显著
  2. 缩放因子是 Q i / Q i + 1 Q_{i}/Q_{i+1} Qi/Qi+1,RNS 使用的素数规模尽可能的小(数量等于乘法层数)接近噪声的规模(比如 20 , 30 20, 30 20,30 比特),因此 RNS 素数的个数 l ′ l' l 更多(可以多个小模数打包到单个机器字,从而降低复杂度)
  3. BGV(乘法之前)模切换的复杂度为 4 ( l ′ + 1 ) 4(l'+1) 4(l+1) 个 NTT(本来以 NTT 存储,将 [ c ] q k [c]_{q_k} [c]qk 分量回到系数表示,花费 2 2 2 个 NTT,将 [ δ ] Q [\delta]_Q [δ]Q 转换到 NTT 表示,花费 2 l ′ 2l' 2l NTT,输入了 2 2 2 个密文),但是因为 l ′ > l l'>l l>l(甚至 t = 2 t=2 t=2 时有 l ′ > 3 l l'>3l l>3l),所以差距并没有 14 : 4 14:4 14:4 那么大
  4. 对于中等规模(比如 t = 2 16 + 1 t=2^{16}+1 t=216+1)以及大规模(比如 t = 2 30 − 2 18 = 1 t=2^{30}-2^{18}=1 t=230218=1)的明文模数,RNS 素数的规模更大,使得 l ′ / l < 2 l'/l < 2 l/l<2

同态乘法:

在这里插入图片描述

基准的二叉树乘法:

在这里插入图片描述

### 回答1: axinterop.bgv2activexlib是一个在C#编程语言中使用的库文件。它是由.bgv2文件转换成的互操作性程序集,用于在C#项目中与ActiveX控件进行交互。 ActiveX控件是一种可嵌入在网页或其他应用程序中的可视化组件,可以通过脚本语言或编程语言进行操作和交互。而axinterop.bgv2activexlib库文件提供了一种在C#项目中操作ActiveX控件的方法。 使用axinterop.bgv2activexlib库文件,开发人员可以在C#应用程序中直接引用和调用ActiveX控件的功能,通过创建ActiveX控件的实例对象,并调用其属性和方法来实现对控件的控制和操作。这样可以在C#项目中轻松地使用ActiveX控件,实现一些特定的功能需求。 在使用axinterop.bgv2activexlib时,开发人员需要先将.bgv2文件转换成对应的互操作性程序集,并将其添加到C#项目中的引用中。然后可以在代码中实例化该程序集,通过调用其提供的接口、属性和方法来操作ActiveX控件。 总之,axinterop.bgv2activexlib是一个帮助开发人员在C#项目中使用ActiveX控件的库文件。它提供了一种简单、方便的方法,让开发人员能够直接使用C#编程语言与ActiveX控件进行交互和操作。 ### 回答2: axinterop.bgv2activexlib是一个AXInterop组件,它是为了方便在.NET平台中使用bgv2activexlib动态链接库而创建的。 AXInterop是.NET平台中用于与ActiveX组件进行交互的一种技术。而bgv2activexlib则是一个ActiveX动态链接库,它提供了一些特定的功能和接口供.NET开发者使用。 使用axinterop.bgv2activexlib可以实现在.NET平台下直接调用bgv2activexlib动态链接库的功能。通过axinterop.bgv2activexlib,我们可以在.NET的开发环境中,轻松地创建bgv2activexlib的实例对象,并调用其提供的接口和方法。 一个常见的应用场景是,如果我们在.NET平台下进行开发,并需要使用到bgv2activexlib提供的某些功能,而又不想在.NET代码中直接调用COM接口,这时我们可以使用axinterop.bgv2activexlib来实现对bgv2activexlib的封装和调用。 总之,axinterop.bgv2activexlib是一个用于在.NET平台下与bgv2activexlib动态链接库进行交互的组件,它简化了在.NET项目中使用bgv2activexlib的过程,方便了开发者的工作。 ### 回答3: axinterop.bgv2activexlib是一个用于.NET开发的Interop组件。该组件用于与ActiveX控件进行交互,使.NET应用程序能够调用和管理ActiveX控件。 AxInterop.bgv2activexlib是由.NET框架自动生成的Interop组件。当我们在Visual Studio中引入一个ActiveX控件时,Visual Studio会为该控件生成AxInterop.bgv2activexlib,以便我们可以在.NET应用程序中使用该控件。 AxInterop.bgv2activexlib提供了与ActiveX控件进行交互的接口和方法。我们可以使用该组件的对象模型来访问和操作ActiveX控件的属性、方法和事件。通过AxInterop.bgv2activexlib,我们可以实现与ActiveX控件的无缝集成,使得我们可以在.NET应用程序中使用ActiveX控件的功能和特性。 AxInterop.bgv2activexlib的使用非常简单。我们只需将组件添加到.NET项目的引用中,然后在代码中实例化Interop组件对象即可。通过该组件对象,我们可以调用ActiveX控件的方法、获取和设置其属性,以及处理其事件。 总之,AxInterop.bgv2activexlib是一个通过.NET框架生成的Interop组件,用于与ActiveX控件进行交互。它提供了访问和操作ActiveX控件的接口和方法,使得我们可以在.NET应用程序中轻松使用ActiveX控件的功能。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值