文章目录
- 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+q⋅I,因此要通过一个取模的操作将 q ⋅ I q \cdot I q⋅I消除。如何进行同态地取模是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)ModRaisem+qI(modQ)CoeffToSlot(m+qI)∗EvalMod(m)∗SlotToCoeffm(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,...,t2N−1)和 z 1 ′ = ( t N 2 , . . . , t N − 1 ) z_1'=(t_{\frac{N}{2}},...,t_{N-1}) z1′=(t2N,...,tN−1)。
同态取模操作(EvalMod):使用加法和乘法来拟合取模操作,这一步会产生一定的噪声。因为加法和乘法执行过程有噪声,同时拟合函数本身使用了三角函数来对取模函数拟合,三角函数和取模之间还存在一定的误差,这一部分也会形成噪声。噪声的大小与消息和 q q q之间的大小关系 ϵ = m q \epsilon = \frac{m}{q} ϵ=qm决定。因此,令 m m m尽可能的小也是一种控制噪声的方法。
同态解码(SlotToCoeff):同态解码操作是同态编码的逆操作。将Slot中的数放回系数中。也是通过一个矩阵乘法的方式来做。
总结:可以看到,CKKS的Bootstrapping都是直接在密文上进行操作,比如乘一个DFT矩阵和DFT逆矩阵,以及密文上面的多项式操作。因此,相比其他Bootstrapping技术存在的优势是:
- 不需要Bootstrapping密钥
- 计算复杂度是 O ( log ( ∣ s k ∣ 1 ⋅ q ) ) O(\log(|sk|_1 \cdot q)) O(log(∣sk∣1⋅q))的
- 需要的内存很小,只有一个密文反复计算
如何做同态取模操作
取模操作 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)∥∞<K。
在欧密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]q−S(x)∣≤32π2qϵ3→O(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]q−S(x)∣=2πq
q2πm−sin(q2πm)
≤2πq⋅3!1(q2π∣m∣)3=O(q⋅q3∣m∣3)=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=0∑d−1d!f(n)(x0)⋅(x−x0)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=0∑d−1(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πq⋅2π(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=0n−1aixi,令 n = k ⋅ m n=k\cdot m n=k⋅m,
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)=akm−1xkm−1+⋯+a1x+a0=(akm−1xk−1+⋯+ak(m−1))⋅xk(m−1)+(ak(m−1)−1xk−1+⋯+ak(m−2))⋅xk(m−2)...+(a2k−1xk−1+⋯+ak)⋅xk+ak−1xk−1+⋯+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(m−1)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=0∑d−1(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(θ)+i⋅sin(θ),可以得出 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(2r⋅q2π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(2r⋅q2πit)∣≤(d0+1)!Δ∣2r2πK∣d0+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+1≤2π(d0+1)Δ⋅2r(2r−1(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(2r⋅q2π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(q−2π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]\} {5jmodM∣j∈[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]\} {−5jmodM∣j∈[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,0≤j<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=0N−1miXi,可以令其系数组成向量 m = ( m 0 , . . . , m N − 1 ) \boldsymbol{m}=(m_0,...,m_{N-1}) m=(m0,...,mN−1)。
解码函数: τ : R → C N / 2 \tau : R \to \mathbb{C}^{N/2} τ:R→CN/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)0≤j<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=0N−1mi⋅(ζj)i。
因此,这个解码变换可以写为
z
=
U
⋅
m
\boldsymbol{z}=\mathbf{U}\cdot \boldsymbol{m}
z=U⋅m,其中
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=
11⋮1ζ0ζ1⋮ζ2N−1ζ02ζ12⋮ζ2N−12⋯⋯⋱⋯ζ0N−1ζ1N−1⋮ζ2N−1N−1
∈C(N/2)×N
**编码函数:**直接取解码函数的逆变换,其实
m
=
U
−
1
⋅
z
\boldsymbol{m}=\mathbf{U}^{-1} \cdot \boldsymbol{z}
m=U−1⋅z。但
U
−
1
\mathbf{U}^{-1}
U−1一般不直接计算,利用范德蒙的行列式的形式,我们将
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)=CRT⋅m,则
m
=
C
R
T
−
1
⋅
(
z
,
z
‾
)
\boldsymbol{m} = \mathsf{CRT}^{-1}\cdot (\boldsymbol{z},\overline{\boldsymbol{z}})
m=CRT−1⋅(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) CRT−1=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(UT⋅z+UT⋅z)。
同态的旋转、共轭,和同态矩阵向量乘法(密文状态下怎么做)
在计算编码函数的时候,相当于要计算密文状态下的 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(UT⋅z+UT⋅z)过程,解码函数为 z = U ⋅ m \boldsymbol{z}=U\cdot \boldsymbol{m} z=U⋅m。其中 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') ksk←KSGens(s′):取 a ′ ∈ R P Q a' \in \mathcal{R}_{PQ} a′∈RPQ, b ′ = − a ′ s + e ′ + P s ′ m o d P Q b'=-a's +e' + Ps' \bmod PQ b′=−a′s+e′+Ps′modPQ,转化密钥为 ( 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}) ct←KeySwitch(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)+⌊P−1⋅a1⋅ksk⌋modQ。
那么得到的
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+⌊P−1⋅a1⋅b′⌋+(⌊P−1⋅a1⋅a′⌋)s=b1+P−1⋅a1⋅(−a′s+e′+Ps′)+P−1a1a′s+ϵ=b1+a1s′+P−1a1e′+ϵ=m+e1+P−1a1e′+ϵ≈m
同态的旋转和共轭
考虑明文多项式如何旋转Slot:
在编码过程中,对于一个向量 z = ( z j ) 0 ≤ j < N 2 \boldsymbol{z} = (z_j)_{0\le j < \frac{N}{2}} z=(zj)0≤j<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):x−1。
比如 [ ζ , ζ 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,0⋮Ak−1,0A0,1A1,1⋮Ak−1,1A0,2A1,2⋮Ak−1,2⋯⋯⋱⋯A0,k−1A1,k−1⋮Ak−1,k−1 ∈Ck×k
对于一个向量 z = ( z j ) 0 ≤ j < k \boldsymbol{z} = (z_j)_{0\le j < k} z=(zj)0≤j<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=0k−1Ai,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,...,Ak−1,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,...,Ak−1,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=0k−1A0,izi,∑i=0k−1A1,izi,...∑i=0k−1Ak−1,izi}。
但这样的话,我们需要 k k k个密文,分别加密 { z i , . . . , z i } 0 ≤ i < k \{z_i,...,z_i\}_{0\le i < k} {zi,...,zi}0≤i<k。
改善思路:
注意到,
-
原本在矩阵第 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′,...,Ak−1,r′′}的形式。
-
而第 j j j列对应的元素,要与 z j z_j zj相乘。而 z = ( z 0 , . . . , z k − 1 ) \boldsymbol{z}=(z_0,...,z_{k-1}) z=(z0,...,zk−1)本身是一个下标递增的数组。
所以我们要构造的与 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,...,Ak−i,0,...,Ak−1,i−1},与 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,...,xk−i,0...,zi−1)相乘。
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)) A⋅z=∑0≤i<k(ai⋅Rot(z,i))。其中
这样的话,只需要原本的 z \boldsymbol{z} z的密文就可以构造。但需要 k k k次的旋转和 k k k次的明文密文乘法。但旋转操作比较耗时,有没有方法进一步减少旋转的次数?是有的:
小步大步法:
取
k
1
⋅
k
2
=
k
k_1 \cdot k_2 = k
k1⋅k2=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}
A⋅z=0≤i<k∑(ai⋅Rot(z,i))=0≤j<k2∑0≤i<k1∑(aj⋅k1+i⋅Rot(z,j⋅k1+i))=0≤j<k2∑Rot(0≤i<k1∑Rot(aj⋅k1+i,−j⋅k1)⋅Rot(z,i),j⋅k1)
这样做就只需要
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
k1⋅k2=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 Q0≫q的密文,其中包含的明文为 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+⋯+tN−1XN−1。
同态编码(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,...,t2N−1)和
z
1
′
=
(
t
N
2
,
.
.
.
,
t
N
−
1
)
z_1'=(t_{\frac{N}{2}},...,t_{N-1})
z1′=(t2N,...,tN−1)。
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=
11⋮1ζ0ζ1⋮ζ2N−1ζ02ζ12⋮ζ2N−12⋯⋯⋱⋯ζ0N−1ζ1N−1⋮ζ2N−1N−1
∈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=
11⋮1ζ0ζ1⋮ζ2N−1……⋱…ζ02N−1ζ12N−1⋮ζ2N−12N−1
and U1=
ζ02Nζ12N⋮ζ2N−12Nζ02N+1ζ12N+1⋮ζ2N−12N+1……⋱…ζ0N−1ζ1N−1⋮ζ2N−1N−1
令
z
′
∈
C
N
/
2
\boldsymbol{z}'\in \mathbb{C} ^{N/2}
z′∈CN/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(UkT⋅z′+UkT⋅z′),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(UkT⋅z′+UkT⋅z′),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,...,tN−1)。
记 z ′ = ( z 0 , . . . , z N 2 − 1 ) \boldsymbol{z'}=(z_0,...,z_{\frac{N}{2}-1}) z′=(z0,...,z2N−1)为 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,0≤i<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′=U⋅t,z′=U⋅t。
[ 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) [z′z′]=[U0U0U1U1]⋅t→[z′z′]=[U0U0U1U1]⋅[z0′z1′];downarrow[z0′z1′]=[U0U0U1U1]−1⋅[z′z′]→[z0′z1′]=N1[U0TU1TU0TU1T]⋅[z′z′]↓z0′=N1(U0T⋅z′+U0T⋅z′)z1′=N1(U1T⋅z′+U1T⋅z′)
同态取模操作(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(2r⋅q2π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(q−2π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πq⋅21(exp(q2πim)−exp(q−2πim))。
迭代运算过程如下:
同态解码(SlotToCoeff):同态解码操作是同态编码的逆操作。将Slot中的数放回系数中。也是通过一个矩阵乘法的方式来做。
我们通过上一个同态取模操作,将 z 0 ′ = ( t 0 , . . . , t N 2 − 1 ) z_0'=(t_0,...,t_{\frac{N}{2}-1}) z0′=(t0,...,t2N−1)和 z 1 ′ = ( t N 2 , . . . , t N − 1 ) z_1'=(t_{\frac{N}{2}},...,t_{N-1}) z1′=(t2N,...,tN−1)变为了 z 0 = ( m 0 , . . . , m N 2 − 1 ) z_0=(m_0,...,m_{\frac{N}{2}-1}) z0=(m0,...,m2N−1), z 1 = ( m N 2 , . . . , m N − 1 ) z_1=(m_{\frac{N}{2}},...,m_{N-1}) z1=(m2N,...,mN−1)。我们计算 z = U 0 ⋅ z 0 + U 1 ⋅ z 1 z = U_0 \cdot z_0 + U_1 \cdot z_1 z=U0⋅z0+U1⋅z1。
其余优化操作:
稀疏密文:不利用到密文中所有 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 34sinx−61sin2x来计算的话,则可以达到更高的逼近程度。原因在于
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=x−x3/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/3x−2/9x3+1/90x5−1/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/9x3−2/45x5+4/945x7−…
Jung Cheon, Kyoohyung Han, Andrey Kim, Miran Kim, and Yongsoo Song. Bootstrapping for approximate homomorphic encryption. In EUROCRYPT, pages 360–384, 01 2018. ↩︎ ↩︎ ↩︎ ↩︎
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 ↩︎ ↩︎ ↩︎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. ↩︎