Better Bootstrapping for Approximate Homomorphic Encryption
Abstract
本文推广了RNS-CKKS,提出了新的KS算法,减少了在KS算法中使用的临时模的数量。因此,在保证相同安全性的情况下,本文算法可以不依赖Bootstrapping算法实现更深级别的计算。
同时本文提出了一种新的多项式近似算法,可以在密态下评估Sin函数,该评估专门用于CKKS的Bootstrapping算法中。
结合本文推广后的RNS-CKKS和新的Sin函数评估算法,本文实现了第一个在RNS-CKKS上的Bootstrapping算法。
1. 预备知识
1.1 基础论文
CKKS
RNS-CKKS
Bootstrapping for CKKS
Improved Bootstrapping for CKKS
Faster Homomorphic Discrete Fourier Transforms and Improved FHE Bootstrapping
1.2 Full-RNS-decomposion
给定
a
(
x
)
,
b
(
x
)
∈
R
a(x),b(x)\in R
a(x),b(x)∈R,
C
=
{
q
0
,
q
1
,
.
.
.
,
q
L
}
C=\{q_0,q_1,...,q_L\}
C={q0,q1,...,qL},
q
^
i
=
∏
j
≠
i
q
j
\hat{q}_i=\prod_{j\neq i}q_j
q^i=∏j=iqj,
Q
=
∏
i
=
0
L
q
i
Q=\prod_{i=0}^L q_i
Q=∏i=0Lqi。
R
N
S
−
D
e
c
o
m
p
C
(
a
(
x
)
)
=
(
[
a
(
x
)
⋅
q
^
0
−
1
]
q
0
,
.
.
.
,
[
a
(
x
)
⋅
q
^
L
−
1
]
q
L
)
∈
R
L
+
1
R
N
S
−
P
o
w
e
r
C
(
a
(
x
)
)
=
(
a
(
x
)
⋅
q
^
0
,
a
(
x
)
⋅
q
^
1
,
.
.
.
,
a
(
x
)
⋅
q
^
L
)
∈
R
L
+
1
RNS-Decomp_C(a(x))=([a(x)·\hat{q}_0^{-1}]_{q_0},...,[a(x)·\hat{q}_L^{-1}]_{q_L}) \in R^{L+1} \\ RNS-Power_C(a(x))=(a(x)·\hat{q}_0,a(x)·\hat{q}_1,...,a(x)·\hat{q}_{L}) \in R^{L+1} \\
RNS−DecompC(a(x))=([a(x)⋅q^0−1]q0,...,[a(x)⋅q^L−1]qL)∈RL+1RNS−PowerC(a(x))=(a(x)⋅q^0,a(x)⋅q^1,...,a(x)⋅q^L)∈RL+1
则有:
a
(
x
)
⋅
b
(
x
)
=
<
R
N
S
−
D
e
c
o
m
p
C
(
a
(
x
)
)
,
R
N
S
−
P
o
w
e
r
C
(
b
(
x
)
)
>
∈
R
Q
a(x)·b(x)=<RNS-Decomp_C(a(x)),RNS-Power_C(b(x))> \in R_Q
a(x)⋅b(x)=<RNS−DecompC(a(x)),RNS−PowerC(b(x))>∈RQ
1.3 切比雪夫插值算法
待更新。。。。。。
2.针对RNS-CKKS改进的KS算法
2.1 首先描述RNS-CKKS中的KS算法
在RNS-CKKS中,其KS操作并没有使用
d
e
c
o
m
p
o
s
i
o
n
decomposion
decomposion方法,因此在KS操作时仅需要一个计算公钥即可,即:
s
w
k
=
(
b
′
,
a
′
)
∈
R
P
Q
2
swk=(b',a')\in R_{PQ}^2
swk=(b′,a′)∈RPQ2
其中:
b
′
←
−
a
′
⋅
s
2
+
P
⋅
s
1
+
e
′
(
m
o
d
P
Q
)
b'\leftarrow -a'·s_2+P·s_1+e' \ \ \ (mod \ PQ)
b′←−a′⋅s2+P⋅s1+e′ (mod PQ)
且
P
=
∏
i
=
0
k
p
i
P=\prod_{i=0}^kp_i
P=∏i=0kpi应该大于
Q
=
∏
j
=
0
L
−
1
Q=\prod_{j=0}^{L-1}
Q=∏j=0L−1以有效减少由KS操作引入的噪声。其中
k
k
k为临时模的数量。
2.2 然后描述改进后的KS算法
给定 C = { q 0 , q 1 , . . . , q L } C=\{q_0,q_1,...,q_L\} C={q0,q1,...,qL}这和RNS-CKKS中的基链相同。
给定一个整数
d
n
u
m
>
0
dnum>0
dnum>0,令
α
=
(
L
+
1
)
/
d
n
u
m
\alpha=(L+1)/dnum
α=(L+1)/dnum。生成一个新的基链:
C
′
=
{
Q
0
,
Q
1
,
.
.
.
,
Q
d
n
u
m
−
1
}
=
[
∏
i
=
j
α
(
j
+
1
)
α
−
1
q
i
]
0
≤
j
<
d
n
u
m
C'=\{Q_0,Q_1,...,Q_{dnum-1}\}=[\prod_{i=j\alpha}^{(j+1)\alpha-1}q_i]_{0\leq j < dnum}
C′={Q0,Q1,...,Qdnum−1}=[i=jα∏(j+1)α−1qi]0≤j<dnum
令
Q
^
j
=
∏
i
≠
j
Q
i
\hat{Q}_j=\prod _{i\neq j} Q_i
Q^j=∏i=jQi,
P
=
∏
i
=
0
k
−
1
p
i
P=\prod_{i=0}^{k-1}p_i
P=∏i=0k−1pi,且
∣
P
∣
≥
Q
j
|P|\geq Q_j
∣P∣≥Qj。
实际上可以看到这里将 C C C中的模等间距分为 d n u m dnum dnum组,然后每个小组中的数字相乘得到对应的大的模 Q j Q_j Qj。
K S G e n ( s 1 , s 2 , d n u m ) KSGen(s_1,s_2,dnum) KSGen(s1,s2,dnum):
注意,这里比RNS-CKKS中的 K S G e n ( ∗ ) KSGen(*) KSGen(∗)算法多了一个参数 d n u m dnum dnum,在这里该参数的含义是,需要生成 d n u m dnum dnum个 s w k swk swk。
给定两个秘密多项式 s 1 , s 2 ∈ R s_1,s_2 \in R s1,s2∈R,均匀采样 e ′ ← χ e r r e'\leftarrow \chi _{err} e′←χerr。
以RNS的形式均匀采样元素:
(
a
′
(
0
)
,
a
′
(
1
)
,
.
.
.
,
a
′
(
k
+
L
)
)
←
(
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
L
R
q
j
)
(a'^{(0)},a'^{(1)},...,a'^{(k+L)})\leftarrow (\prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{L}R_{q_j})
(a′(0),a′(1),...,a′(k+L))←(i=0∏k−1Rpi×j=0∏LRqj)
输出
{
s
w
k
j
}
0
≤
j
<
d
n
u
m
\{swk_j\}_{0\leq j < dnum}
{swkj}0≤j<dnum,可以看到这里是生成了
d
n
u
m
dnum
dnum个
s
w
k
swk
swk。
(
s
w
k
j
(
0
)
=
(
b
j
′
(
0
)
,
a
′
(
0
)
)
,
.
.
.
,
s
w
k
j
(
k
+
L
)
=
(
b
j
′
(
k
+
L
)
,
a
′
(
k
+
L
)
)
)
←
(
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
L
R
q
j
)
(swk_j^{(0)}=(b_j'^{(0)},a'^{(0)}),...,swk_j^{(k+L)}=(b_j'^{(k+L)},a'^{(k+L)}))\leftarrow (\prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{L}R_{q_j})
(swkj(0)=(bj′(0),a′(0)),...,swkj(k+L)=(bj′(k+L),a′(k+L)))←(i=0∏k−1Rpi×j=0∏LRqj)
其中每一项满足下述关系:
{
b
j
′
(
i
)
←
−
a
′
(
i
)
⋅
s
2
+
e
′
(
m
o
d
p
i
)
,
f
o
r
0
≤
i
<
k
b
j
′
(
k
+
j
)
←
−
a
′
(
k
+
j
)
⋅
s
2
+
[
P
]
q
i
⋅
[
Q
^
j
]
q
i
⋅
s
1
+
e
′
(
m
o
d
q
i
)
,
f
o
r
0
≤
j
<
L
\begin{cases} b_j'^{(i)} \leftarrow -a'^{(i)}·s_2+e' \ \ \ (mod \ \ p_i) , \ for \ 0\leq i < k \\ b_j'^{(k+j)} \leftarrow -a'^{(k+j)}·s_2+[P]_{q_i}·[\hat{Q}_j]_{q_i}·s_1+e' \ \ \ (mod \ \ q_i) , \ for \ 0\leq j < L \\ \end{cases}
{bj′(i)←−a′(i)⋅s2+e′ (mod pi), for 0≤i<kbj′(k+j)←−a′(k+j)⋅s2+[P]qi⋅[Q^j]qi⋅s1+e′ (mod qi), for 0≤j<L
现在以RNS组合的形式将这
d
n
u
m
dnum
dnum个计算公钥展示如下:
s
w
k
0
=
(
b
′
←
−
a
′
⋅
s
2
+
P
⋅
Q
^
0
⋅
s
1
+
e
′
,
a
′
)
∈
R
P
Q
2
swk_0=(b'\leftarrow -a'·s_2+P·\hat{Q}_0·s_1+e',a')\in R_{PQ}^2
swk0=(b′←−a′⋅s2+P⋅Q^0⋅s1+e′,a′)∈RPQ2
s w k 1 = ( b ′ ← − a ′ ⋅ s 2 + P ⋅ Q ^ 1 ⋅ s 1 + e ′ , a ′ ) ∈ R P Q 2 swk_1=(b'\leftarrow -a'·s_2+P·\hat{Q}_1·s_1+e',a')\in R_{PQ}^2 swk1=(b′←−a′⋅s2+P⋅Q^1⋅s1+e′,a′)∈RPQ2
. . . ... ...
s w k d n u m − 1 = ( b ′ ← − a ′ ⋅ s 2 + P ⋅ Q ^ d n u m − 1 ⋅ s 1 + e ′ , a ′ ) ∈ R P Q 2 swk_{dnum-1}=(b'\leftarrow -a'·s_2+P·\hat{Q}_{dnum-1}·s_1+e',a')\in R_{PQ}^2 swkdnum−1=(b′←−a′⋅s2+P⋅Q^dnum−1⋅s1+e′,a′)∈RPQ2
可以看到若
d
n
u
m
=
1
dnum=1
dnum=1,我们则仅有一个计算公钥为:
s
w
k
=
(
b
′
←
−
a
′
⋅
s
2
+
P
⋅
s
1
+
e
′
,
a
′
)
∈
R
P
Q
2
swk=(b'\leftarrow -a'·s_2+P·s_1+e',a')\in R_{PQ}^2
swk=(b′←−a′⋅s2+P⋅s1+e′,a′)∈RPQ2
即RNS-CKKS中的计算公钥形式,也就是说本文的KS算法是对RNS-CKKS中的KS算法的推广。
2.3 KS算法应用——密文的重线性化操作
(1) K e y G e n KeyGen KeyGen:
采样 s ← χ k e y s\leftarrow \chi_{key} s←χkey,设置密钥 s k = ( 1 , s ) sk=(1,s) sk=(1,s)。
设置重线性化密钥 e v k i 0 ≤ j < d n u m ← K S G e n ( s 2 , s ) {evk_i}_{0\leq j <dnum}\leftarrow KSGen(s^2,s) evki0≤j<dnum←KSGen(s2,s)。
令 C i = { q 0 , q 1 , . . . , q i } C_i=\{q_0,q_1,...,q_i\} Ci={q0,q1,...,qi}, C j ′ = { q j α , . . . q ( j + 1 ) α − 1 } C_j'=\{q_{j\alpha},...q_{(j+1)\alpha-1}\} Cj′={qjα,...q(j+1)α−1}, D i = ( ∪ 0 ≤ j < i C j ′ ) ∪ { p 0 , p 1 , . . . , p k − 1 } ) D_i=(\cup_{0\leq j <i}\ C_j')\cup \{p_0,p_1,...,p_{k-1}\}) Di=(∪0≤j<i Cj′)∪{p0,p1,...,pk−1})。
(2) M u l t r l k ( c t , c t ′ ) Mult_{rlk}(ct,ct') Multrlk(ct,ct′):
给定两个 l l l级别的密文 c t = ( c t ( j ) = ( c 0 ( j ) , c 1 ( j ) ) 0 ≤ j ≤ l ct=(ct^{(j)}=(c_0^{(j)},c_1^{(j)})_{0\leq j\leq l} ct=(ct(j)=(c0(j),c1(j))0≤j≤l和 c t ′ = ( c t ′ ( j ) = ( c 0 ′ ( j ) , c 1 ′ ( j ) ) 0 ≤ j ≤ l ct'=(ct'^{(j)}=(c_0'^{(j)},c_1'^{(j)})_{0\leq j\leq l} ct′=(ct′(j)=(c0′(j),c1′(j))0≤j≤l。执行如下操作:
1.
F
o
r
0
≤
j
≤
l
d
o
:
\ For\ \ 0\leq j \leq l \ \ do :
For 0≤j≤l do:(这里和RNS-CKKS的处理步骤相同)
d
0
(
j
)
←
c
0
(
j
)
c
0
′
(
j
)
(
m
o
d
q
j
)
d
1
(
j
)
←
c
0
(
j
)
c
1
′
(
j
)
+
c
1
(
j
)
c
0
′
(
j
)
(
m
o
d
q
j
)
d
2
(
j
)
←
c
1
(
j
)
c
1
′
(
j
)
(
m
o
d
q
j
)
d_0^{(j)}\leftarrow c_0^{(j)}c_0'^{(j)} \ \ \ (mod \ q_j) \\ d_1^{(j)}\leftarrow c_0^{(j)}c_1'^{(j)}+c_1^{(j)}c_0'^{(j)} \ \ \ (mod \ q_j) \\ d_2^{(j)}\leftarrow c_1^{(j)}c_1'^{(j)} \ \ \ (mod \ q_j)
d0(j)←c0(j)c0′(j) (mod qj)d1(j)←c0(j)c1′(j)+c1(j)c0′(j) (mod qj)d2(j)←c1(j)c1′(j) (mod qj)
2.
R
N
S
−
D
e
c
o
m
p
o
s
e
RNS-Decompose
RNS−Decompose:
原文这里写的很复杂,我简单来用我自己的想法来分析一下:
事实上,这里的改进是想结合 F u l l − R N S − D e c o m p o s i o n Full-RNS-Decomposion Full−RNS−Decomposion技术。
现在考虑RNS组合的形式(实际上就是CKKS17中的形式),两个密文 c t = ( c 0 , c 1 ) ct=(c_0,c_1) ct=(c0,c1)和 c t ′ = ( c 0 ′ , c 1 ′ ) ct'=(c_0',c_1') ct′=(c0′,c1′)。
(1) Tensor :
(
d
0
,
d
1
,
d
2
)
=
(
c
0
c
0
′
,
c
0
c
1
′
+
c
1
c
0
′
,
c
1
c
1
′
)
(d_0,d_1,d_2)=(c_0c_0',\ c_0c_1'+c_1c_0', \ c_1c_1')
(d0,d1,d2)=(c0c0′, c0c1′+c1c0′, c1c1′)
此时满足解密结构为:
d
0
+
d
1
⋅
s
+
d
2
⋅
s
2
=
(
m
0
+
e
0
)
⋅
(
m
1
+
e
1
)
d_0+d_1·s+d_2·s^2=(m_0+e_0)·(m_1+e_1)
d0+d1⋅s+d2⋅s2=(m0+e0)⋅(m1+e1)
(2) 重线性化:
(2-1)CKKS17版本的重线性化:
r
l
k
=
−
a
′
⋅
s
+
P
⋅
s
2
+
e
(
m
o
d
P
Q
)
rlk=-a'·s+P·s^2+e \ \ \ \ (mod \ PQ)
rlk=−a′⋅s+P⋅s2+e (mod PQ)
c m u l t = ( c m u l t , 0 , c m u l t , 1 ) = ( d 0 , d 1 ) + ⌊ P − 1 ⋅ d 2 ⋅ r l k ⌉ ( m o d Q l ) c_{mult}=(c_{mult,0},c_{mult,1})=(d_0,d_1)+\lfloor P^{-1}·d_2·rlk\rceil \ \ \ \ (mod \ Q_l) cmult=(cmult,0,cmult,1)=(d0,d1)+⌊P−1⋅d2⋅rlk⌉ (mod Ql)
(2-2)RNS-CKKS版本的重线性化:
将 r l k rlk rlk放到RNS域的 D D D上,将 ( d 0 , d 1 , d 2 ) (d_0,d_1,d_2) (d0,d1,d2)放到RNS域上的 C l C_l Cl上。
首先通过 M o d U p ( ∗ ) ModUp(*) ModUp(∗)算法将 d 2 d_2 d2提升到RNS域的 D l D_l Dl上,然后将 d 2 d_2 d2同 r l k rlk rlk在 D l D_l Dl上进行组件级乘法。
随后通过 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法将 D l D_l Dl上的 d 2 ⋅ r l k d_2·rlk d2⋅rlk转变到 C l C_l Cl上,得到 C l C_l Cl上近似的 ⌊ P − 1 ⋅ d 2 ⋅ r l k ⌉ \lfloor P^{-1}·d_2·rlk\rceil ⌊P−1⋅d2⋅rlk⌉。
这里需要注意的一点是,RNS-CKKS中是通过 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法实现除以辅助模 P P P的操作的,与CKKS17有所不同。
(2-3)本文改进后的重线性化
实际上发现重线性化的步骤就是对 d 2 d_2 d2进行操作,要得到 ⌊ P − 1 ⋅ d 2 ⋅ r l k ⌉ \lfloor P^{-1}·d_2·rlk\rceil ⌊P−1⋅d2⋅rlk⌉。
首先我们生成
d
n
u
m
dnum
dnum个重线性化密文
r
l
k
rlk
rlk:
r
l
k
0
=
(
b
′
←
−
a
′
⋅
s
+
P
⋅
Q
^
0
⋅
s
2
+
e
′
,
a
′
)
∈
R
P
Q
2
rlk_0=(b'\leftarrow -a'·s+P·\hat{Q}_0·s^2+e',a')\in R_{PQ}^2
rlk0=(b′←−a′⋅s+P⋅Q^0⋅s2+e′,a′)∈RPQ2
r l k 1 = ( b ′ ← − a ′ ⋅ s + P ⋅ Q ^ 1 ⋅ s 2 + e ′ , a ′ ) ∈ R P Q 2 rlk_1=(b'\leftarrow -a'·s+P·\hat{Q}_1·s^2+e',a')\in R_{PQ}^2 rlk1=(b′←−a′⋅s+P⋅Q^1⋅s2+e′,a′)∈RPQ2
. . . ... ...
r l k d n u m − 1 = ( b ′ ← − a ′ ⋅ s + P ⋅ Q ^ d n u m − 1 ⋅ s 2 + e ′ , a ′ ) ∈ R P Q 2 rlk_{dnum-1}=(b'\leftarrow -a'·s+P·\hat{Q}_{dnum-1}·s^2+e',a')\in R_{PQ}^2 rlkdnum−1=(b′←−a′⋅s+P⋅Q^dnum−1⋅s2+e′,a′)∈RPQ2
可以看这实际上是对
R
N
S
−
P
o
w
e
r
C
(
P
⋅
s
2
)
=
(
P
⋅
s
2
⋅
Q
^
0
,
P
⋅
s
2
⋅
Q
^
1
,
.
.
.
,
P
⋅
s
2
⋅
Q
^
d
n
u
m
−
1
)
RNS-Power_C(P·s^2)=(P·s^2·\hat{Q}_0,P·s^2·\hat{Q}_1,...,P·s^2·\hat{Q}_{dnum-1})
RNS−PowerC(P⋅s2)=(P⋅s2⋅Q^0,P⋅s2⋅Q^1,...,P⋅s2⋅Q^dnum−1)
中的每一项的加密,从而得到了
d
n
u
m
−
1
dnum-1
dnum−1个重线性化密钥。
然后我们对
d
2
d_2
d2进行
R
N
S
−
D
e
c
o
m
p
(
∗
)
RNS-Decomp(*)
RNS−Decomp(∗)处理:
R
N
S
−
D
e
c
o
m
p
C
′
(
d
2
)
=
(
[
d
2
⋅
Q
^
0
−
1
]
Q
0
,
.
.
.
,
[
d
2
⋅
Q
^
d
n
u
m
−
1
−
1
]
Q
d
n
u
m
−
1
)
RNS-Decomp_{C'}(d_2)=([d_2·\hat{Q}_0^{-1}]_{Q_0},...,[d_2·\hat{Q}_{dnum-1}^{-1}]_{Q_{dnum-1}})
RNS−DecompC′(d2)=([d2⋅Q^0−1]Q0,...,[d2⋅Q^dnum−1−1]Qdnum−1)
很明显可以看出
d
2
⋅
r
l
k
=
<
R
N
S
−
D
e
c
o
m
p
c
′
(
d
2
)
,
[
r
l
k
1
,
r
l
k
2
,
.
.
.
,
r
l
k
d
n
u
m
−
1
]
>
d_2·rlk=<RNS-Decomp_{c'}(d_2),[rlk_1,rlk_2,...,rlk_{dnum-1}]>
d2⋅rlk=<RNS−Decompc′(d2),[rlk1,rlk2,...,rlkdnum−1]>
即这里与RNS-CKKS实现了同样的功能,但是结合了Full-RNS-Decomposion技术。
上述步骤仍然是在RNS组合形式下进行分析的,但是实际操作中,肯定是全部都放在RNS域上执行的,实际上也很简单,即对每个重线性化密钥及其对应的 d 2 d_2 d2分两执行RNS域上的操作即可,然后进行相加。
后续的步骤同RNS-CKKS相同,使用 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法得到 ⌊ P − 1 ⋅ d 2 ⋅ r l k ⌉ \lfloor P^{-1}·d_2·rlk\rceil ⌊P−1⋅d2⋅rlk⌉。
现在可以简单总结一下改进后的重现性化操作,即:
<
R
N
S
−
D
e
c
o
m
p
C
′
(
d
2
)
,
E
n
c
d
(
R
N
S
−
P
o
w
e
r
C
′
(
P
⋅
s
2
)
)
>
<RNS-Decomp_{C'}(d_2),Enc_{d}(RNS-Power_{C'}(P·s^2))>
<RNS−DecompC′(d2),Encd(RNS−PowerC′(P⋅s2))>
其中
E
n
c
d
(
∗
)
Enc_d(*)
Encd(∗)表示分别加密。
也就是说通过RNS-Decompision技术将原先单个的 r l k rlk rlk分解为 d n u m dnum dnum个,将需要重线性化的密文元素 d 2 d_2 d2也分解为 d n u m dnum dnum个。
由于 d n u m dnum dnum是我们自己选择的,故我们可以在复杂性和高效性达到一个平衡。
2.4 KS算法应用——密文的旋转操作
密文的旋转操作
给定一个密文 c t = ( c 0 ( X ) , c 1 ( X ) ) ct=(c_0(X),c_1(X)) ct=(c0(X),c1(X)),其解密结构满足 < c t , s k > = c 0 ( X ) + c 1 ( X ) ⋅ s ( X ) ≈ m ( X ) <ct,sk>=c_0(X)+c_1(X)·s(X)\approx m(X) <ct,sk>=c0(X)+c1(X)⋅s(X)≈m(X)。
现在我们对密文
c
t
ct
ct执行
a
u
t
o
m
o
p
h
i
c
automophic
automophic操作:
c
t
∗
←
κ
k
(
c
t
)
=
(
c
0
(
X
5
k
)
,
c
1
(
X
5
k
)
)
ct^*\leftarrow \kappa_k (ct)=(c_0(X^{5^k}),c_1(X^{5^k}))
ct∗←κk(ct)=(c0(X5k),c1(X5k))
很明显,此时我们需要使用
s
k
∗
=
(
1
,
s
(
X
5
k
)
)
sk^*=(1,s(X^{5^k}))
sk∗=(1,s(X5k))这个新密钥来解密:
<
c
t
∗
,
s
k
∗
>
=
c
0
(
X
5
k
)
+
c
1
(
X
5
k
)
⋅
s
(
X
5
k
)
≈
m
(
X
5
k
)
<ct^*,sk^*> = c_0(X^{5^k})+c_1(X^{5^k})·s(X^{5^k})\approx m(X^{5^k})
<ct∗,sk∗>=c0(X5k)+c1(X5k)⋅s(X5k)≈m(X5k)
但是CKKS需要从始至终只使用原始密钥
s
k
sk
sk来解密。
因此使用KS旋转操作(即KS算法)
现在使用改进后的KS算法生成支持左旋k位的伽罗瓦计算公钥
{
g
a
l
k
e
y
k
,
j
}
0
≤
j
<
d
n
u
m
\{galkey_{k,j}\}_{0\leq j <dnum}
{galkeyk,j}0≤j<dnum,这里下标的
j
j
j代表第
j
j
j个
g
a
l
k
e
y
k
galkey_k
galkeyk,很明显有
d
n
u
m
dnum
dnum个,即:
g
a
l
k
e
y
k
,
0
=
(
b
′
←
−
a
′
⋅
s
+
e
′
+
P
⋅
Q
^
0
⋅
s
(
X
5
k
)
,
a
′
)
∈
R
P
Q
2
galkey_{k,0}=(b'\leftarrow -a'·s+e'+P·\hat{Q}_0·s(X^{5^k}),a')\in R_{PQ}^2
galkeyk,0=(b′←−a′⋅s+e′+P⋅Q^0⋅s(X5k),a′)∈RPQ2
g a l k e y k , 1 = ( b ′ ← − a ′ ⋅ s + e ′ + P ⋅ Q ^ 1 ⋅ s ( X 5 k ) , a ′ ) ∈ R P Q 2 galkey_{k,1}=(b'\leftarrow -a'·s+e'+P·\hat{Q}_1·s(X^{5^k}),a')\in R_{PQ}^2 galkeyk,1=(b′←−a′⋅s+e′+P⋅Q^1⋅s(X5k),a′)∈RPQ2
. . . ... ...
g a l k e y k , d n u m − 1 = ( b ′ ← − a ′ ⋅ s + e ′ + P ⋅ Q ^ d n u m − 1 ⋅ s ( X 5 k ) , a ′ ) ∈ R P Q 2 galkey_{k,dnum-1}=(b'\leftarrow -a'·s+e'+P·\hat{Q}_{dnum-1}·s(X^{5^k}),a')\in R_{PQ}^2 galkeyk,dnum−1=(b′←−a′⋅s+e′+P⋅Q^dnum−1⋅s(X5k),a′)∈RPQ2
现在将
c
1
(
X
5
k
)
c_1(X^{5^k})
c1(X5k)进行
R
N
S
−
D
e
c
o
m
p
(
∗
)
RNS-Decomp(*)
RNS−Decomp(∗)处理:
R
N
S
−
D
e
c
o
m
p
C
′
(
c
1
(
X
5
k
)
)
=
(
[
c
1
(
X
5
k
)
⋅
Q
^
0
−
1
]
Q
0
,
.
.
.
,
[
c
1
(
X
5
k
)
⋅
Q
^
d
n
u
m
−
1
−
1
]
Q
d
n
u
m
−
1
)
RNS-Decomp_{C'}(c_1(X^{5^k}))=([c_1(X^{5^k})·\hat{Q}_0^{-1}]_{Q_0},...,[c_1(X^{5^k})·\hat{Q}_{dnum-1}^{-1}]_{Q_{dnum-1}})
RNS−DecompC′(c1(X5k))=([c1(X5k)⋅Q^0−1]Q0,...,[c1(X5k)⋅Q^dnum−1−1]Qdnum−1)
然后计算:
c
1
(
X
5
k
)
⋅
r
l
k
=
<
R
N
S
−
D
e
c
o
m
p
c
′
(
c
1
(
X
5
k
)
)
,
[
g
a
l
k
e
y
k
,
0
,
g
a
l
k
e
y
k
,
1
,
.
.
.
,
g
a
l
k
e
y
k
,
d
n
u
m
−
1
>
c_1(X^{5^k})·rlk=<RNS-Decomp_{c'}(c_1(X^{5^k})),[galkey_{k,0},galkey_{k,1},...,galkey_{k,dnum-1}>
c1(X5k)⋅rlk=<RNS−Decompc′(c1(X5k)),[galkeyk,0,galkeyk,1,...,galkeyk,dnum−1>
后续的步骤同RNS-CKKS相同,使用
M
o
d
D
o
w
n
(
∗
)
ModDown(*)
ModDown(∗)算法得到
⌊
P
−
1
⋅
c
1
(
X
5
k
)
⋅
g
a
l
k
e
y
k
⌉
\lfloor P^{-1}·c_1(X^{5^k})·galkey_k\rceil
⌊P−1⋅c1(X5k)⋅galkeyk⌉。
现在可以简单总结一下改进后的旋转操作,即:
<
R
N
S
−
D
e
c
o
m
p
C
′
(
c
1
(
X
5
k
)
)
,
E
n
c
d
(
R
N
S
−
P
o
w
e
r
C
′
(
P
⋅
s
(
X
5
k
)
)
)
>
<RNS-Decomp_{C'}(c_1(X^{5^k})),Enc_{d}(RNS-Power_{C'}(P·s(X^{5^k})))>
<RNS−DecompC′(c1(X5k)),Encd(RNS−PowerC′(P⋅s(X5k)))>
其中
E
n
c
d
(
∗
)
Enc_d(*)
Encd(∗)表示分别加密。