CKKS自举笔记(CKKS Bootstrapping)

article/2025/10/22 17:27:43

文章目录

  • CKKS Bootstrapping流程
    • 流程的框架
    • 如何做同态取模操作
      • 直接泰勒展开(naive idea)
      • 采用二倍角公式来拟合(欧密2018)
    • 如何做同态编码或解码
      • CKKS的编码和解码基础知识(明文下面怎么做)
      • 同态的旋转、共轭,和同态矩阵向量乘法(密文状态下怎么做)
        • 同态密钥转换
        • 同态的旋转和共轭
        • 同态的矩阵向量乘法
    • CKKS BootStrapping方案整体(将上面提到的方法结合一下)
      • 其余优化操作:
      • 原始方案的效果:
  • 优化方案:
    • 优化思路1:更改拟合函数(欧密2022a)

CKKS的Bootstrapping技术在18年提出 1。CKKS无法使用常规的Bootstapping技术,即通过运行同态的解密电路来做噪声刷新,因为CKKS的解密电路仍然保留噪声,不像BGV和BFV那样完全消除噪声。

因此现在CKKS的Bootstrapping都是通过扩模的方法:将初始的密文 c t \sf ct ct认为是在一个较小的模数 q q q上面,其中 [ ⟨ c t , s k ⟩ ] q = m [\langle{\sf ct},{\sf sk}\rangle]_q = m [⟨ct,sk]q=m。可以直接将其视为一个大模数 q L q_L qL下面的密文 c t ′ \sf ct' ct,但 c t ′ \sf ct' ct包含的明文是 [ ⟨ c t ′ , s k ⟩ ] q L = m + q ⋅ I [\langle {\sf ct'},{\sf sk}\rangle]_{q_L} =m + q\cdot I [⟨ct,sk]qL=m+qI,因此要通过一个取模的操作将 q ⋅ I q \cdot I qI消除。如何进行同态地取模是CKKS Bootstrapping的核心问题。

CKKS Bootstrapping流程

流程的框架

主要包含四步:扩模(ModRaise),同态编码(CoeffToSlot),同态取模(EvalMod),同态解码(SlotToCoeff)。

m ( m o d q ) → M o d R a i s e m + q I ( m o d Q ) → C o e f f T o S l o t ( m + q I ) ∗ → E v a l M o d ( m ) ∗ → S l o t T o C o e f f m ( m o d Q ′ ) m \pmod{q}\xrightarrow{\mathsf{ModRaise}} m+qI \pmod{Q}\xrightarrow{\mathsf{CoeffToSlot}}(m+qI)^* \xrightarrow{\mathsf{EvalMod}} (m)^* \xrightarrow{\mathsf{SlotToCoeff}} m \pmod{Q'} m(modq)ModRaise m+qI(modQ)CoeffToSlot (m+qI)EvalMod (m)SlotToCoeff m(modQ)

扩模(ModRaise):一个密文 c t {\sf ct} ct包含的明文为 m ( X ) = [ ⟨ c t , s k ⟩ ] q m(X) = [\langle {\sf ct},{\sf sk} \rangle]_q m(X)=[⟨ct,sk]q,则 t ( X ) = ⟨ c t , s k ⟩ = q I ( X ) + m ( X ) ≡ m ( X ) m o d q t(X)=\langle {\sf ct},{\sf sk} \rangle=q I(X) + m(X) \equiv m(X) \bmod q t(X)=ct,sk=qI(X)+m(X)m(X)modq,其中 ∥ I ( X ) ∥ ∞ < K = O ( h ) \|I(X)\|_{\infty} < K = O(\sqrt{h}) I(X)<K=O(h )。这里的 h h h s k \sf sk sk中1的数量。取一个足够大的模数 Q Q Q,那么 [ t ( X ) ] Q = t ( X ) [t(X)]_Q = t(X) [t(X)]Q=t(X)

Sparse Key 一般来说,同态加密中 s k \mathsf{sk} sk中系数从 ( − 1 , 0 , 1 ) (-1,0,1) (1,0,1)中选取,每个系数选取到的概率相同, n n n位的密钥的 h = 2 / 3 n h=2/3n h=2/3n。而在需要使用Bootstrapping的方案里面,会设定 h = 64 h=64 h=64,可以令 K K K尽可能地小。但会导致安全性降低,因此要取比较大的 n n n来保证安全性,这种密钥选取叫做稀疏密钥(Sparsed Key)。如何不基于稀疏密钥构造Bootstrapping也是一个研究点。

同态编码(CoeffToSlot):我们要对多项式的系数进行一个取模操作,但我们使用同态的加法和乘法来拟合取模操作,而同态的加法和乘法是针对Slot中的数做的,因此,要将系数放进Slot中。相当于做一个同态的密文编码操作,可以使用乘DFT矩阵的方法来实现。但这里有一个问题,多项式的系数是 n n n个,而明文Slot只有 n / 2 n/2 n/2个,因此这一步会得到两个密文分别加密 z 0 ′ = ( t 0 , . . . , t N 2 − 1 ) z_0'=(t_0,...,t_{\frac{N}{2}-1}) z0=(t0,...,t2N1) z 1 ′ = ( t N 2 , . . . , t N − 1 ) z_1'=(t_{\frac{N}{2}},...,t_{N-1}) z1=(t2N,...,tN1)

同态取模操作(EvalMod):使用加法和乘法来拟合取模操作,这一步会产生一定的噪声。因为加法和乘法执行过程有噪声,同时拟合函数本身使用了三角函数来对取模函数拟合,三角函数和取模之间还存在一定的误差,这一部分也会形成噪声。噪声的大小与消息和 q q q之间的大小关系 ϵ = m q \epsilon = \frac{m}{q} ϵ=qm决定。因此,令 m m m尽可能的小也是一种控制噪声的方法。

同态解码(SlotToCoeff):同态解码操作是同态编码的逆操作。将Slot中的数放回系数中。也是通过一个矩阵乘法的方式来做。

总结:可以看到,CKKS的Bootstrapping都是直接在密文上进行操作,比如乘一个DFT矩阵和DFT逆矩阵,以及密文上面的多项式操作。因此,相比其他Bootstrapping技术存在的优势是:

  1. 不需要Bootstrapping密钥
  2. 计算复杂度是 O ( log ⁡ ( ∣ s k ∣ 1 ⋅ q ) ) O(\log(|sk|_1 \cdot q)) O(log(sk1q))
  3. 需要的内存很小,只有一个密文反复计算

如何做同态取模操作

取模操作 F ( x ) = [ x ] q F(x)=[x]_q F(x)=[x]q本身并不是一个连续的周期函数,因此无法直接对取模操作进行多项式拟合。但是1观察到由于 m < < q m << q m<<q,所以我们最终要拟合的部分只有以 q q q为间隔的中间一小部分,因此,如下图所示,我们需要计算的部分只有黑色的直线区域,因此,可以使用一个三角函数 sin ⁡ \sin sin来进行拟合。这里拟合的范围是 [ − K q , K q ] [-Kq,Kq] [Kq,Kq],原因在于 t ( X ) = ⟨ c t , s k ⟩ = q I ( X ) + m ( X ) ≡ m ( X ) m o d q , ∥ I ( X ) ∥ ∞ < K t(X)=\langle {\sf ct},{\sf sk} \rangle=q I(X) + m(X) \equiv m(X) \bmod q, \|I(X)\|_{\infty}<K t(X)=ct,sk=qI(X)+m(X)m(X)modq,I(X)<Kimage-20221207153152667

在欧密20181的方案中,直接采用了 S ( x ) = q 2 π sin ⁡ ( 2 π q x ) S(x)=\frac{q}{2\pi}\sin(\frac{2\pi}{q}x) S(x)=2πqsin(q2πx)函数对 [ x ] q [x]_q [x]q函数进行拟合,但这个拟合函数这样最终会有大约 ∣ [ x ] q − S ( x ) ∣ ≤ 2 π 2 3 q ϵ 3 → O ( q ϵ 3 ) |[x]_q-S(x)|\le \frac{2\pi^2}{3} q \epsilon^3 \to O(q\epsilon^3) [x]qS(x)32π2qϵ3O(qϵ3)的误差,其中 ϵ = m q \epsilon=\frac{m}{q} ϵ=qm

误差的推导为:(根据1阶泰勒展开式)
∣ [ x ] q − S ( x ) ∣ = q 2 π ∣ 2 π m q − sin ⁡ ( 2 π m q ) ∣ ≤ q 2 π ⋅ 1 3 ! ( 2 π ∣ m ∣ q ) 3 = O ( q ⋅ ∣ m ∣ 3 q 3 ) = O ( q ϵ 3 ) |[x]_q-S(x)|=\frac{q}{2 \pi}\left|\frac{2 \pi m}{q}-\sin \left(\frac{2 \pi m}{q}\right)\right| \leq \frac{q}{2 \pi} \cdot \frac{1}{3 !}\left(\frac{2 \pi|m|}{q}\right)^{3}=O\left(q \cdot \frac{|m|^{3}}{q^{3}}\right)=O(q\epsilon^3) [x]qS(x)=2πq q2πmsin(q2πm) 2πq3!1(q2πm)3=O(qq3m3)=O(qϵ3)

sin ⁡ ( x ) \sin(x) sin(x)的泰勒展开式为 sin ⁡ x = ∑ n = 0 ∞ ( − 1 ) n ( 2 n + 1 ) ! x 2 n + 1 \sin x=\sum_{n=0}^{\infty} \frac{(-1)^{n}}{(2 n+1) !} x^{2 n+1} sinx=n=0(2n+1)!(1)nx2n+1

直接泰勒展开(naive idea)

一个很直接的想法来拟合 S ( x ) S(x) S(x)是通过泰勒展开为一个高次的多项式,然后采用Paterson-Stockmeyer方法2来运算这个多项式。

泰勒展开多项式拟合

泰勒展开式:
f ( x ) = ∑ j = 0 d − 1 f ( n ) ( x 0 ) d ! ⋅ ( x − x 0 ) d f(x)=\sum_{j=0}^{d-1}\frac{f^{(n)}(x_0)}{d!}\cdot(x-x_0)^d f(x)=j=0d1d!f(n)(x0)(xx0)d
我们要执行函数 [ x ] q [x]_q [x]q的定义域是 [ − K q , K q ] [-Kq,Kq] [Kq,Kq],这里的 K = O ( λ ) K=O(\lambda) K=O(λ)。我们可以直接对 S ( x ) S(x) S(x)执行泰勒展开,得到
S ′ ( x ) = q 2 π ∑ j = 0 d − 1 ( − 1 ) j ( 2 j + 1 ) ! ( 2 π x q ) 2 j + 1 S'(x)=\frac{q}{2\pi} \sum_{j=0}^{d-1}\frac{(-1)^j}{(2j+1)!}\left(\frac{2\pi x}{q}\right)^{2j+1} S(x)=2πqj=0d1(2j+1)!(1)j(q2πx)2j+1
因为 ∣ x ∣ < K q |x|<Kq x<Kq,所以其中 ∣ S ( x ) − S ′ ( x ) ∣ < q 2 π ⋅ 1 ( 2 d + 1 ) ! ( 2 π K ) 2 d + 1 |S(x)-S'(x)|<\frac{q}{2\pi}\cdot \frac{1}{(2d+1)!}(2\pi K)^{2d+1} S(x)S(x)<2πq(2d+1)!1(2πK)2d+1

可以用斯特灵公式[^ strling]进行一个推导:$n!\sim \sqrt{2 \pi n}\left(\frac{n}{e} \right)^n $。
q 2 π ⋅ 1 ( 2 d + 1 ) ! ( 2 π K ) 2 d + 1 = q 2 π ⋅ ( 2 π e K ) 2 d + 1 2 π ( 2 d + 1 ) ⋅ ( 2 d + 1 ) 2 d + 1 \frac{q}{2\pi}\cdot \frac{1}{(2d+1)!}(2\pi K)^{2d+1}=\frac{q}{2\pi} \cdot \frac{{(2\pi e K)}^{2d+1}}{\sqrt{2\pi (2d+1)}\cdot (2d+1)^{2d+1} } 2πq(2d+1)!1(2πK)2d+1=2πq2π(2d+1) (2d+1)2d+1(2πeK)2d+1
当我们取到阶为 d = O ( K q ) d=O(Kq) d=O(Kq)时,这个误差就足够小到可以忽略了。

我们可以用Paterson-Stockmeyer方法2来用 O ( d ) = O ( K q ) O(\sqrt{d})=O(\sqrt{Kq}) O(d )=O(Kq )次的乘法来运算这个多项式。

Paterson-Stockmeyer方法计算多项式

Paterson-Stockmeyer方法可以用 O ( n ) O(\sqrt{n}) O(n )次乘法执行 n n n次多项式,具体如下:对于一个 n n n阶多项式 F ( x ) = ∑ i = 0 n − 1 a i x i F(x)=\sum_{i=0}^{n-1}a_ix^i F(x)=i=0n1aixi,令 n = k ⋅ m n=k\cdot m n=km
F ( x ) = a k m − 1 x k m − 1 + ⋯ + a 1 x + a 0 = ( a k m − 1 x k − 1 + ⋯ + a k ( m − 1 ) ) ⋅ x k ( m − 1 ) + ( a k ( m − 1 ) − 1 x k − 1 + ⋯ + a k ( m − 2 ) ) ⋅ x k ( m − 2 ) . . . + ( a 2 k − 1 x k − 1 + ⋯ + a k ) ⋅ x k + a k − 1 x k − 1 + ⋯ + a 0 . \begin{aligned} F(x)&=a_{km-1}x^{km-1}+ \cdots+a_1x+a_0\\ &=(a_{km-1}x^{k-1}+\cdots + a_{k(m-1)})\cdot x^{k(m-1)}\\ &\quad +(a_{k(m-1)-1}x^{k-1}+\cdots +a_{k(m-2)})\cdot x^{k(m-2)}\\ &\quad... \\ &\quad + (a_{2k-1}x^{k-1} + \cdots +a_{k})\cdot x^{k}\\ &\quad + a_{k-1}x^{k-1} + \cdots +a_0. \end{aligned} F(x)=akm1xkm1++a1x+a0=(akm1xk1++ak(m1))xk(m1)+(ak(m1)1xk1++ak(m2))xk(m2)...+(a2k1xk1++ak)xk+ak1xk1++a0.
我们需要算的是 x 1 , x 2 , . . . , x k x^1,x^2,...,x^k x1,x2,...,xk k k k次乘法, x 2 k , . . . , x ( m − 1 ) k x^{2k},...,x^{(m-1)k} x2k,...,x(m1)k m m m次乘法,以及 m m m行中每一行的一次乘法,当 k = n k=\sqrt{n} k=n 的时候,乘法的次数最优。

但就算如此还是需要 O ( K q ) O(\sqrt{Kq}) O(Kq )次的乘法,仍然是非常大的计算量。

采用二倍角公式来拟合(欧密2018)

直接泰勒展开存在的问题是:
S ( x ) = q 2 π s i n ( 2 π x q ) ≈ S ′ ( x ) = q 2 π ∑ j = 0 d − 1 ( − 1 ) j ( 2 j + 1 ) ! ( 2 π x q ) 2 j + 1 S(x)=\frac{q}{2\pi}sin\left(\frac{2\pi x}{q}\right)\approx S'(x)=\frac{q}{2\pi} \sum_{j=0}^{d-1}\frac{(-1)^j}{(2j+1)!}\left(\frac{2\pi x}{q}\right)^{2j+1} S(x)=2πqsin(q2πx)S(x)=2πqj=0d1(2j+1)!(1)j(q2πx)2j+1
需要取到 d = O ( K q ) d=O(Kq) d=O(Kq)时才可以保证 S ′ ( x ) − S ( x ) S'(x)-S(x) S(x)S(x)足够小。乘法的次数就算使用了2中的方法还是太大了。

我们可以考虑用二倍角公式来构造一个 O ( log ⁡ d ) O(\log{d}) O(logd)复杂度的拟合方法1

注意到在欧拉公式中, exp ⁡ ( i θ ) = cos ⁡ ( θ ) + i ⋅ sin ⁡ ( θ ) \exp(i\theta)=\cos(\theta) + i\cdot \sin(\theta) exp(iθ)=cos(θ)+isin(θ),可以得出 sin ⁡ ( θ ) = 1 2 i ⋅ ( exp ⁡ ( i θ ) − exp ⁡ ( − i θ ) ) \sin(\theta) = \frac{1}{2}i \cdot \left(\exp(i\theta)-\exp(-i\theta)\right) sin(θ)=21i(exp(iθ)exp(iθ))

因此可以通过 exp ⁡ ( i 2 π x q ) \exp(\frac{i2\pi x}{q}) exp(qi2πx)来得到 sin ⁡ ( 2 π x q ) \sin(\frac{2\pi x}{q}) sin(q2πx)

exp ⁡ ( i 2 π x q ) \exp(\frac{i2\pi x}{q}) exp(qi2πx)函数可以通过递归 exp ⁡ ( i 2 π x 2 r q ) \exp(\frac{i2\pi x}{2^rq}) exp(2rqi2πx)的平方来得到,原因如下:
{ exp ⁡ ( i θ ) = cos ⁡ θ + i sin ⁡ θ , exp ⁡ ( 2 i θ ) = ( exp ⁡ ( i θ ) ) 2 , ← { cos ⁡ ( 2 θ ) = cos ⁡ 2 θ − sin ⁡ 2 θ , sin ⁡ ( 2 θ ) = 2 cos ⁡ θ ⋅ sin ⁡ θ . \left\{ \begin{aligned} &\exp(i\theta)=\cos\theta+ i \sin\theta,\\ &\exp(2i\theta)=(\exp(i\theta))^2, \end{aligned} \right. \gets \left\{ \begin{aligned} &\cos(2\theta)=\cos^2\theta - \sin^2\theta,\\ &\sin(2\theta)=2\cos\theta\cdot\sin\theta. \end{aligned} \right. {exp(iθ)=cosθ+isinθ,exp(2iθ)=(exp(iθ))2,{cos(2θ)=cos2θsin2θ,sin(2θ)=2cosθsinθ.
完整的调用流程如下:
在这里插入图片描述

最初是用 P 0 ( t ) P_0(t) P0(t)来拟合 exp ⁡ ( 2 π i t 2 r ⋅ q ) \exp\left(\frac{2\pi i t}{2^r \cdot q}\right) exp(2rq2πit),由于取值范围比较小,因此只要取到一个很小的阶 d 0 d_0 d0就可以令误差足够小。然后通过不断取平方的方式来得到 exp ⁡ ( 2 π i t q ) \exp(\frac{2\pi it}{q}) exp(q2πit)

初始的噪声为:
∣ P 0 ( t ) − Δ ⋅ exp ⁡ ( 2 π i t 2 r ⋅ q ) ∣ ≤ Δ ( d 0 + 1 ) ! ∣ 2 π K 2 r ∣ d 0 + 1 |P_0(t) - \Delta \cdot\exp\left(\frac{2\pi i t}{2^r \cdot q}\right)|\le \frac{\Delta}{(d_0+1)!}|\frac{2 \pi K}{2^r}|^{d_0+1} P0(t)Δexp(2rq2πit)(d0+1)!Δ2r2πKd0+1

平方 r r r次之后的噪声为:
∣ P r ( t ) − Δ ⋅ exp ⁡ ( 2 π i t q ) ∣ ≤ Δ ⋅ 2 r ( d 0 + 1 ) ! ( 2 π K 2 r ) d 0 + 1 ≤ Δ ⋅ 2 r 2 π ( d 0 + 1 ) ( e π K 2 r − 1 ( d 0 + 1 ) ) d 0 + 1 \begin{aligned} \left|P_{r}(t)-\Delta \cdot\exp\left(\frac{2\pi i t}{q}\right)\right| & \leq \frac{\Delta \cdot 2^{r}}{\left(d_{0}+1\right) !}\left(\frac{2 \pi K}{2^{r}}\right)^{d_{0}+1} \\ & \leq \frac{\Delta \cdot 2^{r}}{\sqrt{2 \pi\left(d_{0}+1\right)}}\left(\frac{e \pi K}{2^{r-1}\left(d_{0}+1\right)}\right)^{d_{0}+1} \end{aligned} Pr(t)Δexp(q2πit) (d0+1)!Δ2r(2r2πK)d0+12π(d0+1) Δ2r(2r1(d0+1)eπK)d0+1
因此从参数选取上来说,只要选 d 0 = O ( 1 ) , r = O ( log ⁡ ( K q ) ) d_0=O(1),r=O(\log(Kq)) d0=O(1),r=O(log(Kq))就可以让噪声足够小。

在计算出 exp ⁡ ( 2 π i t 2 r ⋅ q ) \exp\left(\frac{2\pi i t}{2^r \cdot q}\right) exp(2rq2πit)之后,可以运算 sin ⁡ ( 2 π m q ) = 1 2 i ⋅ ( exp ⁡ ( 2 π i m q ) − exp ⁡ ( − 2 π i m q ) ) \sin(\frac{2 \pi m}{q}) = \frac{1}{2}i\cdot \left(\exp\left(\frac{2 \pi i m}{q}\right)-\exp\left(\frac{-2 \pi i m}{q}\right)\right) sin(q2πm)=21i(exp(q2πim)exp(q2πim))

如何做同态编码或解码

CKKS的编码和解码基础知识(明文下面怎么做)

对一个2的幂次的数 M M M来说,第 M M M个分圆多项式为 Φ M ( X ) = X N + 1 \varPhi_M(X)=X^N+1 ΦM(X)=XN+1,将数字 5 5 5作为生成元,可以构成了一个阶为 N / 2 N/2 N/2的模 M M M的乘5循环群 { 5 j m o d M ∣ j ∈ [ 0 , N / 2 ] } \{5^j \bmod M| j\in[0,N/2]\} {5jmodMj[0,N/2]},此外,这个群乘 − 1 -1 1也构成一个乘5的循环群 { − 5 j m o d M ∣ j ∈ [ 0 , N / 2 ] } \{-5^j \bmod M |j\in [0,N/2]\} {5jmodMj[0,N/2]},这两个乘法群可以构成完整的 Z M ∗ Z_M^* ZM

举例,对于 M = 16 M=16 M=16来说,两个阶为 4 4 4的乘法群分别为 [ 1 , 5 , 9 , 13 ] , [ 15 , 11 , 7 , 3 ] [1,5,9,13],[15,11,7,3] [1,5,9,13],[15,11,7,3]

因此,对于 Φ M ( X ) = X N + 1 \varPhi_M(X)=X^N+1 ΦM(X)=XN+1的某个 M M M次单位原根 ζ \zeta ζ来说,可以令 ζ j = ζ 5 j , 0 ≤ j < N / 2 \zeta_j = \zeta ^{5^j}, 0\le j <N/2 ζj=ζ5j,0j<N/2。$\left{\zeta_{j}, \overline{\zeta_{j}}: 0 \leq j<N / 2\right} $组成了单元原根的集合。

举例,对于 X 8 + 1 X^{8}+1 X8+1来说:

ζ 0 = ζ , ζ 1 = ζ 5 , ζ 2 = ζ 9 , ζ 3 = ζ 13 \zeta_0 = \zeta, \zeta_1 = \zeta^5,\zeta_2 = \zeta ^9,\zeta_3=\zeta^{13} ζ0=ζ,ζ1=ζ5,ζ2=ζ9,ζ3=ζ13

ζ 0 ‾ = ζ 15 , ζ 1 ‾ = ζ 11 , ζ 2 ‾ = ζ 7 , ζ 3 ‾ = ζ 3 \overline{\zeta_0}=\zeta^{15},\overline{\zeta_1}=\zeta^{11},\overline{\zeta_2}=\zeta^{7},\overline{\zeta_3}=\zeta^{3} ζ0=ζ15,ζ1=ζ11,ζ2=ζ7,ζ3=ζ3

对于同态的解码是将系数形式多项式变为点值形式;而编码是将点值形式变为系数形式。

CKKS支持将 N / 2 N/2 N/2个复数 C N / 2 \mathbb{C}^{N/2} CN/2编码到一个实系数多项式 R = R ( X ) / Φ M ( X ) R=\R(X)/\varPhi_M(X) R=R(X)/ΦM(X)

对于一个系数多项式 m ( X ) m(X) m(X)来说, m ( X ) = ∑ i = 0 N − 1 m i X i m(X)=\sum_{i=0}^{N-1}m_iX^i m(X)=i=0N1miXi,可以令其系数组成向量 m = ( m 0 , . . . , m N − 1 ) \boldsymbol{m}=(m_0,...,m_{N-1}) m=(m0,...,mN1)

解码函数 τ : R → C N / 2 \tau : R \to \mathbb{C}^{N/2} τ:RCN/2,比如 τ : m ( X ) → z = ( z j ) 0 ≤ j < N / 2 \tau :m(X)\to \boldsymbol{z}=(z_j)_{0\le j < N/2} τ:m(X)z=(zj)0j<N/2,那么 z j = m ( ζ j ) = ∑ i = 0 N − 1 m i ⋅ ( ζ j ) i z_j = m(\zeta_j)=\sum_{i=0}^{N-1}m_i\cdot (\zeta_j)^i zj=m(ζj)=i=0N1mi(ζj)i

因此,这个解码变换可以写为 z = U ⋅ m \boldsymbol{z}=\mathbf{U}\cdot \boldsymbol{m} z=Um,其中 U \mathbf{U} U为:
U = [ 1 ζ 0 ζ 0 2 ⋯ ζ 0 N − 1 1 ζ 1 ζ 1 2 ⋯ ζ 1 N − 1 ⋮ ⋮ ⋮ ⋱ ⋮ 1 ζ N 2 − 1 ζ N 2 − 1 2 ⋯ ζ N 2 − 1 N − 1 ] ∈ C ( N / 2 ) × N \mathbf{U}=\left[\begin{array}{ccccc} 1 & \zeta_{0} & \zeta_{0}^{2} & \cdots & \zeta_{0}^{N-1} \\ 1 & \zeta_{1} & \zeta_{1}^{2} & \cdots & \zeta_{1}^{N-1} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & \zeta_{\frac{N}{2}-1} & \zeta_{\frac{N}{2}-1}^{2} & \cdots & \zeta_{\frac{N}{2}-1}^{N-1} \end{array}\right]\in \mathbb{C}^{(N/2) \times N} U= 111ζ0ζ1ζ2N1ζ02ζ12ζ2N12ζ0N1ζ1N1ζ2N1N1 C(N/2)×N
**编码函数:**直接取解码函数的逆变换,其实 m = U − 1 ⋅ z \boldsymbol{m}=\mathbf{U}^{-1} \cdot \boldsymbol{z} m=U1z。但 U − 1 \mathbf{U}^{-1} U1一般不直接计算,利用范德蒙的行列式的形式,我们将 U \mathbf{U} U进行扩充,令 C R T = [ U U ‾ ] \mathsf{CRT}=\left[~\begin{aligned}&U \\ &\overline{U}\end{aligned}~\right] CRT=[ UU ],那么 ( z , z ‾ ) = C R T ⋅ m (\boldsymbol{z},\overline{\boldsymbol{z}}) = \mathsf{CRT} \cdot \boldsymbol{m} (z,z)=CRTm,则 m = C R T − 1 ⋅ ( z , z ‾ ) \boldsymbol{m} = \mathsf{CRT}^{-1}\cdot (\boldsymbol{z},\overline{\boldsymbol{z}}) m=CRT1(z,z)

其中 C R T − 1 = 1 N C R T ‾ T = 1 N ( U ‾ T , U T ) \mathsf{CRT}^{-1}=\frac{1}{N} \overline{\mathsf{CRT}}^T=\frac{1}{N}(\overline{U}^T,U^T) CRT1=N1CRTT=N1(UT,UT)

因此这个逆变换可以写为: m = 1 N ( U ‾ T ⋅ z + U T ⋅ z ‾ ) \boldsymbol{m} = \frac{1}{N}(\overline{U}^T \cdot \boldsymbol{z} + U^T \cdot \overline{\boldsymbol{z}}) m=N1(UTz+UTz)

同态的旋转、共轭,和同态矩阵向量乘法(密文状态下怎么做)

在计算编码函数的时候,相当于要计算密文状态下的 m = 1 N ( U ‾ T ⋅ z + U T ⋅ z ‾ ) \boldsymbol{m} = \frac{1}{N}(\overline{U}^T \cdot \boldsymbol{z} + U^T \cdot \overline{\boldsymbol{z}}) m=N1(UTz+UTz)过程,解码函数为 z = U ⋅ m \boldsymbol{z}=U\cdot \boldsymbol{m} z=Um。其中 U U U是明文输入, z \boldsymbol{z} z是密文, m \boldsymbol{m} m是密文,因此要找到密文状态下做矩阵乘法和密文做共轭的操作。就可以在密文状态下做同态的编码和解码了。

旋转和共轭操作是使用密钥转化(KeySwitch)算法来构造的,

同态密钥转换

简单来说KeySwitch算法可以将一个由 s ′ s' s加密的密文 c t ′ ct' ct,其中包含的明文信息为 m m m,转换为一个由 s s s加密的密文 c t ct ct,其中包含的明文信息为 m m m

KeySwitch过程为:

首先,密文 c t 1 = ( b 1 , a 1 ) ct_1 = (b_1,a_1) ct1=(b1,a1),其中 b 1 + a 1 s ′ = m + e 1 b_1+a_1s'=m+e_1 b1+a1s=m+e1

转化密钥的生成过程 k s k ← K S G e n s ( s ′ ) \mathsf{ksk} \gets\mathsf{KSGen}_{s}(s') kskKSGens(s):取 a ′ ∈ R P Q a' \in \mathcal{R}_{PQ} aRPQ b ′ = − a ′ s + e ′ + P s ′ m o d P Q b'=-a's +e' + Ps' \bmod PQ b=as+e+PsmodPQ,转化密钥为 ( b ′ , a ′ ) (b',a') (b,a)

密钥转化的过程 c t ← K e y S w i t c h ( c t 1 , k s k ) ct \gets\mathsf{KeySwitch}(ct_1,\mathsf{ksk}) ctKeySwitch(ct1,ksk) ( b , a ) = ( b 1 , 0 ) + ⌊ P − 1 ⋅ a 1 ⋅ k s k ⌋ m o d Q (b,a) = (b_1,0) + \lfloor P^{-1} \cdot a_1 \cdot \mathsf{ksk} \rfloor \bmod Q (b,a)=(b1,0)+P1a1kskmodQ

那么得到的 c t ct ct是由 s s s加密的 m m m构成的密文,正确性推导如下:
b + a s = b 1 + ⌊ P − 1 ⋅ a 1 ⋅ b ′ ⌋ + ( ⌊ P − 1 ⋅ a 1 ⋅ a ′ ⌋ ) s = b 1 + P − 1 ⋅ a 1 ⋅ ( − a ′ s + e ′ + P s ′ ) + P − 1 a 1 a ′ s + ϵ = b 1 + a 1 s ′ + P − 1 a 1 e ′ + ϵ = m + e 1 + P − 1 a 1 e ′ + ϵ ≈ m \begin{aligned} b+as &= b_1 +\lfloor P^{-1} \cdot a_1 \cdot b' \rfloor + (\lfloor P^{-1} \cdot a_1 \cdot a' \rfloor)s\\ &=b_1 + P^{-1}\cdot a_1 \cdot (-a's+e'+Ps') + P^{-1}a_1a's + \epsilon\\ &=b_1+a_1s' + P^{-1}a_1e' + \epsilon\\ &=m+e_1 + P^{-1}a_1e'+\epsilon\\ &\approx m \end{aligned} b+as=b1+P1a1b+(⌊P1a1a⌋)s=b1+P1a1(as+e+Ps)+P1a1as+ϵ=b1+a1s+P1a1e+ϵ=m+e1+P1a1e+ϵm

同态的旋转和共轭

考虑明文多项式如何旋转Slot:

在编码过程中,对于一个向量 z = ( z j ) 0 ≤ j < N 2 \boldsymbol{z} = (z_j)_{0\le j < \frac{N}{2}} z=(zj)0j<2N来说,将其编码为多项式 m ( X ) m(X) m(X)的方式是将 z \boldsymbol{z} z放入 m ( X ) m(X) m(X)的点值表达式中,点值对应的横坐标为 ζ 5 j \zeta^{5^j} ζ5j,比如对于 N = 8 N=8 N=8时,点值的横坐标为 [ ζ , ζ 5 , ζ 9 , ζ 13 ] [\zeta,\zeta^{5},\zeta^{9},\zeta^{13}] [ζ,ζ5,ζ9,ζ13]。即 m ( ζ 5 i ) = z i m(\zeta^{5^i})=z_i m(ζ5i)=zi,而在共轭的位置会放 z i ‾ \overline{z_i} zi,即 m ( ζ 5 i ‾ ) = z i ‾ m(\overline{\zeta^{5^i}})=\overline{z_i} m(ζ5i)=zi

如果我们要将其左移两位,则可以计算 φ 2 ( x ) = x 5 2 : ζ j → ζ j 5 2 \varphi_2(x) = x^{5^2}: \zeta_j \to \zeta_j^{5^2} φ2(x)=x52:ζjζj52,则 φ 2 ( m ( X ) ) \varphi_2(m(X)) φ2(m(X))所对应的横坐标为 [ ζ 9 , ζ 13 , ζ , ζ 5 ] [\zeta^9,\zeta^{13},\zeta,\zeta^5] [ζ9,ζ13,ζ,ζ5]。那么其对应的明文为 ( z 2 , z 3 , z 0 , z 1 ) (z_2,z_3,z_0,z_1) (z2,z3,z0,z1),也就是左移了两位。

密文通过KeySwitch旋转:

对于一个密文来说, c t = ( b , a ) \mathsf{ct}=(b,a) ct=(b,a),其中 b + a s = m + e b+as = m+e b+as=m+e,我们要得到 φ ( m ) \varphi(m) φ(m),可以计算 φ ( c t ) = ( φ ( b ) , φ ( s ) ) \varphi(\mathsf{ct})=(\varphi(b) ,\varphi(s)) φ(ct)=(φ(b),φ(s))

φ ( c t ) \varphi(\mathsf{ct}) φ(ct)是由 φ ( s ) \varphi(s) φ(s)加密的 φ ( m ) \varphi(m) φ(m) φ ( b ) + φ ( a ) ⋅ φ ( s ) = φ ( m ) + φ ( e ) \varphi(b) + \varphi(a) \cdot\varphi(s) = \varphi(m) + \varphi(e) φ(b)+φ(a)φ(s)=φ(m)+φ(e)

所以我们在密文 c t \mathsf{ct} ct上进行了 φ ( ⋅ ) \varphi(\cdot) φ()变化后,可以通过KeySwitch将其变为由 s s s加密的 φ ( m ) \varphi(m) φ(m),也就实现了旋转。

r k r = K S G e n s ( φ r ( s ) ) \mathsf{rk}_r = \mathsf{KSGen}_s(\varphi_r(s)) rkr=KSGens(φr(s))

R o t ( c t ; r ) : K e y S w i t c h ( φ ( c t ) , r k r ) \mathsf{Rot}(\mathsf{ct};r): \mathsf{KeySwitch}(\varphi(\mathsf{ct}),\mathsf{rk}_r) Rot(ct;r):KeySwitch(φ(ct),rkr)

通过KeySwitch求共轭:

共轭的思想和旋转一致,只是将 φ \varphi φ函数替换为 φ ′ ( x ) : x − 1 \varphi'(x):x^{-1} φ(x):x1

比如 [ ζ , ζ 5 , ζ 9 , ζ 13 ] [\zeta,\zeta^{5},\zeta^{9},\zeta^{13}] [ζ,ζ5,ζ9,ζ13]变为了 [ ζ 15 , ζ 11 , ζ 7 , ζ 3 ] [\zeta^{15},\zeta^{11},\zeta^{7},\zeta^{3}] [ζ15,ζ11,ζ7,ζ3]。对应了共轭操作。

同态的矩阵向量乘法

k = N / 2 k=N/2 k=N/2,对于一个矩阵 A = [ A 0 , 0 A 0 , 1 A 0 , 2 ⋯ A 0 , k − 1 A 1 , 0 A 1 , 1 A 1 , 2 ⋯ A 1 , k − 1 ⋮ ⋮ ⋮ ⋱ ⋮ A k − 1 , 0 A k − 1 , 1 A k − 1 , 2 ⋯ A k − 1 , k − 1 ] ∈ C k × k A=\left[\begin{array}{ccccc} A_{0,0} & A_{0,1} & A_{0,2} & \cdots & A_{0,k-1} \\ A_{1,0} & A_{1,1} & A_{1,2} & \cdots & A_{1,k-1} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ A_{k-1,0} & A_{k-1,1} & A_{k-1,2} & \cdots & A_{k-1,k-1} \end{array}\right]\in \mathbb{C}^{k \times k} A= A0,0A1,0Ak1,0A0,1A1,1Ak1,1A0,2A1,2Ak1,2A0,k1A1,k1Ak1,k1 Ck×k

对于一个向量 z = ( z j ) 0 ≤ j < k \boldsymbol{z} = (z_j)_{0\le j < k} z=(zj)0j<k来说,我们要计算 m = A z = { ∑ i = 0 k − 1 A i , j z j } i \boldsymbol{m}=A\boldsymbol{z}= \{\sum_{i=0}^{k-1}A_{i,j}z_j\}_i m=Az={i=0k1Ai,jzj}i。其中 A A A是明文, z \boldsymbol{z} z是密文。

难点在于: z \boldsymbol{z} z是密文状态,而且要在打包的情况下计算。打包支持的乘法运算是向量两两之间的相乘(点乘),而矩阵乘法其实每行做了一个内积。所以如何在明文打包的情况下,通过向量两两之间的乘法,来构造一个矩阵乘法是一个难点。

初始思路:

两两之间的乘法其实也存在,

我们可以取第一列元素 { A 0 , 0 , A 1 , 0 , . . . , A k − 1 , 0 } \{A_{0,0},A_{1,0},...,A_{k-1,0}\} {A0,0,A1,0,...,Ak1,0},与向量 { z 0 , z 0 , . . . z 0 } \{z_0,z_0,...z_0\} {z0,z0,...z0}之间两两相乘(点乘),

第二列元素 { A 0 , 1 , A 1 , 1 , . . . , A k − 1 , 1 } \{A_{0,1},A_{1,1},...,A_{k-1,1}\} {A0,1,A1,1,...,Ak1,1}与向量 { z 1 , z 1 , . . . , z 1 } \{z_1,z_1,...,z_1\} {z1,z1,...,z1}之间两两相乘,

然后将这些结果的向量累加起来,就可以得到 { ∑ i = 0 k − 1 A 0 , i z i , ∑ i = 0 k − 1 A 1 , i z i , . . . ∑ i = 0 k − 1 A k − 1 , i z i } \{\sum_{i=0}^{k-1}A_{0,i}z_i, \sum_{i=0}^{k-1}A_{1,i}z_i,...\sum_{i=0}^{k-1}A_{k-1,i}z_i\} {i=0k1A0,izi,i=0k1A1,izi,...i=0k1Ak1,izi}

但这样的话,我们需要 k k k个密文,分别加密 { z i , . . . , z i } 0 ≤ i < k \{z_i,...,z_i\}_{0\le i < k} {zi,...,zi}0i<k

改善思路:

注意到,

  1. 原本在矩阵第 i i i行的元素,被累加到了结果向量的第 i i i个位置。所以我们要构造的向量要满足 { A 0 , r , A 1 , r ′ , . . . , A k − 1 , r ′ ′ } \{A_{0,r},A_{1,r'},...,A_{k-1,r''}\} {A0,r,A1,r,...,Ak1,r′′}的形式。

  2. 而第 j j j列对应的元素,要与 z j z_j zj相乘。而 z = ( z 0 , . . . , z k − 1 ) \boldsymbol{z}=(z_0,...,z_{k-1}) z=(z0,...,zk1)本身是一个下标递增的数组。

所以我们要构造的与 z \boldsymbol{z} z进行的点乘的数组,可以取 a i = { A 0 , i , A 1 , i + 1 , . . . , A k − i , 0 , . . . , A k − 1 , i − 1 } \boldsymbol{a}_i=\{A_{0,i},A_{1,i+1},...,A_{k-i,0},...,A_{k-1,i-1}\} ai={A0,i,A1,i+1,...,Aki,0,...,Ak1,i1},与 z i = ( z i , z i + 1 , . . . , x k − i , 0 . . . , z i − 1 ) \boldsymbol{z}_i=(z_i,z_{i+1},...,x_{k-i,0}...,z_{i-1}) zi=(zi,zi+1,...,xki,0...,zi1)相乘。

z i \boldsymbol{z}_i zi可以通过将 z \boldsymbol{z} z左移 i i i位来构造 z i = R o t ( z , i ) \boldsymbol{z}_i = \mathsf{Rot}(\boldsymbol{z},i) zi=Rot(z,i) a i \boldsymbol{a}_i ai是直接取 A A A的第 i i i个对角线向量。

因此: A ⋅ z = ∑ 0 ≤ i < k ( a i ⋅ R o t ( z , i ) ) A\cdot \boldsymbol{z}= \sum_{0\le i < k} (\boldsymbol{a}_i \cdot \mathsf{Rot}(\boldsymbol{z},i)) Az=0i<k(aiRot(z,i))。其中

这样的话,只需要原本的 z \boldsymbol{z} z的密文就可以构造。但需要 k k k次的旋转和 k k k次的明文密文乘法。但旋转操作比较耗时,有没有方法进一步减少旋转的次数?是有的:

小步大步法:

k 1 ⋅ k 2 = k k_1 \cdot k_2 = k k1k2=k
A ⋅ z = ∑ 0 ≤ i < k ( a i ⋅ R o t ( z , i ) ) = ∑ 0 ≤ j < k 2 ∑ 0 ≤ i < k 1 ( a j ⋅ k 1 + i ⋅ R o t ( z , j ⋅ k 1 + i ) ) = ∑ 0 ≤ j < k 2 R o t ( ∑ 0 ≤ i < k 1 R o t ( a j ⋅ k 1 + i , − j ⋅ k 1 ) ⋅ R o t ( z , i ) , j ⋅ k 1 ) \begin{aligned} A\cdot \boldsymbol{z}&= \sum_{0\le i < k} (\boldsymbol{a}_i \cdot \mathsf{Rot}(\boldsymbol{z},i))\\ &=\sum_{0\le j < k_2}\sum_{0\le i < k_1}(\boldsymbol{a}_{j\cdot k_1 +i} \cdot \mathsf{Rot}(\boldsymbol{z},j\cdot k_1 + i))\\ &=\sum_{0\le j < k_2}\mathsf{Rot}\left(\sum_{0\le i < k_1}\mathsf{Rot}(a_{j\cdot k_1 + i},-j\cdot k_1 ) \cdot \mathsf{Rot}(\boldsymbol{z},i), j\cdot k_1\right) \end{aligned} Az=0i<k(aiRot(z,i))=0j<k20i<k1(ajk1+iRot(z,jk1+i))=0j<k2Rot(0i<k1Rot(ajk1+i,jk1)Rot(z,i),jk1)
这样做就只需要 k 1 + k 2 = k k_1 + k_2=\sqrt{k} k1+k2=k 次的旋转, k 1 ⋅ k 2 = k k_1\cdot k_2=k k1k2=k次的乘法。

CKKS BootStrapping方案整体(将上面提到的方法结合一下)

在这里插入图片描述

扩模(ModRaise):一个模数为 q q q的密文 c t {\sf ct} ct包含的明文为 m ( X ) = [ ⟨ c t , s k ⟩ ] q m(X) = [\langle {\sf ct},{\sf sk} \rangle]_q m(X)=[⟨ct,sk]q,则 t ( X ) = ⟨ c t , s k ⟩ = q I ( X ) + m ( X ) ≡ m ( X ) m o d q t(X)=\langle {\sf ct},{\sf sk} \rangle=q I(X) + m(X) \equiv m(X) \bmod q t(X)=ct,sk=qI(X)+m(X)m(X)modq,其中 ∥ I ( X ) ∥ ∞ < K = O ( h ) \|I(X)\|_{\infty} < K = O(\sqrt{h}) I(X)<K=O(h )。这里的 h h h s k \sf sk sk中1的数量。因此, c t \mathsf{ct} ct可以认为是一个大模数为 Q 0 ≫ q Q_0 \gg q Q0q的密文,其中包含的明文为 t ( X ) = t 0 + t 1 X + ⋯ + t N − 1 X N − 1 t(X) = t_0 + t_1 X + \cdots + t_{N-1}X^{N-1} t(X)=t0+t1X++tN1XN1

同态编码(CoeffToSlot):我们要对多项式的系数进行一个取模操作,但我们使用同态的加法和乘法来拟合取模操作,而同态的加法和乘法是针对Slot中的数做的,因此,要将系数放进Slot中。相当于做一个同态的密文编码操作,可以使用乘DFT矩阵的方法来实现。但这里有一个问题,多项式的系数是 n n n个,而明文Slot只有 n / 2 n/2 n/2个,因此这一步会得到两个密文分别加密 z 0 ′ = ( t 0 , . . . , t N 2 − 1 ) z_0'=(t_0,...,t_{\frac{N}{2}-1}) z0=(t0,...,t2N1) z 1 ′ = ( t N 2 , . . . , t N − 1 ) z_1'=(t_{\frac{N}{2}},...,t_{N-1}) z1=(t2N,...,tN1)
U = [ 1 ζ 0 ζ 0 2 ⋯ ζ 0 N − 1 1 ζ 1 ζ 1 2 ⋯ ζ 1 N − 1 ⋮ ⋮ ⋮ ⋱ ⋮ 1 ζ N 2 − 1 ζ N 2 − 1 2 ⋯ ζ N 2 − 1 N − 1 ] ∈ C ( N / 2 ) × N U=\left[\begin{array}{ccccc} 1 & \zeta_{0} & \zeta_{0}^{2} & \cdots & \zeta_{0}^{N-1} \\ 1 & \zeta_{1} & \zeta_{1}^{2} & \cdots & \zeta_{1}^{N-1} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & \zeta_{\frac{N}{2}-1} & \zeta_{\frac{N}{2}-1}^{2} & \cdots & \zeta_{\frac{N}{2}-1}^{N-1} \end{array}\right]\in \mathbb{C}^{(N/2) \times N} U= 111ζ0ζ1ζ2N1ζ02ζ12ζ2N12ζ0N1ζ1N1ζ2N1N1 C(N/2)×N
我们将其分为两块:
U 0 = [ 1 ζ 0 … ζ 0 N 2 − 1 1 ζ 1 … ζ 1 N 2 − 1 ⋮ ⋮ ⋱ ⋮ 1 ζ N 2 − 1 … ζ N 2 − 1 N 2 − 1 ] and  U 1 = [ ζ 0 N 2 ζ 0 N 2 + 1 … ζ 0 N − 1 ζ 1 N 2 ζ 1 N 2 + 1 … ζ 1 N − 1 ⋮ ⋮ ⋱ ⋮ ζ N 2 − 1 N 2 ζ N 2 − 1 N 2 + 1 … ζ N 2 − 1 N − 1 ] U_{0}=\left[\begin{array}{cccc} 1 & \zeta_{0} & \ldots & \zeta_{0}^{\frac{N}{2}-1} \\ 1 & \zeta_{1} & \ldots & \zeta_{1}^{\frac{N}{2}-1} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & \zeta_{\frac{N}{2}-1} & \ldots & \zeta_{\frac{N}{2}-1}^{\frac{N}{2}-1} \end{array}\right] \quad \text { and } \quad U_{1}=\left[\begin{array}{cccc} \zeta_{0}^{\frac{N}{2}} & \zeta_{0}^{\frac{N}{2}+1} & \ldots & \zeta_{0}^{N-1} \\ \zeta_{1}^{\frac{N}{2}} & \zeta_{1}^{\frac{N}{2}+1} & \ldots & \zeta_{1}^{N-1} \\ \vdots & \vdots & \ddots & \vdots \\ \zeta_{\frac{N}{2}-1}^{\frac{N}{2}} & \zeta_{\frac{N}{2}-1}^{\frac{N}{2}+1} & \ldots & \zeta_{\frac{N}{2}-1}^{N-1} \end{array}\right] U0= 111ζ0ζ1ζ2N1ζ02N1ζ12N1ζ2N12N1  and U1= ζ02Nζ12Nζ2N12Nζ02N+1ζ12N+1ζ2N12N+1ζ0N1ζ1N1ζ2N1N1
z ′ ∈ C N / 2 \boldsymbol{z}'\in \mathbb{C} ^{N/2} zCN/2为密文 c t \mathsf{ct} ct中的Slot内元素,可以得到 z k ′ = 1 N ( U k ‾ T ⋅ z ′ + U k T ⋅ z ′ ‾ ) , k = 0 , 1 \boldsymbol{z}_{k}^{\prime}=\frac{1}{N}\left({\overline{U_{k}}}^{T} \cdot \boldsymbol{z}^{\prime}+U_{k}^{T} \cdot \overline{\boldsymbol{z}^{\prime}}\right),k=0,1 zk=N1(UkTz+UkTz),k=0,1。这一步可以使用上面的同态矩阵乘法来构造。

z k ′ = 1 N ( U k ‾ T ⋅ z ′ + U k T ⋅ z ′ ‾ ) , k = 0 , 1 \boldsymbol{z}_{k}^{\prime}=\frac{1}{N}\left({\overline{U_{k}}}^{T} \cdot \boldsymbol{z}^{\prime}+U_{k}^{T} \cdot \overline{\boldsymbol{z}^{\prime}}\right),k=0,1 zk=N1(UkTz+UkTz),k=0,1的正确性推导:

我们记 t ( X ) t(X) t(X)的系数组成的列向量为 t = ( t 0 , t 1 , . . . , t N − 1 ) \boldsymbol{t}=(t_0,t_1,...,t_{N-1}) t=(t0,t1,...,tN1)

z ′ = ( z 0 , . . . , z N 2 − 1 ) \boldsymbol{z'}=(z_0,...,z_{\frac{N}{2}-1}) z=(z0,...,z2N1) t ( X ) t(X) t(X)对应的点值(Slot内元素),因此 t ( ζ i ) = z i , 0 ≤ i < N 2 t(\zeta_i)=z_i, 0\le i < \frac{N}{2} t(ζi)=zi,0i<2N t ( ζ i ‾ ) = z i ‾ t(\overline{\zeta_i})=\overline{z_i} t(ζi)=zi

因此 z ′ = U ⋅ t , z ′ ‾ = U ‾ ⋅ t \boldsymbol{z}' = U \cdot \boldsymbol{t}, \overline{\boldsymbol{z'}} = \overline{U} \cdot \boldsymbol{t} z=Ut,z=Ut
[ z ′ z ′ ‾ ] = [ U 0 U 1 U 0 ‾ U 1 ‾ ] ⋅ t → [ z ′ z ′ ‾ ] = [ U 0 U 1 U 0 ‾ U 1 ‾ ] ⋅ [ z 0 ′ z 1 ′ ] ; d o w n a r r o w [ z 0 ′ z 1 ′ ] = [ U 0 U 1 U 0 ‾ U 1 ‾ ] − 1 ⋅ [ z ′ z ′ ‾ ] → [ z 0 ′ z 1 ′ ] = 1 N [ U 0 ‾ T U 0 T U 1 ‾ T U 1 T ] ⋅ [ z ′ z ′ ‾ ] ↓ z 0 ′ = 1 N ( U 0 ‾ T ⋅ z ′ + U 0 T ⋅ z ′ ‾ ) z 1 ′ = 1 N ( U 1 ‾ T ⋅ z ′ + U 1 T ⋅ z ′ ‾ ) \left[\begin{array}{c} \boldsymbol{z}'\\\overline{\boldsymbol{z'}}\end{array}\right] = \left[\begin{array}{cc} U_0 & U_1\\\overline{U_0} &\overline{U_1}\end{array}\right]\cdot \boldsymbol{t}\\ \to \left[\begin{array}{c} \boldsymbol{z}'\\\overline{\boldsymbol{z'}}\end{array}\right] = \left[\begin{array}{cc} U_0 & U_1\\\overline{U_0} &\overline{U_1}\end{array}\right] \cdot \left[\begin{array}{c} \boldsymbol{z}_0'\\\boldsymbol{z}_1'\end{array}\right]; \\downarrow \\ \left[\begin{array}{c} \boldsymbol{z}_0'\\\boldsymbol{z}_1'\end{array}\right]= \left[\begin{array}{cc} U_0 & U_1\\\overline{U_0} &\overline{U_1}\end{array}\right]^{-1} \cdot \left[\begin{array}{c} \boldsymbol{z}'\\\overline{\boldsymbol{z'}}\end{array}\right] \\ \to \left[\begin{array}{c} \boldsymbol{z}_0'\\\boldsymbol{z}_1'\end{array}\right]= \frac{1}{N}\left[\begin{array}{cc} \overline{U_0}^T & U_0^T\\\overline{U_1}^T &U_1^T\end{array}\right] \cdot \left[\begin{array}{c} \boldsymbol{z}'\\\overline{\boldsymbol{z'}}\end{array}\right] \\\downarrow \\ \boldsymbol{z}_{0}^{\prime}=\frac{1}{N}\left({\overline{U_{0}}}^{T} \cdot \boldsymbol{z}^{\prime}+U_{0}^{T} \cdot \overline{\boldsymbol{z}^{\prime}}\right)\\ \boldsymbol{z}_{1}^{\prime}=\frac{1}{N}\left({\overline{U_{1}}}^{T} \cdot \boldsymbol{z}^{\prime}+U_{1}^{T} \cdot \overline{\boldsymbol{z}^{\prime}}\right) [zz]=[U0U0U1U1]t[zz]=[U0U0U1U1][z0z1];downarrow[z0z1]=[U0U0U1U1]1[zz][z0z1]=N1[U0TU1TU0TU1T][zz]z0=N1(U0Tz+U0Tz)z1=N1(U1Tz+U1Tz)

同态取模操作(EvalMod):在两个密文上分别运算 q 2 π s i n ( 2 π x q ) \frac{q}{2\pi}sin\left(\frac{2\pi x}{q}\right) 2πqsin(q2πx)函数,过程为拟合 exp ⁡ ( 2 π i t 2 r ⋅ q ) \exp\left(\frac{2\pi i t}{2^r \cdot q}\right) exp(2rq2πit)函数,通过不断将其平方,来计算 exp ⁡ ( 2 π i t q ) \exp\left(\frac{2\pi i t}{ q}\right) exp(q2πit),最后通过取共轭来得到 exp ⁡ ( − 2 π i t q ) \exp\left(\frac{-2\pi i t}{ q}\right) exp(q2πit),可以运算 q 2 π sin ⁡ ( 2 π m q ) = q 2 π ⋅ 1 2 ( exp ⁡ ( 2 π i m q ) − exp ⁡ ( − 2 π i m q ) ) \frac{q}{2\pi}\sin(\frac{2 \pi m}{q}) = \frac{q}{2\pi}\cdot\frac{1}{2}\left(\exp\left(\frac{2 \pi i m}{q}\right)-\exp\left(\frac{-2 \pi i m}{q}\right)\right) 2πqsin(q2πm)=2πq21(exp(q2πim)exp(q2πim))

迭代运算过程如下:

在这里插入图片描述

同态解码(SlotToCoeff):同态解码操作是同态编码的逆操作。将Slot中的数放回系数中。也是通过一个矩阵乘法的方式来做。

我们通过上一个同态取模操作,将 z 0 ′ = ( t 0 , . . . , t N 2 − 1 ) z_0'=(t_0,...,t_{\frac{N}{2}-1}) z0=(t0,...,t2N1) z 1 ′ = ( t N 2 , . . . , t N − 1 ) z_1'=(t_{\frac{N}{2}},...,t_{N-1}) z1=(t2N,...,tN1)变为了 z 0 = ( m 0 , . . . , m N 2 − 1 ) z_0=(m_0,...,m_{\frac{N}{2}-1}) z0=(m0,...,m2N1) z 1 = ( m N 2 , . . . , m N − 1 ) z_1=(m_{\frac{N}{2}},...,m_{N-1}) z1=(m2N,...,mN1)。我们计算 z = U 0 ⋅ z 0 + U 1 ⋅ z 1 z = U_0 \cdot z_0 + U_1 \cdot z_1 z=U0z0+U1z1

其余优化操作:

稀疏密文:不利用到密文中所有 N / 2 N/2 N/2个槽,而是z

原始方案的效果:

在这里插入图片描述

在这里插入图片描述

可以看出来这个初始的方案效果还是比较差的,精度24bit基本上无法运算了。

优化方案:

优化思路1:更改拟合函数(欧密2022a)

在上述的方案中,我们采用了 S ( x ) = q 2 π s i n ( 2 π x q ) S(x)=\frac{q}{2\pi}sin\left(\frac{2\pi x}{q}\right) S(x)=2πqsin(q2πx)函数来拟合 [ x ] q [x]_q [x]q函数,但最终能够做到的精度只有16bit,非常的少。是因为这个函数本身与 [ x ] q [x]_q [x]q之间存在着 O ( q ϵ 3 ) O(q\epsilon^3) O(qϵ3)的误差。

在这里插入图片描述

2022年欧密的一篇工作3发现了如果采用sine的序列,即 4 3 sin ⁡ x − 1 6 sin ⁡ 2 x \frac{4}{3}\sin x - \frac{1}{6} \sin2x 34sinx61sin2x来计算的话,则可以达到更高的逼近程度。原因在于

sin ⁡ x = x − x 3 / 3 ! + x 5 / 5 ! − x 7 / 7 ! + … \sin x=x −x^3/3!+x^5/5!−x^7/7!+ … sinx=xx3/3!+x5/5!x7/7!+

4 / 3 sin ⁡ x = 4 / 3 x − 2 / 9 x 3 + 1 / 90 x 5 − 1 / 3780 x 7 + … 4/3\sin x=4/3x −2/9x^3+1/90x^5−1/3780x^7+… 4/3sinx=4/3x2/9x3+1/90x51/3780x7+

− 1 / 6 sin ⁡ 2 x = − 1 / 3 x + 2 / 9 x 3 − 2 / 45 x 5 + 4 / 945 x 7 − … −1/6\sin2x=−1/3x+2/9x^3−2/45x^5+4/945x^7 −… 1/6sin2x=1/3x+2/9x32/45x5+4/945x7


  1. Jung Cheon, Kyoohyung Han, Andrey Kim, Miran Kim, and Yongsoo Song. Bootstrapping for approximate homomorphic encryption. In EUROCRYPT, pages 360–384, 01 2018. ↩︎ ↩︎ ↩︎ ↩︎

  2. M. S. Paterson and L. J. Stockmeyer. On the number of nonscalar multiplications necessary to evaluate polynomials. SIAM Journal on Computing, 2(1):60–66, 1973.
    [^ strling]: 斯特林公式(Stirling’s approximation)https://blog.csdn.net/qq_40507857/article/details/82595516 ↩︎ ↩︎ ↩︎

  3. Jutla, Charanjit S., and Nathan Manohar. “Sine series approximation of the mod function for bootstrapping of approximate HE.” Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Cham, 2022. ↩︎


http://chatgpt.dhexx.cn/article/bWr9APri.shtml

相关文章

解决:‘config.status: error: Something went wrong bootstrapping makefile fragments......’问题

解决&#xff1a;‘config.status: error: Something went wrong bootstrapping makefile fragments......’问题 一、问题二、解决方法 一、问题 首先我们来看安装sqlite时报的这个错误&#xff1a; config.status: error: in ‘/home/dengyonghao/Downloads/sqlite-autoconf…

Bootstrapping的意义

一、原理解释 Bootstrapping 方法是种集成方法&#xff0c;通俗解释就是盲人摸象&#xff0c;很多盲人摸一头象&#xff0c;各自摸到的都不一样&#xff0c;但是都比较片面&#xff0c;当他们在一起讨论时&#xff0c;就得到了象的整体。 Bootstrap的过程&#xff0c;类似于重…

Bootstrapping method

Bootsrapping指的就是利用有限的样本资料经由多次重复抽样&#xff0c;重新建立起足以代表母体样本分布的新样本。 统计中我们常常需要做参数估计&#xff0c;具体问题可以描述为&#xff1a;给定一系列数据 假设它们是从分布F中采样得到的&#xff0c;参数估计就是希望估计分…

【强化学习】n步Bootstrapping

目录 n步TD 预测 n-step Sarsa n步off - policy学习 Per-reward Off - policy 方法 n步Tree Backup算法 BootStrapping原是推论统计学里的概念。所谓推论统计学&#xff0c;就是根据样本统计量来推算总体的统计量。n部方法通常会被用作eligibility trace思想的一个例子&am…

Bootstrapping

Bootstrapping从字面意思翻译是拔靴法&#xff0c;从其内容翻译又叫自助法&#xff0c;是一种再抽样的统计方法。自助法的名称来源于英文短语“to pull oneself up by one’s bootstrap”&#xff0c;表示完成一件不能自然完成的事情。1977年美国Standford大学统计学教授Efron提…

Bootstrapping?

一、什么是Bootstrapping&#xff1f; 中文翻译也叫“自助法(自举法)”。 类似于给鞋子穿鞋带&#xff0c;把鞋带穿进去在穿出来再穿进去。 举个例子&#xff0c;一个总体有五十人&#xff0c;没有办法直接测量总体的情况&#xff0c;我们就从总体中抽取一些样本&#xff0c;用…

华为机试题整理

1、整数反转后求和 #include <iostream> using namespace std; int reversenum(int x) {int a0;while (x>0) {aa*10x%10;x/10;}return a; } int reverseAdd(int a,int b) {if(a<1||a>70000||b<1||b>70000){return -1;}int num1reversenum(a);int num2re…

2021.华为机试某题

问题描述&#xff1a; 有M*N的节点矩阵&#xff0c;每个节点可以向8个方向&#xff08;上、下、左、右及四个斜线方向&#xff09;转发数据包&#xff0c;每个节点转发时会消耗固定时延&#xff0c;连续两个相同时延可以减少一个时延值&#xff08;即当有K个相同时延的节点连续…

牛客网华为机试题训练汇总(JavaScript)

牛客网华为机试题训练&#xff08;JavaScript Node环境&#xff09; 文章目录 牛客网华为机试题训练&#xff08;JavaScript Node环境&#xff09;前言一、题目1. HJ11 数字颠倒2. HJ22 汽水瓶3. HJ53 杨辉三角的变形4. HJ2 计算某字母出现次数5. HJ8 合并表记录6. HJ17 坐标移…

1、华为机试题记录

1、小型机通常采用RISC和unix操作系统。 RISC&#xff1a;精简指令集计算机&#xff0c;指令少&#xff0c;运行效率更高。 unix&#xff1a;商用UNIX现在主要是三大分支IBM的AIX,SUN的solaris&#xff0c;HP的hp-ux&#xff0c;运行在小型机上。金融电信等行业应用广泛&#x…

华为机试练习题汇总

华为机试练习广场&#xff1a; [华为机试练习题]1.周期串问题 - Yoona - 博客频道 - CSDN.NET[华为机试练习题]2.大数求和 - Yoona - 博客频道 - CSDN.NET[华为机试练习题]3.分解字符串 - Yoona - 博客频道 - CSDN.NET[华为机试练习题]4.简单密码破解 - Yoona - 博客频道 - CSD…

华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典

文章目录 2023 年用 Python 语言解华为 OD 机试题&#xff0c;一篇博客找全。华为 OD 机试题清单&#xff08;机试题库还在逐日更新&#xff09; 2023 年用 Python 语言解华为 OD 机试题&#xff0c;一篇博客找全。 在 2023 年&#xff0c;Python 已成为广泛使用的编程语言之一…

华为OD机试真题2022Q4 A + 2023 B卷(JavaJavaScript)

大家好&#xff0c;我是哪吒。 五月份之前&#xff0c;如果你参加华为OD机试&#xff0c;收到的应该是2022Q4或2023Q1&#xff0c;这两个都是A卷题。 5月10日之后&#xff0c;很多小伙伴收到的是B卷&#xff0c;那么恭喜你看到本文了&#xff0c;抓紧刷题吧。B卷新题库正在更…

EntityWrapper的in用法

EntityWrapper<UserLife> wrapper new EntityWrapper<>(); wrapper.eq("is_valid", 1); wrapper.in("life_name", "ge,edu,career"); List<UserLife> userLabelList userLabelService.selectList(wrapper); in的第二个参数…

QueryWrapper

官方文档&#xff1a;https://mp.baomidou.com/guide/wrapper.html#querywrapper select("id", "name", "age") select(i -> i.getProperty().startsWith("test")) controller中使用的例子

wrapper.and

多条件查询时 如果使用这种的话&#xff0c;会出现只要这个条件成功了&#xff0c;不管你后面或者前面有没有and条件&#xff0c;它都成功&#xff0c; 可以看出来整个条件都在一个括号里面 //创建查询对象LambdaQueryWrapper<PublishWorksRemit> wrapper new Lambd…

MyBatis-Plus使用条件构造器Wrapper

Wrapper &#xff1a;条件构造抽象类&#xff0c;最顶端父类。AbstractWrapper类比较重要。 AbstractWrapper类是 QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类。用于生成 sql 的 where 条件,&#xff0c;entity 属性也用于生成 sql 的 whe…

MybatisPlus使用Wrapper实现增删改查功能

条件构造器的格式说明 导入maven依赖 <dependency><groupId>com.github.jeffreyning</groupId><artifactId>mybatisplus-plus</artifactId><version>1.5.1-RELEASE</version><scope>compile</scope></dependency>…

java wrapper作用_java Wrapper类基本用法详解

在封装中有一种特殊的类,能够把基本的数据类型进行转换来方便实际的使用。我们在之前提到的一些数据类型,最明显的特征是所有字母为小写状态,那么经过Wrapper的包装后,首字母就变成了大写。下面我们就这种特殊的封装类Wrapper的概念、转换图解、模式以及实例带来分享。 1.概…

MybatisPlus学习 条件构造器Wrapper方法详解

目录 1、条件构造器 2、AbstractWrapper 2.1、eq、allEq、ne、 2.2、gt、ge、lt、le 2.3、between、notBetween 2.4、like、notLike、likeLeft、likeRight 2.5、isNull、isNotNull 2.6、in、notIn 2.7、inSql、notInSql 2.8、or、and 2.9、exists、notExists 2.10、…