Rotation Key Reduction for Client-Server Systems of Deep Neural Network on Fully Homomorhphic Encryption
Abstract
1. Concept of Hierarchical Rotation Key System
本节给出分解旋转密钥系统的概述。
1.1 Definition of Hierarchical Rotation Key System
在一个k-级旋转密钥系统中,存在k组旋转密钥集合,其级别从k-1递减到0。
每一个旋转密钥可以被用来生成更低级别的旋转密钥。
假设我们现在拥有了一个RNS-CKKS算法,则分级旋转密钥系统需要额外定义两个算法,如下:
$InitRotKeyGen ,该算法使用私钥 ,该算法使用私钥 ,该算法使用私钥sk$生成一组高级别的旋转密钥集。
R o t K e y G e n RotKeyGen RotKeyGen,该算法使用公钥 p k pk pk和高级别的旋转密钥 g a l k e y galkey galkey来生成低级别的旋转密钥 g a l k e y ′ galkey' galkey′。
其中, I n i t R o t K e y G e n InitRotKeyGen InitRotKeyGen算法由拥有私钥 s k sk sk的客户端执行, R o t K e y G e n RotKeyGen RotKeyGen算法由没有私钥 s k sk sk的服务器来执行。
给定私钥为 s k sk sk,和一组循环移位组成的集合 T k − 1 T_{k-1} Tk−1,右下角的下标代表这组循环移位将来生成的旋转密钥的级别, k − 1 k-1 k−1为最高级别。
(1) I n i t R o t K e y G e n ( s k , T k − 1 ) → { g a l k e y i ( k − 1 ) } i ∈ T k − 1 InitRotKeyGen(sk, T_{k-1})\rightarrow \{galkey_{i}^{(k-1)}\}_{i\in T_{k-1}} InitRotKeyGen(sk,Tk−1)→{galkeyi(k−1)}i∈Tk−1:输入一个私钥为 s k sk sk,和一组循环移位 T k − 1 T_{k-1} Tk−1,生成一组 ( k − 1 ) (k-1) (k−1)级别的循环移位在集合 T k − 1 T_{k-1} Tk−1中的旋转密钥。
给定公钥 p k pk pk,
(2) R o t K e y G e n ( p k , { g a l k e y i ( l ′ ) } i ∈ U l ′ , T l ) RotKeyGen(pk,\{galkey_i^{(l')}\}_{i \in U_{l'}}, T_{l}) RotKeyGen(pk,{galkeyi(l′)}i∈Ul′,Tl): 输入一个公钥为 p k pk pk,和一组 l ′ l' l′级别的旋转密钥 { g a l k e y i ( l ′ ) } i ∈ U l ′ \{galkey_i^{(l')}\}_{i \in U_{l'}} {galkeyi(l′)}i∈Ul′,生成一组 l l l级别的循环移位在集合 T l T_{l} Tl中的旋转密钥。
旋转密钥 g a l k e y i ( l ) galkey_{i}^{(l)} galkeyi(l)表示循环移位为 l l l,级别为 l l l的旋转密钥。
可以看出来,传统的旋转密钥生成,仅仅是本文分级旋转密钥的一种特殊情况,即只用到了 I n i t R o t K e y G e n ( s k , T k − 1 ) InitRotKeyGen(sk,T_{k-1}) InitRotKeyGen(sk,Tk−1)算法,所有的旋转密钥都是最高级别。
2. Proposed Hierarchical Rotation Key System for CKKS
CKKS的旋转操作本质上是一种KS操作,各种KS操作的优化算法已经被提出。
(超级原始的KS算法 ----> BFV提出的两种改进KS算法 ----> CKKS17中使用的KS算法 ----> Better Bootstrapping for CKKS中的结合RNS-Decomposion的KS算法 ----> Efficient Bootstrapping for CKKS中的优化的KS算法)
(RNS-CKKS中的KS算法只是把上述的KS算法放到RNS域上执行)
给定密文为 c t = ( c 0 , c 1 ) ∈ R q 2 ct=(c_0,c_1)\in R_q^2 ct=(c0,c1)∈Rq2,其解密结构满足 < c t , s k > = c 0 + c 1 ⋅ s = m + e ( m o d q ) <ct,sk>=c_0+c_1·s=m+e \ \ \ (mod \ q) <ct,sk>=c0+c1⋅s=m+e (mod q)。
2.1 传统的旋转操作
这里不再考虑RNS域上的情况,直接在RNS组合情况下进行说明,会更加清晰。
给定一系列近似模 { q 0 , q 1 , . . . , q L } \{q_0,q_1,...,q_L\} {q0,q1,...,qL},给定一个整数 d n u m dnum dnum,将近似模平均分为 d n u m dnum dnum份,即每份中有 α = ( L + 1 ) / d n u m \alpha=(L+1)/dnum α=(L+1)/dnum个小模数。
令 Q i = ∏ i α ( i + 1 ) α − 1 Q_i=\prod_{i\alpha}^{(i+1)\alpha-1} Qi=∏iα(i+1)α−1,其中 0 ≤ i < d n u m 0\leq i <dnum 0≤i<dnum。即我们得到了新的模为 { Q 0 , Q 1 , . . . , Q d n u m } \{Q_0,Q_1,...,Q_{dnum}\} {Q0,Q1,...,Qdnum}。
设 Q = ∏ i = 0 d n u m − 1 Q i Q=\prod_{i=0}^{dnum-1}Q_i Q=∏i=0dnum−1Qi,且给定大整数 P P P其中 P > Q i P>Q_i P>Qi,且二者互素。我们称Q为计算模,P为特殊模,且格外需要注意的是,P仅仅在生成计算公钥的时候使用,目的就是为了约见KS操作引入的误差。
则现在我们生成一个循环移位为r的旋转密钥。(特别要注意的是最新优化版本的KS算法的计算公钥会有
d
n
u
m
dnum
dnum个)
g
k
r
=
{
g
k
r
,
i
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_r=\{gk_{r,i}\}_{i=0,...,dnum-1}
gkr={gkr,i}i=0,...,dnum−1
其中:
g
k
r
,
i
=
(
−
a
i
′
⋅
s
+
e
i
′
+
P
⋅
Q
^
i
⋅
[
Q
^
i
−
1
]
Q
i
⋅
s
(
X
5
r
)
,
a
′
)
(
m
o
d
P
⋅
Q
)
gk_{r,i}=(-a'_i·s+e'_i+P·\hat{Q}_i·[\hat{Q}_i^{-1}]_{Q_i}·s(X^{5^r}), a') \ \ \ (mod \ P·Q)
gkr,i=(−ai′⋅s+ei′+P⋅Q^i⋅[Q^i−1]Qi⋅s(X5r),a′) (mod P⋅Q)
现在对密文
c
t
ct
ct进行一个映射:
K
r
:
m
(
X
)
→
m
(
X
5
r
)
K_r:m(X)\rightarrow m(X^{5^r})
Kr:m(X)→m(X5r)
即
K
r
(
c
t
)
→
c
t
′
=
(
c
0
′
,
c
1
′
)
=
(
c
0
(
X
5
r
)
,
c
1
(
X
5
r
)
)
K_r(ct)\rightarrow ct'=(c_0',c_1')=(c_0(X^{5^r}),c_1(X^{5^r}))
Kr(ct)→ct′=(c0′,c1′)=(c0(X5r),c1(X5r))
现在执行旋转:
c
t
∗
=
(
c
0
′
,
0
)
+
⌊
P
−
1
⋅
c
1
′
⋅
g
k
r
⌉
ct^*=(c_0',0)+\lfloor P^{-1}·c_1'·gk_r\rceil
ct∗=(c0′,0)+⌊P−1⋅c1′⋅gkr⌉
上边已经说过了
g
k
r
gk_r
gkr是由
d
n
u
m
−
1
dnum-1
dnum−1个旋转计算公钥组成的,因此
⌊
P
−
1
⋅
c
1
′
⋅
g
k
r
⌉
\lfloor P^{-1}·c_1'·gk_r\rceil
⌊P−1⋅c1′⋅gkr⌉的计算会有一些变化如下:
⌊
P
−
1
<
(
[
c
1
′
]
Q
0
,
[
c
1
′
]
Q
1
,
.
.
.
,
[
c
1
′
]
Q
d
n
u
m
−
1
)
,
(
g
k
r
,
0
,
g
k
r
,
1
,
.
.
.
,
g
k
r
,
d
n
u
m
−
1
)
>
⌉
\lfloor P^{-1}<([c_1']_{Q_0},[c_1']_{Q_1},...,[c_1']_{Q_{dnum-1}}),(gk_{r,0},gk_{r,1},...,gk_{r,dnum-1})>\rceil
⌊P−1<([c1′]Q0,[c1′]Q1,...,[c1′]Qdnum−1),(gkr,0,gkr,1,...,gkr,dnum−1)>⌉
其实这一步的本质是
R
N
S
−
D
e
c
o
m
p
o
s
e
RNS-Decompose
RNS−Decompose算法的应用。
而后 c t ∗ ct^* ct∗即我们最后经过旋转得到的密文,其仍然可以使用原始密钥 s s s来解密,但底层消息向量已经左旋了 r r r个位置。
2.2 分级旋转密钥系统中由客户端生成的加密公钥和旋转密钥
分级旋转密钥系统中,是使用模的大小来定义对应的密文的级别的。
所以这里先明确一些基本概念:
(1) Q k − 1 Q_{k-1} Qk−1表示第 k − 1 k-1 k−1级大小的模
(2) Q k − 2 Q_{k-2} Qk−2表示第 k − 2 {k-2} k−2级大小的模
首先要明白的就是这个 Q k − 1 Q_{k-1} Qk−1要大于 Q k − 2 Q_{k-2} Qk−2,关于其具体取值,到最后在进行。
传统方案中加密公钥是在模 Q = ∏ i = 0 L q i = ∏ i = 0 d n u m − 1 Q i Q=\prod_{i=0}^Lq_i=\prod_{i=0}^{dnum-1}Q_i Q=∏i=0Lqi=∏i=0dnum−1Qi下生成的。
为了深刻这种级别的概念,这里应该说成生成一个级别为 k − 1 k-1 k−1级的加密公钥 p k pk pk。
此时在模
Q
k
−
1
=
∏
i
=
0
L
k
−
1
Q_{k-1}=\prod_{i=0}^{L_{k-1}}
Qk−1=∏i=0Lk−1下生成加密公钥
p
k
pk
pk,即:
p
k
=
(
b
←
−
a
⋅
s
+
e
,
a
)
(
m
o
d
Q
k
−
1
)
pk = (b\leftarrow -a·s+e,a) \ \ \ (mod \ Q_{k-1})
pk=(b←−a⋅s+e,a) (mod Qk−1)
传统的旋转操作,旋转计算公钥是在模
P
⋅
Q
P·Q
P⋅Q下生成,在分级旋转密钥系统中客户端要生成顶级旋转密钥,也就是
k
−
1
k-1
k−1级别的旋转密钥,即在模
P
k
−
1
⋅
Q
k
−
1
P_{k-1}·Q_{k-1}
Pk−1⋅Qk−1下生成
k
−
1
k-1
k−1级的旋转密钥
g
k
r
(
k
−
1
)
gk_r^{(k-1)}
gkr(k−1)。
g
k
r
(
k
−
1
)
=
{
g
k
r
,
i
(
k
−
1
)
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_r^{(k-1)}=\{gk_{r,i}^{(k-1)}\}_{i=0,...,dnum-1}
gkr(k−1)={gkr,i(k−1)}i=0,...,dnum−1
其中:
g
k
r
,
i
(
k
−
1
)
=
(
−
a
r
,
i
′
(
k
−
1
)
⋅
s
+
e
r
,
i
k
−
1
+
P
k
−
1
⋅
Q
^
k
−
1
,
i
⋅
[
Q
^
k
−
1
,
i
−
1
]
Q
k
−
1
,
i
⋅
s
(
X
5
r
)
,
a
r
,
i
k
−
1
)
(
m
o
d
P
k
−
1
⋅
Q
k
−
1
)
gk_{r,i}^{(k-1)}=(-a_{r,i}'^{(k-1)}·s+e_{r,i}^{k-1}+P_{k-1}·\hat{Q}_{k-1,i}·[\hat{Q}_{k-1,i}^{-1}]_{Q_{k-1, i}}·s(X^{5^r}), a_{r,i}^{k-1}) \ \ \ (mod \ P_{k-1}·Q_{k-1})
gkr,i(k−1)=(−ar,i′(k−1)⋅s+er,ik−1+Pk−1⋅Q^k−1,i⋅[Q^k−1,i−1]Qk−1,i⋅s(X5r),ar,ik−1) (mod Pk−1⋅Qk−1)
换句话说,当 P k − 1 = P P_{k-1}=P Pk−1=P且 Q k − 1 = Q Q_{k-1}=Q Qk−1=Q时,此 k − 1 k-1 k−1级旋转密钥同传统旋转密钥的生成完全相同。
我们将这里旋转密钥的生成定义为 I n i t R o t K e y G e n ( ∗ ) InitRotKeyGen(*) InitRotKeyGen(∗)算法。
2.3 RotToRot and PubToRot Operations
现在描述分级旋转密钥系统中,如何生成 l < k − 1 l<k-1 l<k−1级的旋转密钥。实际上这里就是 R o t K e y G e n ( ∗ ) RotKeyGen(*) RotKeyGen(∗)算法。该算法中包含两种类型的操作,分别为 P u b T o R o t ( ∗ ) PubToRot(*) PubToRot(∗)和 R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗)。
P u b T o R o t ( ∗ ) PubToRot(*) PubToRot(∗):该算法可以从公钥 p k pk pk中生成 l l l级别的旋转密钥。
R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗):该算法可以从已有的 l l l级旋转密钥中生成新的 l l l级旋转密钥,其循环移位不同于已有的旋转密钥。
很明显,可以看到 R o t K e y G e n ( ∗ ) RotKeyGen(*) RotKeyGen(∗)算法实质上就是 P u b T o R o t ( ∗ ) PubToRot(*) PubToRot(∗)算法和 R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗)算法的结合。
令" s h i f t − r k e y shift-r\ key shift−r key"表示循环移位为 r r r的旋转密钥。
令" ( r , l ) − k e y (r,l)-key (r,l)−key " 表示循环移位为 r r r,且级别为 l l l的旋转密钥。
为了解释的方便,首先将介绍 R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗)算法。
R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗):该算法输入一个" ( r , l ) − k e y (r,l)-key (r,l)−key"以及一个级别高于 l l l的" s h i f t − r ′ k e y shift-r' \ key shift−r′ key",然后输出一个" ( r + r ′ , l ) − k e y (r+r',l)-key (r+r′,l)−key"。
现在我们给定一个
l
l
l级,循环移位为
r
r
r的旋转密钥
(
r
,
l
)
−
k
e
y
(r,l)-key
(r,l)−key,如下:
g
k
r
(
l
)
=
{
g
k
r
,
i
(
l
)
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_r^{(l)}=\{gk_{r,i}^{(l)}\}_{i=0,...,dnum-1}
gkr(l)={gkr,i(l)}i=0,...,dnum−1
其中:
g
k
r
,
i
(
l
)
=
(
b
r
,
i
(
l
)
←
−
a
r
,
i
′
(
l
)
⋅
s
+
e
r
,
i
(
l
)
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
(
X
5
r
)
,
a
r
,
i
(
l
)
)
(
m
o
d
P
l
⋅
Q
l
)
gk_{r,i}^{(l)}=(b_{r,i}^{(l)}\leftarrow-a_{r,i}'^{(l)}·s+e_{r,i}^{(l)}+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s(X^{5^r}), a_{r,i}^{(l)}) \ \ \ (mod \ P_{l}·Q_{l})
gkr,i(l)=(br,i(l)←−ar,i′(l)⋅s+er,i(l)+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s(X5r),ar,i(l)) (mod Pl⋅Ql)
可以很明显的看到 g k r , i ( l ) = ( b r , i ( l ) , a r , i ( l ) ) ∈ R Q l P l 2 gk_{r,i}^{(l)}=(b_{r,i}^{(l)},a_{r,i}^{(l)})\in R_{Q_lP_l}^2 gkr,i(l)=(br,i(l),ar,i(l))∈RQlPl2实际上就是 P l ⋅ Q ^ l , i ⋅ [ Q ^ l , i − 1 ] Q l , i ⋅ s ( X 5 r ) P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s(X^{5^r}) Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s(X5r)在密钥 s s s,模 Q l P l Q_lP_l QlPl下加密的密文。同普通的密文除了模的区别外, 形式完全相同。
也就是说,如果我们对
g
k
r
,
i
(
l
)
gk_{r,i}^{(l)}
gkr,i(l)执行循环移位为
r
′
r'
r′的旋转操作,那么我们会得到在密钥s,模
Q
l
P
l
Q_lP_l
QlPl下新的密文,该密文是对如下明文的加密:
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
(
(
x
5
r
′
)
5
r
)
=
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
(
X
5
r
+
r
′
)
P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s({(x^{5^{r'}})^{5^r}}) = P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s(X^{5^{r+r'}})
Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s((x5r′)5r)=Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s(X5r+r′)
即我们现在得到了一个新的
l
l
l级,循环移位为
r
+
r
′
r+r'
r+r′的旋转密钥
(
r
+
r
′
,
l
)
−
k
e
y
(r+r',l)-key
(r+r′,l)−key:
g
k
r
+
r
′
(
l
)
=
{
g
k
r
+
r
′
,
i
(
l
)
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_{r+r'}^{(l)}=\{gk_{r+r',i}^{(l)}\}_{i=0,...,dnum-1}
gkr+r′(l)={gkr+r′,i(l)}i=0,...,dnum−1
其中:
g
k
r
+
r
′
,
i
(
l
)
=
(
b
r
+
r
′
,
i
(
l
)
←
−
a
r
+
r
′
,
i
′
(
l
)
⋅
s
+
e
r
+
r
′
,
i
(
l
)
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
(
X
5
r
+
r
′
)
,
a
r
+
r
′
,
i
(
l
)
)
(
m
o
d
P
l
⋅
Q
l
)
gk_{r+r',i}^{(l)}=(b_{r+r',i}^{(l)}\leftarrow-a_{r+r',i}'^{(l)}·s+e_{r+r',i}^{(l)}+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s(X^{5^{r+r'}}), a_{r+r',i}^{(l)}) \ \ \ (mod \ P_{l}·Q_{l})
gkr+r′,i(l)=(br+r′,i(l)←−ar+r′,i′(l)⋅s+er+r′,i(l)+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s(X5r+r′),ar+r′,i(l)) (mod Pl⋅Ql)
很明显可以看到上述 R o t T o R o t ( ∗ ) RotToRot(*) RotToRot(∗)算法除了客户端生成的高级旋转密钥外,还需要一个低级别的旋转密钥,但是客户端是没有提供的,所以本文提出了使用公钥来生成低级别旋转密钥的算法。
接下来介绍 P u b T o R o t ( ∗ ) PubToRot(*) PubToRot(∗)算法
P u b T o P u b ( ∗ ) PubToPub(*) PubToPub(∗):该算法输入一个公钥 p k pk pk,然后输出一个 l l l级,循环移位为0的旋转密钥 ( 0 , l ) − k e y (0,l)-key (0,l)−key。
为了方便理解,首先给定
l
l
l级,循环移位为0的旋转密钥的形式:
g
k
0
(
l
)
=
{
g
k
0
,
i
(
l
)
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_0^{(l)}=\{gk_{0,i}^{(l)}\}_{i=0,...,dnum-1}
gk0(l)={gk0,i(l)}i=0,...,dnum−1
其中:
g
k
0
,
i
(
l
)
=
(
b
0
,
i
(
l
)
←
−
a
0
,
i
′
(
l
)
⋅
s
+
e
0
,
i
(
l
)
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
,
a
0
,
i
(
l
)
)
(
m
o
d
P
l
⋅
Q
l
)
gk_{0,i}^{(l)}=(b_{0,i}^{(l)}\leftarrow-a_{0,i}'^{(l)}·s+e_{0,i}^{(l)}+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s, a_{0,i}^{(l)}) \ \ \ (mod \ P_{l}·Q_{l})
gk0,i(l)=(b0,i(l)←−a0,i′(l)⋅s+e0,i(l)+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s,a0,i(l)) (mod Pl⋅Ql)
现在需要探讨一下
g
k
0
,
i
(
l
)
gk_{0,i}^{(l)}
gk0,i(l)的解密结构:
b
0
,
i
(
l
)
+
a
0
,
i
(
l
)
⋅
s
=
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
+
e
0
,
i
(
l
)
(
m
o
d
P
l
Q
l
)
b_{0,i}^{(l)}+a_{0,i}^{(l)}·s=P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s+e_{0,i}^{(l)} \ \ \ (mod \ P_lQ_l)
b0,i(l)+a0,i(l)⋅s=Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s+e0,i(l) (mod PlQl)
也就是说,如果解密结构满足这种形式,我们就可以认为这是一个
l
l
l级,循环移位为0的旋转密钥。
现在定义,如何使用公钥 p k = ( − a s + e , a ) ∈ R Q k − 1 2 pk=(-as+e,a)\in R_{Q_{k-1}}^2 pk=(−as+e,a)∈RQk−12生成一个旋转密钥。
首先,我们将该公钥
p
k
pk
pk从模
Q
k
−
1
Q_{k-1}
Qk−1上放到模
Q
l
P
l
Q_lP_l
QlPl上,这一步可以说是非常简单的操作,可以直接使用RNS-CKKS中提到的
M
o
d
U
p
(
∗
)
ModUp(*)
ModUp(∗)算法。于是我们得到了新的公钥
(
b
′
,
a
′
)
=
(
[
b
]
Q
l
P
l
,
[
a
]
Q
l
P
l
)
∈
R
Q
l
P
l
2
(b',a')=([b]_{Q_lP_l},[a]_{Q_lP_l})\in R_{Q_lP_l}^2
(b′,a′)=([b]QlPl,[a]QlPl)∈RQlPl2
由于旋转密钥是存在dnum个的,所以我们需要执行下述操作:
b
0
,
i
l
=
b
′
a
0
,
i
(
l
)
=
a
′
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
b_{0,i}^{l}=b' \\ a_{0,i}^{(l)}=a'+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}
b0,il=b′a0,i(l)=a′+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i
此时,我们定义这个由公钥
p
k
pk
pk生成的
l
l
l级,循环移位为0的旋转密钥:
g
k
0
(
l
)
=
{
g
k
0
,
i
(
l
)
}
i
=
0
,
.
.
.
,
d
n
u
m
−
1
gk_0^{(l)}=\{gk_{0,i}^{(l)}\}_{i=0,...,dnum-1}
gk0(l)={gk0,i(l)}i=0,...,dnum−1
其中:
g
k
0
,
i
(
l
)
=
(
b
0
,
i
(
l
)
=
b
′
,
a
0
,
i
(
l
)
=
a
′
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
)
(
m
o
d
P
l
⋅
Q
l
)
gk_{0,i}^{(l)}=(b_{0,i}^{(l)}=b', a_{0,i}^{(l)}=a'+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}) \ \ \ (mod \ P_{l}·Q_{l})
gk0,i(l)=(b0,i(l)=b′,a0,i(l)=a′+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i) (mod Pl⋅Ql)
这里看起来,好像 a 0 , i ( l ) a_{0,i}^{(l)} a0,i(l)的形式变复杂了,而 b 0 , i ( l ) b_{0,i}^{(l)} b0,i(l)的形式变简单了,但实际上完全没有这种变化,因为归根结底,这都只是环 R P l Q l R_{P_lQ_l} RPlQl中的元素而已。
现在查看
g
k
0
,
i
(
l
)
gk_{0,i}^{(l)}
gk0,i(l)的解密结构:
b
0
,
i
(
l
)
+
a
0
,
i
(
l
)
⋅
s
=
b
′
+
a
′
⋅
s
+
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
=
P
l
⋅
Q
^
l
,
i
⋅
[
Q
^
l
,
i
−
1
]
Q
l
,
i
⋅
s
+
e
(
m
o
d
Q
l
P
l
)
b_{0,i}^{(l)}+a_{0,i}^{(l)}·s=b'+a'·s+P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s=P_{l}·\hat{Q}_{l,i}·[\hat{Q}_{l,i}^{-1}]_{Q_{l, i}}·s+e \ \ \ (mod \ Q_lP_l)
b0,i(l)+a0,i(l)⋅s=b′+a′⋅s+Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s=Pl⋅Q^l,i⋅[Q^l,i−1]Ql,i⋅s+e (mod QlPl)
可以发现这就是
l
l
l级,循环移位为0的旋转密钥的解密结构,换句话说,我们得到了
l
l
l级,循环移位为0的旋转密钥
(
0
,
l
)
−
k
e
y
(0,l)-key
(0,l)−key。
2.4 安全分析
所有的操作均没有修改CKKS方案,即所有的操作均是在客户端将可以公开的公钥和高级旋转密钥上由服务器执行的,也就是说,分级旋转密钥系统最多所能够得到的信息就是在所有公开的信息上所能得到的信息。所以只要CKKS方案是安全的,分级旋转密钥系统就是安全的。
3.二级旋转密钥系统
下面定义一个完整的二级旋转密钥系统。
给定一系列近似模 { q 0 , q 1 , . . . , q L } \{q_0,q_1,...,q_L\} {q0,q1,...,qL},满足 Q l = ∏ i = 0 l q i , f o r 0 ≤ l ≤ L Q_l=\prod_{i=0}^{l}q_i,for \ 0\leq l\leq L Ql=∏i=0lqi,for 0≤l≤L,给定一个整数 d n u m dnum dnum,将近似模平均分为 d n u m dnum dnum份,即每份中有 α = ( L + 1 ) / d n u m \alpha=(L+1)/dnum α=(L+1)/dnum个小模数.
令 Q i = ∏ i α ( i + 1 ) α − 1 Q_i=\prod_{i\alpha}^{(i+1)\alpha-1} Qi=∏iα(i+1)α−1,其中 0 ≤ i < d n u m 0\leq i <dnum 0≤i<dnum。即我们得到了新的模为 { Q 0 , Q 1 , . . . , Q d n u m } \{Q_0,Q_1,...,Q_{dnum}\} {Q0,Q1,...,Qdnum}。
给定特殊模 { p 0 , p 1 , . . . , p k − 1 } \{p_0,p_1,...,p_{k-1}\} {p0,p1,...,pk−1},其中两两互素,满足 P = ∏ j = 0 k − 1 p j P=\prod_{j=0}^{k-1}p_j P=∏j=0k−1pj。
(1) 生成私钥 s k = ( 1 , s ) sk=(1,s) sk=(1,s)。
(2) 生成1级公钥 p k ( 1 ) = ( b ( 1 ) ← − a ( 1 ) ⋅ s + e ( 1 ) , a ( 1 ) ) ∈ R Q 2 pk^{(1)}=(b^{(1)}\leftarrow -a^{(1)}·s+e^{(1)},a^{(1)})\in R_{Q}^2 pk(1)=(b(1)←−a(1)⋅s+e(1),a(1))∈RQ2
(3) 给定一个密文 c t = ( c 0 , c 1 ) ∈ R Q l 2 ct=(c_0,c_1)\in R_{Q_l}^2 ct=(c0,c1)∈RQl2
(4) 客户端首先生成一个支持循环移位
r
r
r的1级旋转密钥:
g
k
r
(
1
)
=
{
g
k
r
,
i
(
1
)
}
0
≤
i
<
d
n
u
m
−
1
gk_r^{(1)}=\{gk_{r,i}^{(1)}\}_{0\leq i < dnum-1}
gkr(1)={gkr,i(1)}0≤i<dnum−1
其中:
g
k
r
,
i
(
1
)
=
(
−
a
r
,
i
(
1
)
⋅
s
+
e
r
,
i
(
1
)
+
P
⋅
Q
^
i
⋅
[
Q
^
i
−
1
]
Q
i
⋅
s
(
X
5
r
)
,
a
r
,
i
(
1
)
)
(
m
o
d
P
⋅
Q
)
gk_{r,i}^{(1)}=(-a_{r,i}^{(1)}·s+e_{r,i}^{(1)}+P·\hat{Q}_{i}·[\hat{Q}_{i}^{-1}]_{Q_{i}}·s(X^{5^r}), a_{r,i}^{(1)}) \ \ \ (mod \ P·Q)
gkr,i(1)=(−ar,i(1)⋅s+er,i(1)+P⋅Q^i⋅[Q^i−1]Qi⋅s(X5r),ar,i(1)) (mod P⋅Q)
此时得到的是1级旋转密钥。
使用该旋转密钥,自然也可以对密文 c t ct ct进行旋转,现在我们使用服务器生成的0级旋转密钥来旋转该密文。
在生成低级别的旋转密钥前,还需要做一件事情,首先1级旋转密钥的模为 P Q PQ PQ,还记得我们定义级别是使用模的大小来定义的,因此我们需要选择比 P Q PQ PQ更小的模,不妨设此模为 P ( 0 ) Q ( 0 ) P^{(0)}Q^{(0)} P(0)Q(0)。
在最后给出这个模如何取值,因为这真的很重要。
(5) 服务器将1级公钥
p
k
(
1
)
pk^{(1)}
pk(1)转变为模
P
(
0
)
Q
(
0
)
P^{(0)}Q^{(0)}
P(0)Q(0)下的0级公钥
p
k
(
0
)
pk^{(0)}
pk(0),即:
p
k
(
0
)
=
(
b
(
0
)
,
a
(
0
)
)
=
(
[
b
(
1
)
]
Q
(
0
)
P
(
0
)
,
[
a
(
1
)
]
Q
(
0
)
P
(
0
)
)
∈
R
Q
(
0
)
P
(
0
)
2
pk^{(0)}=(b^{(0)},a^{(0)})=([b^{(1)}]_{Q^{(0)}P^{(0)}},[a^{(1)}]_{Q^{(0)}P^{(0)}})\in R_{Q^{ (0)}P^{(0)}}^2
pk(0)=(b(0),a(0))=([b(1)]Q(0)P(0),[a(1)]Q(0)P(0))∈RQ(0)P(0)2
(6) 然后将该公钥转变为0级的循环移位为0的旋转密钥:
g
k
0
(
0
)
=
{
g
k
0
,
i
(
0
)
=
(
b
0
,
i
(
0
)
,
a
0
,
i
(
0
)
)
}
i
=
0
,
1
,
.
.
.
,
d
n
u
m
−
1
gk_0^{(0)}=\{gk_{0,i}^{(0)}=(b_{0,i}^{(0)},a_{0,i}^{(0)})\}_{i=0,1,...,dnum-1}
gk0(0)={gk0,i(0)=(b0,i(0),a0,i(0))}i=0,1,...,dnum−1
其中:
b
0
,
i
(
0
)
=
b
(
0
)
=
−
a
(
0
)
s
+
e
(
0
)
a
0
,
i
(
l
)
=
a
(
0
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
b_{0,i}^{(0)}=b^{(0)}=-a^{(0)}s+e^{(0)} \\ a_{0,i}^{(l)}=a^{(0)}+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}}
b0,i(0)=b(0)=−a(0)s+e(0)a0,i(l)=a(0)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i
(7) 现在服务器使用旋转密钥
g
k
r
(
1
)
gk_r^{(1)}
gkr(1)和
g
k
0
(
0
)
gk_0^{(0)}
gk0(0)来生成
g
k
r
(
0
)
gk_r^{(0)}
gkr(0)。
首先,提取得到 g k 0 ( 0 ) gk_0^{(0)} gk0(0)的一个分量为 g k 0 , i ( 0 ) = ( b ( 0 ) , a ( 0 ) + P ( 0 ) ⋅ Q ^ ( 0 ) , i ⋅ [ Q ^ ( 0 ) , i − 1 ] Q ( 0 ) , i ) gk_{0,i}^{(0)}=(b^{(0)},a^{(0)}+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}}) gk0,i(0)=(b(0),a(0)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)。
然后,使用旋转映射
K
r
(
g
k
0
,
i
(
0
)
)
=
(
b
′
,
a
′
)
=
(
−
a
(
0
)
(
X
5
r
)
s
(
X
5
r
)
+
e
(
0
)
(
X
5
r
)
,
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
K_r(gk_{0,i}^{(0)})=(b',a')=(-a^{(0)}(X^{5^r})s(X^{5^r})+e^{(0)}(X^{5^r}),a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})
Kr(gk0,i(0))=(b′,a′)=(−a(0)(X5r)s(X5r)+e(0)(X5r),a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)
再然后使用旋转密钥
g
k
r
(
1
)
gk_r^{(1)}
gkr(1)操作
K
r
(
g
k
0
,
i
(
0
)
)
K_r(gk_{0,i}^{(0)})
Kr(gk0,i(0)),得到:
(
b
′
,
0
)
+
⌊
P
−
1
⋅
a
′
⋅
g
k
r
(
1
)
⌉
(b',0)+\lfloor P^{-1}·a'·gk_r^{(1)}\rceil
(b′,0)+⌊P−1⋅a′⋅gkr(1)⌉
由于
g
k
r
(
1
)
gk_r^{(1)}
gkr(1)使用的特殊模数为P,所以这里得使用
P
−
1
P^{-1}
P−1。
上一步操作得到结果为:
(
b
,
a
)
=
(
−
a
(
0
)
(
X
5
r
)
s
(
X
5
r
)
+
e
(
0
)
(
X
5
r
)
+
⌊
P
−
1
⋅
(
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
⋅
(
−
a
r
,
i
(
1
)
⋅
s
+
e
r
,
i
(
1
)
+
P
⋅
s
(
X
5
r
)
)
⌉
,
⌊
P
−
1
⋅
(
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
⋅
a
r
,
i
(
1
)
⌉
(b,a)=\\ (-a^{(0)}(X^{5^r})s(X^{5^r})+e^{(0)}(X^{5^r})+\\\lfloor P^{-1}·(a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})·(-a_{r,i}^{(1)}·s+e_{r,i}^{(1)}+P·s(X^{5^r}))\rceil, \\ \lfloor P^{-1}·(a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})·a_{r,i}^{(1)}\rceil
(b,a)=(−a(0)(X5r)s(X5r)+e(0)(X5r)+⌊P−1⋅(a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)⋅(−ar,i(1)⋅s+er,i(1)+P⋅s(X5r))⌉,⌊P−1⋅(a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)⋅ar,i(1)⌉
现在通过解密结构查看这一步操作引入的噪音:
b
+
a
⋅
s
=
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
⋅
s
(
X
5
r
)
+
e
(
0
)
(
X
5
r
)
+
⌊
P
−
1
⋅
(
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
⋅
e
r
,
i
(
1
)
⌉
b+a·s\\=P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}}·s(X^{5^r})+e^{(0)}(X^{5^r})+\lfloor P^{-1}·(a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})·e_{r,i}^{(1)}\rceil
b+a⋅s=P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i⋅s(X5r)+e(0)(X5r)+⌊P−1⋅(a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)⋅er,i(1)⌉
首先
e
(
0
)
(
X
5
r
)
e^{(0)}(X^{5^r})
e(0)(X5r)项,是公钥
p
k
pk
pk拥有的,只不过进行了旋转,不会增大,也就是这步操作实际上仅仅增加了
⌊
P
−
1
⋅
(
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
⋅
e
r
,
i
(
1
)
⌉
\lfloor P^{-1}·(a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})·e_{r,i}^{(1)}\rceil
⌊P−1⋅(a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)⋅er,i(1)⌉项误差,为了使该误差足够小,则应该满足模
Q
(
0
)
⋅
P
(
0
)
Q^{(0)}·P^{(0)}
Q(0)⋅P(0)小于P才可以。
对 g k 0 ( 0 ) gk_0^{(0)} gk0(0)的每一个分量都执行该步骤,我们完整的得到了 g k r ( 0 ) gk_r^{(0)} gkr(0),该旋转密钥中蕴含的误差如上,我们将其统一记录为 e ( 0 ) e^{(0)} e(0)。
(8)接下来,我们使用这个0级的,循环移位为r旋转密钥 g k r ( 0 ) gk_r^{(0)} gkr(0)来旋转上述给定的密文 c t = ( c 0 , c 1 ) ∈ R Q l 2 ct=(c_0,c_1)\in R_{Q_l}^2 ct=(c0,c1)∈RQl2。
首先对密文进行旋转映射:
K
r
(
c
t
)
=
(
c
0
′
,
c
1
′
)
=
(
c
0
(
X
5
r
)
,
c
1
(
X
5
r
)
)
∈
R
Q
l
2
K_r(ct)=(c_0',c_1')=(c_0(X^{5^r}),c_1(X^{5^r})) \in R_{Q_l}^2
Kr(ct)=(c0′,c1′)=(c0(X5r),c1(X5r))∈RQl2
然后使用旋转密钥
g
k
r
(
0
)
gk_r^{(0)}
gkr(0)操作
K
r
(
c
t
)
K_r(ct)
Kr(ct):
(
c
0
′
,
0
)
+
⌊
P
(
0
)
−
1
⋅
c
1
′
⋅
g
k
r
(
0
)
⌉
(c_0',0)+\lfloor P^{(0)-1}·c_1'·gk_r^{(0)}\rceil
(c0′,0)+⌊P(0)−1⋅c1′⋅gkr(0)⌉
由于旋转密钥
g
k
r
(
0
)
gk_r^{(0)}
gkr(0)使用的特殊模数为
P
(
0
)
P^{(0)}
P(0),所以这里使用
P
(
0
)
−
1
P^{(0)-1}
P(0)−1。
上一步得到的结果为:
(
c
0
∗
,
c
1
∗
)
=
(
c
0
(
X
5
r
)
+
⌊
P
(
0
)
−
1
⋅
c
0
(
X
5
r
)
(
−
a
(
0
)
⋅
s
+
e
(
0
)
+
P
(
0
)
⋅
s
(
X
5
r
)
)
⌉
,
⌊
P
(
0
)
−
1
⋅
c
0
(
X
5
r
)
(
−
a
(
0
)
)
⌉
(c_0^*,c_1^*)=\\ (c_0(X^{5^r})+\lfloor P^{(0)-1}·c_0(X^{5^r})(-a^{(0)}·s+e^{(0)}+P^{(0)}·s(X^{5^r}))\rceil, \\ \lfloor P^{(0)-1}·c_0(X^{5^r})(-a^{(0)})\rceil
(c0∗,c1∗)=(c0(X5r)+⌊P(0)−1⋅c0(X5r)(−a(0)⋅s+e(0)+P(0)⋅s(X5r))⌉,⌊P(0)−1⋅c0(X5r)(−a(0))⌉
得到的新密文
(
c
0
∗
,
c
1
∗
)
(c_0^*,c_1^*)
(c0∗,c1∗)即旋转后可以使用原始密钥
s
k
sk
sk解密的新的密文,现在通过解密结构查看这一步骤引入的误差。
c
0
∗
+
c
1
∗
⋅
s
=
c
0
(
X
5
r
)
+
c
1
(
X
5
r
)
⋅
s
(
X
5
r
)
+
⌊
P
(
0
)
−
1
⋅
c
1
(
X
5
r
)
⋅
e
(
0
)
⌉
c_0^*+c_1^*·s=c_0(X^{5^r})+c_1(X^{5^r})·s(X^{5^r})+\lfloor P^{(0)-1}·c_1(X^{5^r})·e(0)\rceil
c0∗+c1∗⋅s=c0(X5r)+c1(X5r)⋅s(X5r)+⌊P(0)−1⋅c1(X5r)⋅e(0)⌉
可以看到,从服务器生成低级别密钥,到使用低级别密钥旋转密文,得到的新的密文这个全部的过程,引入的误差为:
⌊
P
(
0
)
−
1
⋅
c
1
(
X
5
r
)
⋅
e
(
0
)
⌉
\lfloor P^{(0)-1}·c_1(X^{5^r})·e(0)\rceil
⌊P(0)−1⋅c1(X5r)⋅e(0)⌉
如果说,我们能够设置
P
(
0
)
≥
c
1
(
X
5
r
)
⋅
e
(
0
)
P^{(0)} \geq c_1(X^{5^r})·e(0)
P(0)≥c1(X5r)⋅e(0),则分级旋转密钥系统引入的所有误差,和传统旋转密钥系统引入的误差完全没有区别。非常优秀的一个性质。
重新分析上边这个不等式,我们将
e
(
0
)
e^{(0)}
e(0)项完整写出来:
c
1
(
X
5
r
)
⋅
(
e
(
0
)
(
X
5
r
)
+
⌊
P
−
1
⋅
(
a
(
0
)
(
X
5
r
)
+
P
(
0
)
⋅
Q
^
(
0
)
,
i
⋅
[
Q
^
(
0
)
,
i
−
1
]
Q
(
0
)
,
i
)
⋅
e
r
,
i
(
1
)
⌉
)
c_1(X^{5^r})·(e^{(0)}(X^{5^r})+\lfloor P^{-1}·(a^{(0)}(X^{5^r})+P^{(0)}·\hat{Q}_{{(0)},i}·[\hat{Q}_{(0),i}^{-1}]_{Q_{(0), i}})·e_{r,i}^{(1)}\rceil)
c1(X5r)⋅(e(0)(X5r)+⌊P−1⋅(a(0)(X5r)+P(0)⋅Q^(0),i⋅[Q^(0),i−1]Q(0),i)⋅er,i(1)⌉)
很明显可以看到,我们已经使用
P
−
1
P^{-1}
P−1把误差项约见到足够小了,所以上边的不等式是肯定能够满足的。
再考虑,假如我们拥有另外一个新的1级循环移位 r ′ r' r′的旋转密钥,我们使用它再次对上述生成的0级旋转密钥操作,我们会得到循环移位为 r + r ′ r+r' r+r′的旋转密钥。
很明显,可以看到这也会引入误差,但是无所谓由于 P P P的存在,这个误差先被约减少一次,然后再被 P ( 0 ) P^{(0)} P(0)约减一次,得到的结果和传统一次性旋转密钥引入的误差基本可以说是相同的。