CKKS自举笔记(CKKS Bootstrapping)

news2024/9/27 15:19:33

文章目录

  • 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 ( exp ⁡ ( i θ ) − exp ⁡ ( − i θ ) ) \sin(\theta) = \frac{1}{2}\left(\exp(i\theta)-\exp(-i\theta)\right) sin(θ)=21(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 ( exp ⁡ ( 2 π i m q ) − exp ⁡ ( − 2 π i m q ) ) \sin(\frac{2 \pi m}{q}) = \frac{1}{2}\left(\exp\left(\frac{2 \pi i m}{q}\right)-\exp\left(\frac{-2 \pi i m}{q}\right)\right) sin(q2πm)=21(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://www.coloradmin.cn/o/382027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 进程:进程控制

目录一、进程创建1.fork2.vfork二、进程终止三、进程等待四、进程替换1.理解程序替换2.子进程在程序替换中的作用Linux的进程控制分为四部分&#xff1a; 进程创建进程终止进程等待进程替换 一、进程创建 常见的创建进程的函数有两个&#xff1a; pid_t fork(void)pid_t vf…

一篇文章帮助你初步了解CDN内容分发网络

文章目录CDN内容分发网络CDN内容分发网络的工作原理CDN的作用CDN如何实现内容的加速CDN内容分发网络 CDN&#xff08;Content Delivery Network&#xff09;内容分发网络。CDN 是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过…

手撕CSDN博文:学用curl命令获取博文页面源码,学不会爬虫先手剥CSDN博文阅读点赞收藏和评论数量

学用curl命令获取博文页面源码&#xff0c;学不会爬虫先手剥CSDN博文阅读点赞收藏和评论数量。 (本文获得CSDN质量评分【xx】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&…

客户服务软件推荐榜:28款!

在这个竞争激烈的时代&#xff0c;做到服务对企业的存亡有着深刻的意义。改善客户服务&#xff0c;做好客户服务工作&#xff0c;是关键&#xff0c;因为客户服务团队代表着企业的形象&#xff0c;面孔&#xff0c;客户有可能 不大会记得企业的某个东西&#xff0c;但是他们将会…

module java.base does not “opens java.xxx“ to unnamed module @xxxx

错误截图 在springboot集成dubbo中 消费者服务和生产者复核都报错 错误原因 高版本JDK禁止了报错所提示的几个包的反射 而dubbo里用到了 解决 看自己的报错里有几个包被禁止了 我这有两个java.math和java.lang 添加两个JVM启动参数 –add-opens java.base/java.mathALL…

Python爬虫之Scrapy框架爬虫实战

Python爬虫中Scrapy框架应用非常广泛&#xff0c;经常被人用于属于挖掘、检测以及自动化测试类项目&#xff0c;为啥说Scrapy框架作为半成品我们又该如何利用好呢 &#xff1f;下面的实战案例值得大家看看。 目录&#xff1a; 1、Scrapy框架之命令行 2、项目实现 Scrapy框架…

安卓手机当旁路网关

一、安卓shell调试工具下载【电脑版下载地址】安卓adb调试工具&#xff0c;包含MAC苹果、Windows和Linux 三种版【手机版下载地址Termux】下载地址&#xff1a;https://github.com/termux/termux-app/releases如果不懂下载哪个版本&#xff0c;可以直接下载通用版&#xff1a;t…

Jackson CVE-2017-7525 反序列化漏洞

0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻&#xff0c;默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容&#xff1a;Java代码审计——Fastjson TemplatesImpl调用链 相关原理&#xff0c;可以参考&#xff1a;Jackson 反序列化漏洞原理 …

基于Java+SpringBoot+Vue+Uniapp(有教程)前后端分离健身预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

6款yyds的可视化搭建开源项目

之前我一直在研究低代码可视化相关的技术和产品, 也主导过很多可视化搭建项目, 主要目的是降低企业研发成本和缩短产品交付周期, 随着互联网技术的发展也陆陆续续有很多优秀的技术产品问世, 接下来我就和大家分享几款非常有价值的可视化搭建项目, 助力企业数字化转型. 1. Form…

轻松搞懂Linux中的用户管理

文章目录概念用户账户用户组用户权限用户管理工具概念 用户管理是Linux系统管理员必须掌握的重要技能之一。Linux系统是一个多用户操作系统&#xff0c;可以支持多个用户同时使用&#xff0c;每个用户拥有自己的账户和权限&#xff0c;因此管理员需要了解如何创建、管理和删除…

当参数调优无法解决kafka消息积压时可以这么做

今天的议题是&#xff1a;如何快速处理kafka的消息积压 通常的做法有以下几种&#xff1a; 增加消费者数增加 topic 的分区数&#xff0c;从而进一步增加消费者数调整消费者参数&#xff0c;如max.poll.records增加硬件资源 常规手段不是本文的讨论重点或者当上面的手段已经使…

vue 在install时候node-sass@4.14.1 postinstall: node scripts/build.js错误

今天重装了node和Vue脚手架&#xff0c;在install的时候报了下面的错误 报错如下&#xff1a; Build failed with error code: 1 [npminstall:runscript:error] node-sass^4.14.1 run postinstall node scripts/build.js error: Error: Command failed with exit code 1: node…

Allegro如何输出钻孔表操作指导

Allegro如何输出钻孔表操作指导 用Allegro做PCB设计的时候,需要输出钻孔表格,用于生产加工,如下图 如何输出钻孔表,具体操作如下 点击Manufacture点击NC

面试问题【集合】

集合常见的集合有哪些List、Set、Map 的区别ArrayList 和 Vector 的扩容机制Collection 和 Collections 有什么区别ArrayList 和 LinkedList 的区别是什么ArrayList 和 Vector 的区别是什么ArrayList 和 Array 有何区别ArrayList 集合加入1万条数据&#xff0c;应该怎么提高效率…

全面了解 B 端产品设计 — 基础扫盲篇

在今天,互联网的影响力与作用与日俱增,除了我们日常生活领域的改变以外,对于商业领域的渗透也见效颇丰。 越来越多的企业开始使用数字化的解决方案来助力企业发展,包括日常管理、运营、统计等等。或者通过互联网的方式开发出新的业务形态,进行产业升级,如这几年风头正劲的…

WMS相关知识点

目录一、WMS简介二、窗口的分类三、添加Window一、WMS简介 Window&#xff1a;在Android视图体系中Window就是一个窗口的概念。Android中所有的视图都是依赖于Window显示的。 Window是一个抽象的概念&#xff0c;它对应屏幕上的一块显示区域&#xff0c;它不是实实在在的内容&…

大学生实践| 微软ATP“师徒制”AI实战项目收获满满!

ChatGPT在极短时间内掀起了一轮AI狂潮&#xff0c;AI数据、AI大模型、AIGC……对我们AI实践项目感兴趣的同学也越来越多&#xff01;微软(亚洲)互联网工程院下属的微软ATP为大学生们提供了丰富的企业级实践项目。2个月内&#xff01;本期优秀的Chen同学在微软AI工程师团队带领下…

研报精选230301

目录 【行业230301天风证券】家用电器23W9周度研究&#xff1a;一图解读立达信招股说明书【行业230301财信证券】风电设备行业深度&#xff1a;受益大兆瓦、国产替代和技术进步&#xff0c;风电轴承or滚子有望迎来高景气度【行业230301中泰证券】有色金属行业周报&#xff1a;静…

composer安装thinkphp

人家的官方文档上步骤都有了&#xff0c;按照步骤走就行 安装composer 不作赘述 附一个文档链接&#xff1a; 安装 ThinkPHP5.1完全开发手册 看云 主要说一个自己踩过的坑吧 composer create-project topthink/think5.1.* tp5 在输入这个命令以后提示 [Composer\Downl…