参考文献:
[KDE+23] 提出可以使用 FHEW-like 实现 BV-like 的通用自举程序。文章说给出了 C++ 实现,不过没有给代码链接;文章中说性能依旧需要继续改进,没有给出具体的数据。
首先,我们定义一些密文类型:
简记无噪声的密文为 R L W E 0 ( u ) RLWE^0(u) RLWE0(u),这里 u u u 是其(无编码的)相位。
[KDE+23] 首先介绍了一个核心算法,它用于将较小密文模数 q q q 下的消息,提升到更大的密文模数 Q Q Q。这需要消除模 Q Q Q 下出现的 q q q-overflower,因此明显需要自举程序。
我们设置 q = 2 N q=2N q=2N,给定相位是 ∥ u ∥ ∞ ≤ c < N / 2 \|u\|_\infty \le c
由于 c < N / 2 c
∑ k = 0 N / n − 1 R L W E ( u ( i + n k ) ) ⋅ X n k = R L W E ( u ( i , n ) : = ∑ k = 0 N / n − 1 u ( i + n k ) X n k ) \sum_{k=0}^{N/n-1} RLWE(u^{(i+nk)}) \cdot X^{nk} = RLWE\left(u^{(i,n)}:=\sum_{k=0}^{N/n-1} u^{(i+nk)} X^{nk}\right) k=0∑N/n−1RLWE(u(i+nk))⋅Xnk=RLWE u(i,n):=k=0∑N/n−1u(i+nk)Xnk
因为间隔 n > 2 c n>2c n>2c 足够大,因此获得的相位 u ( i , n ) u^{(i,n)} u(i,n) 的位置 n k , k ∈ [ N / n ] nk,k\in[N/n] nk,k∈[N/n] 恰好就是 Δ u i + n k \Delta u_{i+nk} Δui+nk 本身。
接着利用 [CDKS21] 的打包技术,自同构 τ 1 + 2 N / n \tau_{1+2N/n} τ1+2N/n 应用到 u ( i , n ) u^{(i,n)} u(i,n),它保持位置 X n k X^{nk} Xnk 的系数,翻转位置 X n k + n / 2 X^{nk+n/2} Xnk+n/2 的系数符号;剩余位置的系数被打乱或者变号(我们不关心)。因此,对于 i ∈ [ n / 2 ] i\in[n/2] i∈[n/2],计算
R L W E ( 2 ⋅ u ( i , n / 2 ) ) = ( R L W E ( u ( i , n ) ) + X n / 2 ⋅ R L W E ( u ( i + n / 2 , n ) ) ) + τ 1 + 2 N / n ( R L W E ( u ( i , n ) ) − X n / 2 ⋅ R L W E ( u ( i + n / 2 , n ) ) ) \begin{aligned} RLWE(2\cdot u^{(i,n/2)}) &= \left(RLWE(u^{(i,n)})+X^{n/2}\cdot RLWE(u^{(i+n/2,n)})\right)\\ &+ \tau_{1+2N/n}\left(RLWE(u^{(i,n)})-X^{n/2}\cdot RLWE(u^{(i+n/2,n)})\right) \end{aligned} RLWE(2⋅u(i,n/2))=(RLWE(u(i,n))+Xn/2⋅RLWE(u(i+n/2,n)))+τ1+2N/n(RLWE(u(i,n))−Xn/2⋅RLWE(u(i+n/2,n)))
这就将 N / n N/n N/n 个密文合并为了 N / 2 n N/2n N/2n 个密文。迭代执行对数次,可以最终合并出单个密文 R L W E ( n ⋅ Δ u ) RLWE(n \cdot \Delta u) RLWE(n⋅Δu)。为了移除额外的因子 n n n,
打包算法:
使用的密文模数 q q q 是二的幂次,相位形如
c t ( s ) = m + e + q v ∈ R ct(s) = m+e+qv \in R ct(s)=m+e+qv∈R
令 q ′ = q / 2 N q'=q/2N q′=q/2N,计算 c t ′ = c t ( m o d q ′ ) ct'=ct \pmod{q'} ct′=ct(modq′),那么
c t ′ ( s ) = m + e + q ′ u ∈ R ct'(s) = m+e+q'u \in R ct′(s)=m+e+q′u∈R
我们可计算
c t p r e p = ( a − [ a ] q ′ q ′ , b − [ b ] q ′ q ′ ) ∈ R 2 N 2 ct_{prep} = \left( \frac{a-[a]_{q'}}{q'}, \frac{b-[b]_{q'}}{q'} \right) \in R_{2N}^2 ctprep=(q′a−[a]q′,q′b−[b]q′)∈R2N2
易知 c t p r e p ( s ) = ( q v − q ′ u ) / q ′ = − u + 2 N v ct_{prep}(s)=(qv-q'u)/q'=-u+2Nv ctprep(s)=(qv−q′u)/q′=−u+2Nv,从而它是 R L W E 2 N , s 0 ( − u ) RLWE_{2N,s}^0(-u) RLWE2N,s0(−u)
现在,利用 Scaled Modulus 过程,可以获得 c t s m = R L W E Q , s ( − q ′ u ) ct_{sm}=RLWE_{Q,s}(-q'u) ctsm=RLWEQ,s(−q′u)
继续计算 c t b o o t = c t s m + c t ′ ( m o d Q ) ct_{boot} = ct_{sm}+ct' \pmod Q ctboot=ctsm+ct′(modQ),它满足
c t b o o t ( s ) = − q ′ u + e s m + m + e + q ′ u = m + ( e + e s m ) ct_{boot}(s) = -q'u+e_{sm} + m+e+q'u = m+(e+e_{sm}) ctboot(s)=−q′u+esm+m+e+q′u=m+(e+esm)
自举算法为:
对于稀疏打包的密文(这里指相位落在子环内),假设 c t ( s ) = m ( Y ) + q ⋅ v ( X ) ct(s)=m(Y)+q\cdot v(X) ct(s)=m(Y)+q⋅v(X),其中 Y = X N / n Y=X^{N/n} Y=XN/n 是子环的本原单位根。
利用自同构 X → X − X n + 1 + X 2 n + 1 − ⋯ − X N − n + 1 X\to X-X^{n+1}+X^{2n+1}-\cdots-X^{N-n+1} X→X−Xn+1+X2n+1−⋯−XN−n+1 的性质,它将 ( N / n ) ∣ k (N/n) \mid k (N/n)∣k 的那些项 X k X^k Xk 的系数翻倍 N / n N/n N/n 因子,其余的项的系数都被消除。因此,我们可以使用同态自同构的加和,将 Y Y Y 子环以外的系数全都消除,获得 c t ′ ( s ) = m ( Y ) + q ⋅ v ′ ( Y ) ct'(s)=m(Y)+q\cdot v'(Y) ct′(s)=m(Y)+q⋅v′(Y)
现在,我们只需对这些稀疏的系数执行 Scaled Modulus 过程即可。
使用的密文模数 q q q 是素数的乘积,相位形如
c t ( s ) = m + e + q v ∈ R ct(s) = m+e+qv \in R ct(s)=m+e+qv∈R
首先计算 c t ′ = 2 N ⋅ c t ( m o d q ) ct'=2N\cdot ct \pmod q ct′=2N⋅ct(modq),
c t ′ ( s ) = 2 N ⋅ ( m + e ) + q u ∈ R ct'(s) = 2N\cdot(m+e) + qu \in R ct′(s)=2N⋅(m+e)+qu∈R
然后计算
c t p r e p = ( 2 N a − [ 2 N a ] q ′ q ′ , 2 N b − [ 2 N b ] q ′ q ′ ) ∈ R 2 N 2 ct_{prep} = \left( \frac{2Na-[2Na]_{q'}}{q'}, \frac{2Nb-[2Nb]_{q'}}{q'} \right) \in R_{2N}^2 ctprep=(q′2Na−[2Na]q′,q′2Nb−[2Nb]q′)∈R2N2
它的相位是 − u ( m o d 2 N ) -u \pmod{2N} −u(mod2N),利用 Scaled Modulus 过程获得 c t s m = R L W E Q p , s ( − q u ) ct_{sm}=RLWE_{Qp,s}(-qu) ctsm=RLWEQp,s(−qu),其中的 p p p 是 auxiliary prime 用于控制噪声
计算 c t ′ ′ = c t s m + c t ′ ( m o d Q p ) ct''=ct_{sm}+ct' \pmod{Qp} ct′′=ctsm+ct′(modQp),满足
c t ′ ′ ( s ) = − q u + e s m + 2 N ⋅ ( m + e ) + q u = 2 N m + ( 2 N e + e s m ) ct''(s) = -qu+e_{sm} + 2N\cdot(m+e)+qu = 2Nm + (2Ne+e_{sm}) ct′′(s)=−qu+esm+2N⋅(m+e)+qu=2Nm+(2Ne+esm)
最后将它乘以 p / 2 N p/2N p/2N 接着缩放 p p p 因子,获得
c t b o o t ( s ) = m + ( e + e s m / 2 N + e r s ) ( m o d Q ) ct_{boot}(s) = m + (e+e_{sm}/2N + e_{rs}) \pmod Q ctboot(s)=m+(e+esm/2N+ers)(modQ)
完整的自举程序为
模数是二的幂次。与 CKKS 的自举步骤基本一样,
模数是素数乘积。与 CKKS 的自举步骤基本一样,
BFV 的自举略有不同,它并不是消除 overflow 去提升模数,而是需要降低噪声。
模数 Q Q Q 是二的幂次,密文相位是
c t ( s ) = e + Q t m ∈ R Q ct(s) = e+\frac{Q}{t}m \in R_Q ct(s)=e+tQm∈RQ
首先计算 c t ′ = t ⋅ c t ( m o d Q ) ct'=t \cdot ct \pmod Q ct′=t⋅ct(modQ),
c t ′ ( s ) = t e + Q v ∈ R ct'(s) = te + Qv \in R ct′(s)=te+Qv∈R
令 Q ′ = Q / 2 N Q'=Q/2N Q′=Q/2N,接着计算 c t ′ ′ = c t ′ ( m o d Q ′ ) ct''=ct' \pmod{Q'} ct′′=ct′(modQ′),
c t ′ ′ ( s ) = t e + Q ′ u ∈ R ct''(s) = te + Q'u \in R ct′′(s)=te+Q′u∈R
于是可以计算
c t p r e p = c t ′ − c t ′ ′ Q ′ ∈ R 2 N 2 ct_{prep} = \frac{ct'-ct''}{Q'} \in R_{2N}^2 ctprep=Q′ct′−ct′′∈R2N2
它的相位是 − u + 2 N v -u+2Nv −u+2Nv,利用 Scaled Modulus 过程获得 c t s m = R L W E Q t , s ( Q ′ u ) ct_{sm}=RLWE_{Qt,s}(Q'u) ctsm=RLWEQt,s(Q′u)
然后计算 c t ′ ′ ′ = c t s m + t ⋅ c t − c t ′ ′ ( m o d Q t ) ct'''=ct_{sm}+t \cdot ct-ct'' \pmod{Qt} ct′′′=ctsm+t⋅ct−ct′′(modQt),
c t ′ ′ ′ ( s ) = ( Q ′ u + e s m ) + ( t e + Q m ) − ( t e + Q ′ u ) = Q m + e s m ct'''(s) = (Q'u+e_{sm}) + (te+Qm) - (te+Q'u) = Qm+e_{sm} ct′′′(s)=(Q′u+esm)+(te+Qm)−(te+Q′u)=Qm+esm
最后缩放 t t t 因子,获得 c t b o o t = R L W E Q , s ( m ) ct_{boot}=RLWE_{Q,s}(m) ctboot=RLWEQ,s(m)
完整的自举算法为:
模数是素数乘积。就是上述自举算法的变体,
[KDE+23] 还给出了压缩 BK 的方法。
采取三元秘密,原本的 BK 形如: R G S W s ( s i + ) RGSW_s(s_i^+) RGSWs(si+) 以及 R G S W s ( s i − ) RGSW_s(s_i^-) RGSWs(si−),其中的 s i + = [ s i = 1 ] s_i^+=[s_i=1] si+=[si=1] 和 s i − = [ s i = − 1 ] s_i^-=[s_i=-1] si−=[si=−1] 作为 CMux 控制位。
为了减少通信开销,[KDE+23] 仅生成 R L W E s ′ ( s ± ) RLWE_s'(s^\pm) RLWEs′(s±) 和 R L W E s ′ ( s 2 ) RLWE_s'(s^2) RLWEs′(s2) 两个密文,其中
s ± ( X ) = ∑ i = 0 N − 1 s i ± X i s^{\pm}(X) = \sum_{i=0}^{N-1} s_i^\pm X^i s±(X)=i=0∑N−1si±Xi
利用自同构的保持/翻转各个位置系数的符号的特点,我们可以根据 R L W E s ′ ( s ± ) RLWE_s'(s^\pm) RLWEs′(s±) 恢复出全部的 R L W E s ′ ( s i ± ) RLWE_s'(s_i^\pm) RLWEs′(si±)。算法为:
消除因子 N N N 是容易的。接着,利用计算出的各个分量 R L W E s ( g j s i ± ) = ( a i j , b i j ) RLWE_s(g_js_i^\pm)=(a_{ij},b_{ij}) RLWEs(gjsi±)=(aij,bij),可以计算出:
R L W E s ( a i j ⋅ s 2 + b i j ⋅ s ) = R L W E s ( g j s i ± ⋅ s ) RLWE_s(a_{ij} \cdot s^2 + b_{ij} \cdot s) = RLWE_s(g_js_i^\pm\cdot s) RLWEs(aij⋅s2+bij⋅s)=RLWEs(gjsi±⋅s)
它们组成了 R L W E s ′ ( s i ± s ) RLWE_s'(s_i^\pm s) RLWEs′(si±s),于是我们就得到了
R G S W s ( s i ± ) = ( R L W E s ′ ( s i ± ) , R L W E s ′ ( s i ± s ) ) RGSW_s(s_i^\pm) = (RLWE_s'(s_i^\pm), RLWE_s'(s_i^\pm s)) RGSWs(si±)=(RLWEs′(si±),RLWEs′(si±s))
为了减少内存开销,[KDE+23] 还提出了动态重构 BK 的方法,用完就立即丢弃。
这儿也是利用了自同构,消除常数项以外的其他系数。我们首先乘以 X − i X^{-i} X−i,从而提取任意位置的 s i ± s_i^\pm si± 的密文。算法为:
[KDE+23] 提出了一种新的盲旋转过程,它不需要重构出 R L W E s ′ ( s i ± ⋅ s ) RLWE_s'(s_i^\pm \cdot s) RLWEs′(si±⋅s),而是直接根据 R L W E s ′ ( s i ± ) RLWE_s'(s_i^\pm) RLWEs′(si±) 和 R L W E s ′ ( s 2 ) RLWE_s'(s^2) RLWEs′(s2) 来计算:给定 A C C = R L W E s ( f ) = ( a , b ) ACC=RLWE_s(f)=(a,b) ACC=RLWEs(f)=(a,b),给定密文 L W E s ( u ) = ( α , β ) LWE_s(u)=(\alpha,\beta) LWEs(u)=(α,β),先计算
a ⋅ R L W E s ′ ( X α i s i ) = R L W E s ′ ( a ⋅ X α i s i ) = ( a ′ , b ′ ) a\cdot RLWE_s'(X^{\alpha_is_i}) = RLWE_s'(a\cdot X^{\alpha_is_i}) = (a',b') a⋅RLWEs′(Xαisi)=RLWEs′(a⋅Xαisi)=(a′,b′)
然后计算
a ′ ⋅ R L W E s ′ ( s 2 ) + ( b ′ , 0 ) = R L W E s ( a ′ s 2 + b ′ s ) = R L W E s ( a s ⋅ X α i s i ) a' \cdot RLWE_s'(s^2) + (b',0) = RLWE_s(a's^2+b's) = RLWE_s(as \cdot X^{\alpha_is_i}) a′⋅RLWEs′(s2)+(b′,0)=RLWEs(a′s2+b′s)=RLWEs(as⋅Xαisi)
最后计算出
R L W E s ( a s ⋅ X α i s i ) + R L W E s ( b ⋅ X α i s i ) = R L W E s ( f ⋅ X α i s i ) RLWE_s(as \cdot X^{\alpha_is_i}) + RLWE_s(b \cdot X^{\alpha_is_i}) = RLWE_s(f \cdot X^{\alpha_is_i}) RLWEs(as⋅Xαisi)+RLWEs(b⋅Xαisi)=RLWEs(f⋅Xαisi)
对于每个 i i i 都这么计算,最终可以获得 R L W E s ( f ⋅ X u ) RLWE_s(f \cdot X^u) RLWEs(f⋅Xu)