RNS-CKKS同态加密
本文提出了CKKS的RNS变体。首先本文引入了一种新的密文模结构,该结构允许对分圆多项式进行RNS分解,并对每个RNS分量进行NTT转换,实际上就是近似模组成的模链。同时本文还提出了一种不需要RNS组合的近似模交换技术,即在密文在RNS表示下可以使用近似模交换技术变得到模交换后的结果。实际上可以看到,这里全部使用到了CKKS的核心概念,误差是明文的一部分,只要误差足够小就可以接受。
Abstract
本文提出了CKKS的RNS变体。
首先本文引入了一种新的密文模结构,该结构允许对分圆多项式进行RNS分解,并对每个RNS分量进行NTT转换,实际上就是近似模组成的模链。
同时本文还提出了一种不需要RNS组合的近似模交换技术,即在密文在RNS表示下可以使用近似模交换技术变得到模交换后的结果。
实际上可以看到,这里全部使用到了CKKS的核心概念,误差是明文的一部分,只要误差足够小就可以接受。
1.预备知识
1.1CKKS17的知识
1.2 CRT和RNS
给定大整数
q
=
∏
i
=
1
k
q
i
q=\prod_{i=1}^kq_i
q=∏i=1kqi,其中
q
i
q_i
qi之间两两互素。CRT阐述了一个环同构的存在,即:
Z
q
≃
∏
i
=
1
k
Z
q
i
\mathbb{Z}_q \simeq \prod_{i=1}^k \mathbb{Z}_{q_i}
Zq≃i=1∏kZqi
根据该环同构,CRT蕴含了一个余数系统(RNS),即可以将模
q
q
q上的大整数运算同构到模
q
1
,
q
2
,
.
.
.
,
q
k
{q_1,q_2,...,q_k}
q1,q2,...,qk上的平行小整数运算,即:
a
(
m
o
d
q
)
≃
(
a
1
,
a
2
,
.
.
.
,
a
k
)
,
其中
a
i
≡
a
(
m
o
d
q
i
)
a \ (mod \ q) \simeq (a_1,a_2,...,a_k),其中a_i\equiv a \ (mod \ q_i)
a (mod q)≃(a1,a2,...,ak),其中ai≡a (mod qi)
根据
C
R
T
CRT
CRT,由
R
N
S
RNS
RNS表示的数字
a
1
,
a
2
,
.
.
.
,
a
k
a_1,a_2,...,a_k
a1,a2,...,ak可以在模
q
q
q的意义下,唯一恢复得到
a
a
a,计算过程如下:
a
=
∑
i
=
1
k
Q
i
⋅
[
Q
i
−
1
]
q
i
⋅
a
i
(
m
o
d
q
)
a=\sum_{i=1}^k Q_i·[Q_i^{-1}]_{q_i}·a_i \ \ \ (mod \ q)
a=i=1∑kQi⋅[Qi−1]qi⋅ai (mod q)
其中
Q
i
=
q
/
q
i
Q_i=q/q_i
Qi=q/qi,
[
Q
i
−
1
]
q
i
[Q_i^{-1}]_{q_i}
[Qi−1]qi表示
Q
i
Q_i
Qi在模
q
i
q_i
qi下的逆。
1.3 Fast RNS Base Conversion(该算法首先被提出在RNS-FV中)
给定两组基链,分别为
C
=
q
1
,
q
2
,
.
.
.
,
q
k
C={q_1,q_2,...,q_k}
C=q1,q2,...,qk和
B
=
m
1
,
m
2
,
.
.
.
,
m
l
B={m_1,m_2,...,m_l}
B=m1,m2,...,ml,且满足
q
=
∏
i
=
1
k
q=\prod_{i=1}^k
q=∏i=1k和
m
=
∏
j
=
1
l
m
j
m=\prod_{j=1}^lm_j
m=∏j=1lmj。给定
a
(
m
o
d
q
)
a \ (mod \ q)
a (mod q)对基链C的RNS表示
(
a
1
,
a
2
,
.
.
.
,
a
k
)
(a_1,a_2,...,a_k)
(a1,a2,...,ak)。则Fast RNS Base Conversion的目的为将
(
a
1
,
a
2
,
.
.
.
,
a
k
)
(a_1,a_2,...,a_k)
(a1,a2,...,ak)直接转换为在基链
B
B
B下的RNS表示,而不需要进行RNS组合操作,该算法定义如下:
F
a
s
t
B
C
o
n
v
(
a
,
C
,
B
)
=
(
∑
i
=
1
k
Q
i
⋅
[
Q
i
−
1
]
q
i
⋅
a
i
m
o
d
m
j
)
1
≤
j
≤
l
FastBConv(a,C,B)=(\sum_{i=1}^k Q_i·[Q_i^{-1}]_{q_i}·a_i \ \ mod \ m_j)_{1\leq j\leq l}
FastBConv(a,C,B)=(i=1∑kQi⋅[Qi−1]qi⋅ai mod mj)1≤j≤l
不妨假设
a
m
o
d
q
a \ mod \ q
a mod q在基链
B
B
B下的RNS表示为
(
b
1
,
b
2
,
.
.
.
,
b
l
)
(b_1,b_2,...,b_l)
(b1,b2,...,bl)。则我们本意希望的是这个RNS表示满足如下计算:
b
i
=
a
m
o
d
m
j
b_i = a \ \ \ mod \ m_j
bi=a mod mj
但实际上我们知道
∑
i
=
1
k
Q
i
⋅
[
Q
i
−
1
]
q
i
⋅
a
i
=
a
+
e
⋅
q
\sum_{i=1}^k Q_i·[Q_i^{-1}]_{q_i}·a_i = a+e·q
i=1∑kQi⋅[Qi−1]qi⋅ai=a+e⋅q
故实际上经过
F
a
s
t
B
C
o
n
v
(
∗
)
FastBConv(*)
FastBConv(∗)算法后我们得到的是
a
+
e
⋅
q
a+e·q
a+e⋅q在基链
B
B
B下的RNS表示
(
b
1
,
b
2
,
.
.
.
,
b
l
)
(b_1,b_2,...,b_l)
(b1,b2,...,bl),实际上满足如下计算:
b
i
=
a
+
e
⋅
q
m
o
d
m
j
b_i = a+e·q \ \ \ mod \ m_j
bi=a+e⋅q mod mj
若此时将
(
b
1
,
b
2
,
.
.
.
,
b
l
)
(b_1,b_2,...,b_l)
(b1,b2,...,bl)恢复成模
m
m
m的大整数,则得到的大整数是
a
+
e
⋅
q
(
m
o
d
m
)
a+e·q \ \ (mod \ m)
a+e⋅q (mod m)。
也就是说FastBConv算法会引入些许误差,这实际上是通过误差换时间的想法。
此时在回到CKKS的思想上,只要这个误差足够小,那么在CKKS算法中就可以接受。
1.4 近似基链——为RNS-CKKS特意引入的新的密文模结构
(1) 首先回顾CKKS17中RS操作的概念。
选择缩放因子
Δ
=
q
>
0
\Delta = q>0
Δ=q>0,设置密文模结构为:
Q
l
=
q
l
,
其中
0
≤
l
≤
L
Q_l=q^l, 其中0\leq l\leq L
Ql=ql,其中0≤l≤L
给定明文多项式
m
m
m的
l
l
l 级密文
c
t
∈
R
Q
l
2
ct \in R_{Q_l}^2
ct∈RQl2。
则CKKS17中
R
S
RS
RS 操作为计算:
c
t
r
s
=
⌊
q
−
1
⋅
c
t
⌉
∈
R
Q
l
−
1
2
ct_{rs}=\lfloor q^{-1}·ct\rceil \in R_{Q_{l-1}}^2
ctrs=⌊q−1⋅ct⌉∈RQl−12
即
R
S
RS
RS 操作会得到
q
−
1
⋅
m
q^{-1}·m
q−1⋅m的近似加密
c
t
r
s
ct_{rs}
ctrs,且这是
l
−
1
l-1
l−1级的密文。
可以看到 R S RS RS 每次操作后,密文内部的缩放因子 Δ \Delta Δ是不变的。
(2) 现在定义RNS-CKKS中的近似基概念
RNS表示的先决条件就是基链中的元素是互素的。
首先我们仍然选择缩放因子为
Δ
=
q
>
0
\Delta=q>0
Δ=q>0,同时我们设置一个预定义的精度
η
\eta
η,然后我们选择一组基如下:
C
=
{
q
0
,
q
1
,
.
.
.
,
q
L
}
C=\{q_0,q_1,...,q_L\}
C={q0,q1,...,qL}
C
C
C中的每个元素都需要满足以下条件:
q
i
/
q
∈
(
1
−
2
−
η
,
1
+
2
−
η
)
,
其中
q
i
遍历
C
q_i/q \in (1-2^{-\eta},1+2^{-\eta}),其中q_i遍历C
qi/q∈(1−2−η,1+2−η),其中qi遍历C
发现
C
C
C中的每个元素都是缩放因子
Δ
\Delta
Δ的近似,这就是近似基的由来。
重新设置密文模结构如下:
Q
l
=
∏
i
=
0
l
q
i
Q_l=\prod_{i=0}^l q_i
Ql=i=0∏lqi
如此一来每次
R
S
RS
RS 操作的元素就变成了
C
C
C中的元素。
很明显可以观察到,现在每次 R S RS RS 操作后,密文内部的缩放因子会发生改变,换句话说,这就是RS操作引入的误差,还是利用CKKS的核心思想,只要这个误差足够小,那我们就可以接受。
1.5 近似模交换
(1) 模交换(Modulus—Switching)
MS操作被介绍在BGV12中,
简单来说就是将模 Q 1 Q_1 Q1下的密文转换为模 Q 2 Q_2 Q2下的密文。
(2) 基的选择
给出RNS-CKKS中基的选择如下:
{
B
=
{
p
0
,
p
1
,
.
.
.
,
p
k
−
1
}
C
=
{
q
0
,
q
1
,
.
.
.
,
q
l
−
1
}
D
=
{
p
0
,
p
1
,
.
.
.
,
p
k
−
1
,
q
0
,
q
1
,
.
.
.
,
q
l
−
1
}
\begin{cases} B=\{p_0,p_1,...,p_{k-1}\} \\ C=\{q_0,q_1,...,q_{l-1}\} \\ D=\{p_0,p_1,...,p_{k-1}, q_0,q_1,...,q_{l-1}\} \\ \end{cases}
⎩
⎨
⎧B={p0,p1,...,pk−1}C={q0,q1,...,ql−1}D={p0,p1,...,pk−1,q0,q1,...,ql−1}
其中,
P
=
∏
i
=
0
k
−
1
p
i
P=\prod_{i=0}^{k-1}p_i
P=∏i=0k−1pi,
Q
=
∏
j
=
0
l
−
1
q
j
Q=\prod_{j=0}^{l-1}q_j
Q=∏j=0l−1qj。
(3) 近似模交换( A p p r o x i m a t e M o d u l u s S w i t c h i n g Approximate \ \ Modulus \ \ Switching Approximate Modulus Switching)
RNS-CKKS中的模交换分为两个步骤,分别为 A p p r o x i m a t e M o d u l u s R a i s i n g Approximate \ \ Modulus \ \ Raising Approximate Modulus Raising和 A p p r o x i m a t e M o d u l u s R e d u c t i o n Approximate \ \ Modulus \ \ Reduction Approximate Modulus Reduction
首先介绍 A p p r o x i m a t e M o d u l u s R a i s i n g Approximate \ \ Modulus \ \ Raising Approximate Modulus Raising算法:
A l g o r i t h m 1 : A p p r o x i m a t e M o d u l u s R a i s i n g Algorithm 1: Approximate \ Modulus \ Raising Algorithm1:Approximate Modulus Raising
1.
i
n
p
u
t
1. input
1.input:
[
a
]
C
=
(
a
(
0
)
,
a
(
1
)
,
.
.
.
,
a
(
l
−
1
)
)
,
w
h
e
r
e
a
∈
Z
Q
[a]_C=(a^{(0)},a^{(1)},...,a^{(l-1)}),where \ a\in \ \mathbb{Z}_Q
[a]C=(a(0),a(1),...,a(l−1)),where a∈ ZQ
2.
p
r
o
c
e
d
u
r
e
:
M
o
d
U
p
C
→
D
(
[
a
]
C
)
2. procedure:ModUp_{C\rightarrow D}([a]_C)
2.procedure:ModUpC→D([a]C):
(
a
~
(
0
)
,
a
~
(
1
)
,
.
.
.
,
a
~
(
k
−
1
)
)
←
C
o
n
C
→
D
(
[
a
]
C
)
(\tilde a^{(0)},\tilde a^{(1)},...,\tilde a^{(k-1)})\leftarrow Con_{C\rightarrow D}([a]_C)
(a~(0),a~(1),...,a~(k−1))←ConC→D([a]C)
3.
r
e
t
r
u
n
3. retrun
3.retrun:
(
a
~
(
0
)
,
a
~
(
1
)
,
.
.
.
,
a
~
(
k
−
1
)
,
a
(
0
)
,
a
(
1
)
,
.
.
.
,
a
(
l
−
1
)
)
(\tilde a^{(0)},\tilde a^{(1)},...,\tilde a^{(k-1)},a^{(0)},a^{(1)},...,a^{(l-1)})
(a~(0),a~(1),...,a~(k−1),a(0),a(1),...,a(l−1))
算法分析:
- 最后得到的RNS表示实际上是 a ~ = a + e ⋅ Q \tilde a=a+e·Q a~=a+e⋅Q在 D D D上的RNS表示。
- 当误差足够小,我们可以近似的认为得到的是 a a a在 D D D上的RNS表示。
算法功能描述:
- 该算法输入 a ∈ Z Q a\in \mathbb{Z}_Q a∈ZQ在 C C C上的RNS表示,近似返回 a ∈ Z P Q a \in \mathbb{Z}_{PQ} a∈ZPQ在 D D D上的RNS表示。
然后介绍 A p p r o x i m a t e M o d u l u s R e d u c t i o n Approximate \ \ Modulus \ \ Reduction Approximate Modulus Reduction算法:
A l g o r i t h m 2 : A p p r o x i m a t e M o d u l u s R e d u c t i o n Algorithm 2:Approximate \ Modulus \ Reduction Algorithm2:Approximate Modulus Reduction
1.
i
n
p
u
t
1. input
1.input:
[
b
~
]
D
=
(
b
~
(
0
)
,
b
~
(
1
)
,
.
.
.
,
b
~
(
k
+
l
−
1
)
)
=
(
[
b
~
]
B
,
[
b
~
]
C
)
,
其中
b
~
∈
Z
P
⋅
Q
[\tilde{b}]_D=(\tilde b^{(0)},\tilde b^{(1)},...,\tilde b^{(k+l-1)})=([\tilde b]_B,[\tilde b]_C),其中 \ \tilde b \in \mathbb Z_{P·Q}
[b~]D=(b~(0),b~(1),...,b~(k+l−1))=([b~]B,[b~]C),其中 b~∈ZP⋅Q
2.
p
r
o
c
e
d
u
r
e
:
M
o
d
D
o
w
n
D
→
C
(
[
b
~
]
D
)
2. procedure:ModDown_{D \rightarrow C}([\tilde b]_D)
2.procedure:ModDownD→C([b~]D)
2.1
提取
[
b
~
]
D
的前
k
个元素,可以得到
2.1 提取[\tilde{b}]_D的前k个元素,可以得到
2.1提取[b~]D的前k个元素,可以得到:
[
b
~
m
o
d
P
]
B
=
(
b
~
(
0
)
,
b
~
(
1
)
,
.
.
.
,
b
~
(
k
−
1
)
)
[\tilde{b}\ \ mod \ P]_B=(\tilde b^{(0)},\tilde b^{(1)},...,\tilde b^{(k-1)})
[b~ mod P]B=(b~(0),b~(1),...,b~(k−1))
2.2
进行基变换
2.2 进行基变换
2.2进行基变换:
(
a
~
(
0
)
,
a
~
(
1
)
,
.
.
.
,
a
~
(
l
−
1
)
)
←
C
o
n
B
→
C
(
[
b
~
m
o
d
P
]
B
)
(\tilde a^{(0)},\tilde a^{(1)},...,\tilde a^{(l-1)})\leftarrow Con_{B\rightarrow C}([\tilde{b}\ \ mod \ P]_B)
(a~(0),a~(1),...,a~(l−1))←ConB→C([b~ mod P]B)
2.3
计算
2.3计算
2.3计算:
b
(
j
)
=
P
−
1
⋅
(
b
~
k
+
j
−
a
~
(
j
)
)
m
o
d
q
j
,
f
o
r
a
l
l
0
≤
j
≤
l
−
1
b^{(j)}=P^{-1}·(\tilde{b}^{k+j}-\tilde{a}^{(j)}) \ \ mod \ q_j, for \ \ \ all\ \ \ 0 \leq j \leq l-1
b(j)=P−1⋅(b~k+j−a~(j)) mod qj,for all 0≤j≤l−1
3.
r
e
t
r
u
n
3. retrun
3.retrun:
[
b
]
C
=
(
b
(
0
)
,
b
(
1
)
,
.
.
.
,
b
(
l
−
1
)
)
[b]_C=(b^{(0)},b^{(1)},...,b^{(l-1)})
[b]C=(b(0),b(1),...,b(l−1))
算法分析:
-
由 [ b ~ ] D [\tilde{b}]_D [b~]D可以计算得到 b ~ ∈ Z P ⋅ Q \tilde{b} \in \mathbb{Z}_{P·Q} b~∈ZP⋅Q,而由 [ b ~ ] B [\tilde{b}]_B [b~]B只能得到 b ~ m o d P ∈ Z P \tilde{b} \ \ mod \ P \in \mathbb{Z}_P b~ mod P∈ZP,由 [ b ~ ] C [\tilde{b}]_C [b~]C只能得到 b ~ m o d Q ∈ Z Q \tilde{b} \ \ mod \ Q \in \mathbb{Z}_Q b~ mod Q∈ZQ。
-
在2.3步骤的计算中,每一次计算的值为:
b ( j ) = P − 1 ⋅ ( b ~ − ( b ~ m o d P ) − e ⋅ P ( m o d q j ) b^{(j)}=P^{-1}·(\tilde{b}-(\tilde{b} \ \ mod \ P)-e·P \ \ (mod \ q_j) b(j)=P−1⋅(b~−(b~ mod P)−e⋅P (mod qj)
- 也就是说最后输出的结果为:
[ b ] C = [ P − 1 ⋅ ( b ~ − ( b ~ m o d P ) − e ⋅ P ) ] C [b]_C=[P^{-1}·(\tilde{b}-(\tilde{b} \ \ mod \ P)-e·P)]_C [b]C=[P−1⋅(b~−(b~ mod P)−e⋅P)]C
- 即此时我们可以根据 [ b ] C [b]_C [b]C计算得到:
b = P − 1 ⋅ ( b ~ − ( b ~ m o d P ) − e ⋅ P ) ∈ Z Q b=P^{-1}·(\tilde{b}-(\tilde{b} \ \ mod \ P)-e·P)\in \mathbb{Z}_Q b=P−1⋅(b~−(b~ mod P)−e⋅P)∈ZQ
- 实际上这是一个近似值:
b ≈ P − 1 ⋅ b ~ b\approx P^{-1}·\tilde{b} b≈P−1⋅b~
算法功能描述:
- 该算法输入 b ~ \tilde{b} b~在 D D D上的RNS表示,近似返回 b ≈ P − 1 ⋅ b ~ b\approx P^{-1}·\tilde{b} b≈P−1⋅b~在 C C C上的RNS表示。
(4) 算法扩展
M
o
d
U
p
C
→
D
(
⋅
)
ModUp_{C\rightarrow D}(·)
ModUpC→D(⋅)和
M
o
d
D
o
w
n
D
→
C
(
⋅
)
ModDown_{D\rightarrow C}(·)
ModDownD→C(⋅)可以直接扩展到多形式环中,如下所示:
{
M
o
d
U
p
C
→
D
(
⋅
)
:
∏
j
=
0
l
−
1
R
q
j
→
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
l
−
1
R
q
j
M
o
d
D
o
w
n
D
→
C
(
⋅
)
:
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
l
−
1
R
q
j
→
∏
j
=
0
l
−
1
R
q
j
\begin{cases} ModUp_{C\rightarrow D}(·)&:\prod_{j=0}^{l-1}R_{q_j}\rightarrow \prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{l-1}R_{q_j} \\ ModDown_{D\rightarrow C}(·)&:\prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{l-1}R_{q_j} \rightarrow \prod_{j=0}^{l-1}R_{q_j}\\ \end{cases}
{ModUpC→D(⋅)ModDownD→C(⋅):∏j=0l−1Rqj→∏i=0k−1Rpi×∏j=0l−1Rqj:∏i=0k−1Rpi×∏j=0l−1Rqj→∏j=0l−1Rqj
该算法可以实现近似模交换的功能:
b
=
M
o
d
D
o
w
n
D
→
C
(
M
o
d
U
p
C
→
D
(
a
)
)
≈
P
−
1
⋅
a
b=ModDown_{D \rightarrow C}(ModUp_{C\rightarrow D}(a))\approx P^{-1}·a
b=ModDownD→C(ModUpC→D(a))≈P−1⋅a
2. RNS-CKKS算法
将CKKS算法表达到RNS域上,核心是:
( 1 ) (1) (1)近似模数的选择:
近似模数的选择可以将CKKS的公钥 p k pk pk,计算密钥 e v k evk evk,密文 c t ct ct,放到RNS域上,即普通的RNS分解即可。
$(2) $近似模交换算法:
该算法主要用在KS操作中,KS操作的对象是一个密文和一个计算密钥。
首先通过 M o d U p ( ∗ ) ModUp(*) ModUp(∗)算法将 C l C_l Cl基上需要进行密钥交换的密文放到 D l D_l Dl基上。然后同 D l D_l Dl基上的计算密钥进行RNS组件级的乘法。然后通过 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法将 D l D_l Dl基上的密文重新放到 C l C_l Cl基上并乘以 P − 1 P^{-1} P−1。
一个 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法被用在 R S ( c t ) RS(ct) RS(ct)算法中,可以将一个 C l C_l Cl基上的密文放到 C l − 1 C_{l-1} Cl−1基上并乘以 q l − 1 q_l^{-1} ql−1。
S e t u p ( q , L , η , 1 λ ) Setup(q,L,\eta,1^{\lambda}) Setup(q,L,η,1λ):
初始化操作
K S G e n ( s 1 , s 2 ) KSGen(s_1,s_2) KSGen(s1,s2):
给定两个秘密多项式 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)
输出swk:
(
s
w
k
(
0
)
=
(
b
′
(
0
)
,
a
′
(
0
)
)
,
.
.
.
,
s
w
k
(
k
+
L
)
=
(
b
′
(
k
+
L
)
,
a
′
(
k
+
L
)
)
)
←
(
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
L
R
q
j
)
(swk^{(0)}=(b'^{(0)},a'^{(0)}),...,swk^{(k+L)}=(b'^{(k+L)},a'^{(k+L)}))\leftarrow (\prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{L}R_{q_j})
(swk(0)=(b′(0),a′(0)),...,swk(k+L)=(b′(k+L),a′(k+L)))←(i=0∏k−1Rpi×j=0∏LRqj)
其中每一项满足下述关系:
{
b
′
(
i
)
←
−
a
′
(
i
)
⋅
s
2
+
e
′
(
m
o
d
p
i
)
,
f
o
r
0
≤
i
<
k
b
′
(
k
+
j
)
←
−
a
′
(
k
+
j
)
⋅
s
2
+
[
P
]
q
i
⋅
s
1
+
e
′
(
m
o
d
q
i
)
,
f
o
r
0
≤
j
<
L
\begin{cases} b'^{(i)} \leftarrow -a'^{(i)}·s_2+e' \ \ \ (mod \ \ p_i) , \ for \ 0\leq i < k \\ b'^{(k+j)} \leftarrow -a'^{(k+j)}·s_2+[P]_{q_i}·s_1+e' \ \ \ (mod \ \ q_i) , \ for \ 0\leq j < L \\ \end{cases}
{b′(i)←−a′(i)⋅s2+e′ (mod pi), for 0≤i<kb′(k+j)←−a′(k+j)⋅s2+[P]qi⋅s1+e′ (mod qi), for 0≤j<L
K e y G e n KeyGen KeyGen:
s k G e n skGen skGen: 采样 s ← χ k e y s\leftarrow \chi_{key} s←χkey,设置密钥为 s k ← ( 1 , s ) sk\leftarrow (1,s) sk←(1,s)。
p k G e n pkGen pkGen: 采样 e ← χ e r r e\leftarrow \chi _{err} e←χerr。
以RNS的形式均匀采样元素:
(
a
(
0
)
,
a
(
1
)
,
.
.
.
,
a
(
L
)
)
←
(
∏
j
=
0
L
R
q
j
)
(a^{(0)},a^{(1)},...,a^{(L)})\leftarrow (\prod_{j=0}^{L}R_{q_j})
(a(0),a(1),...,a(L))←(j=0∏LRqj)
输出
p
k
pk
pk:
p
k
←
(
p
k
(
j
)
=
(
b
(
j
)
,
a
(
j
)
)
∈
R
q
j
2
)
0
≤
j
≤
L
pk\leftarrow (pk^{(j)}=(b^{(j)},a^{(j)})\in R_{q_j}^2)_{0\leq j \leq L}
pk←(pk(j)=(b(j),a(j))∈Rqj2)0≤j≤L
其中
b
(
j
)
←
−
a
(
j
)
⋅
s
+
e
(
m
o
d
q
j
)
b^{(j)}\leftarrow -a^{(j)}·s+e\ \ (mod \ q_j)
b(j)←−a(j)⋅s+e (mod qj)
r
l
k
G
e
n
:
rlkGen:
rlkGen:
r
l
k
←
K
S
G
e
n
(
s
2
,
s
)
rlk \leftarrow KSGen(s^2,s)
rlk←KSGen(s2,s)
E n c p k ( m ) Enc_{pk}(m) Encpk(m):
给定消息
m
∈
R
m\in R
m∈R,采样
v
←
χ
e
n
c
v\leftarrow \chi_{enc}
v←χenc和
e
0
,
e
1
←
χ
e
r
r
e_0,e_1\leftarrow \chi_{err}
e0,e1←χerr。输出:
c
t
=
(
c
t
(
0
)
,
c
t
(
1
)
,
.
.
.
,
c
t
(
L
)
)
∈
∏
j
=
0
L
R
q
j
2
ct=(ct^{(0)},ct^{(1)},...,ct^{(L)})\in \prod_{j=0}^LR_{q_j}^2
ct=(ct(0),ct(1),...,ct(L))∈j=0∏LRqj2
其中
c
t
(
j
)
←
v
⋅
p
k
(
j
)
+
(
m
+
e
0
,
e
1
)
(
m
o
d
q
j
)
ct^{(j)}\leftarrow v·pk^{(j)}+(m+e_0,e_1) \ \ \ (mod \ q_j)
ct(j)←v⋅pk(j)+(m+e0,e1) (mod qj)
可以看到消息是没有被RNS分解的。也就是说单独一个RNS组件上就可以解密得到消息
m
m
m。
D
e
c
s
k
(
m
)
Dec_sk(m)
Decsk(m):
<
c
t
(
0
)
,
s
k
>
(
m
o
d
q
0
)
<ct^{(0)},sk> \ \ \ (mod \ q_0)
<ct(0),sk> (mod q0)
A d d ( c t , c t ′ ) Add(ct,ct') Add(ct,ct′)
M u l t e v k ( c t , c t ′ ) Mult_{evk}(ct,ct') Multevk(ct,ct′):乘法操作涉及到重线性化操作,即KS操作。
R S ( c t ) RS(ct) RS(ct):
R o t a t e e v k ( c t ) Rotate_{evk}(ct) Rotateevk(ct):旋转操作即KS操作。
3.KS算法分析
KS算法包括重线性化操作、旋转操作和共轭操作,下面来详细介绍RNS-CKKS中的KS算法。
由于后续的文章里有对KS算法的优化,而且需要考虑全局的情况,因此这里会对KS算法进行RNS组合,二者对比分析。
3.1 重线性化操作
R N S RNS RNS分解形式的重线性化操作分析:
给定两个 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
:
1.\ For\ \ 0\leq j \leq l \ \ do :
1. For 0≤j≤l do:
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. 2. 2.计算:
M o d U p C l → D l ( d 2 ( 0 ) , d 2 ( 1 ) , . . . , d 2 ( l ) ) = ( d ~ 2 ( 0 ) , . . . , d ~ 2 ( k − 1 ) , d 2 ( 0 ) , . . . , d 2 ( l ) ) ModUp_{C_l\rightarrow D_l}(d_2^{(0)},d_2^{(1)},...,d_2^{(l)})=(\tilde{d}_2^{(0)},...,\tilde{d}_2^{(k-1)},d_2^{(0)},...,d_2^{(l)}) ModUpCl→Dl(d2(0),d2(1),...,d2(l))=(d~2(0),...,d~2(k−1),d2(0),...,d2(l))
如同在CKKS中的重线性化一样,同计算密钥直接计算的是 d 2 d_2 d2,所以这里也需要将 C l C_l Cl基上的 d 2 d_2 d2放到重线性化公钥 r l k rlk rlk所在的 D l D_l Dl基上。然后二者执行RNS组件级的乘法。
为什么一定要放到 D l D_l Dl基上呢?
如果我们仔细分析 M o d D o w n ( ∗ ) ModDown(*) ModDown(∗)算法,可以发现该算法执行完毕后,舍弃的一些基的乘积,正好是算法结束后需要除以掉的部分。在KS操作中,发现舍弃掉的基为 { p 0 , p 1 , . . . , p k − 1 } \{p_0,p_1,...,p_{k-1}\} {p0,p1,...,pk−1},故这个值是 P = ∏ i = 0 k − 1 P=\prod_{i=0}^{k-1} P=∏i=0k−1,而在RS操作中这个值就是 q l q_l ql。
3.
3.
3.计算:
c
t
~
=
(
c
t
~
(
0
)
=
(
c
~
0
(
0
)
,
c
~
1
(
0
)
)
,
.
.
.
,
c
t
~
(
k
+
l
)
=
(
c
~
0
(
k
+
l
)
,
c
~
1
(
k
+
l
)
)
)
∈
∏
i
=
0
k
−
1
R
p
i
2
×
∏
j
=
0
l
R
q
j
2
\tilde{ct}=(\tilde{ct}^{(0)}=(\tilde{c}_0^{(0)},\tilde{c}_1^{(0)}),...,\tilde{ct}^{(k+l)}=(\tilde{c}_0^{(k+l)},\tilde{c}_1^{(k+l)}))\in \prod_{i=0}^{k-1}R_{p_i}^2\times \prod_{j=0}^l R_{q_j}^2
ct~=(ct~(0)=(c~0(0),c~1(0)),...,ct~(k+l)=(c~0(k+l),c~1(k+l)))∈i=0∏k−1Rpi2×j=0∏lRqj2
其中
c
t
~
(
i
)
=
d
~
2
(
i
)
⋅
r
l
k
(
i
)
(
m
o
d
p
i
)
\tilde{ct}^{(i)}=\tilde{d}_2^{(i)}·rlk^{(i)} \ \ \ (mod \ p_i)
ct~(i)=d~2(i)⋅rlk(i) (mod pi)
c t ~ ( k + j ) = d 2 ( j ) ⋅ r l k ( k + j ) ( m o d q j ) \tilde{ct}^{(k+j)}=d_2^{(j)}·rlk^{(k+j)} \ \ \ (mod \ q_j) ct~(k+j)=d2(j)⋅rlk(k+j) (mod qj)
4.
4.
4.计算:
(
c
^
0
0
,
.
.
.
,
c
^
0
l
)
←
M
o
d
D
o
w
n
D
l
→
C
l
(
c
~
0
0
,
.
.
.
,
c
~
0
k
+
l
)
(
c
^
1
0
,
.
.
.
,
c
^
1
l
)
←
M
o
d
D
o
w
n
D
l
→
C
l
(
c
~
1
0
,
.
.
.
,
c
~
1
k
+
l
)
(\hat{c}_0^{0},...,\hat{c}_0^{l})\leftarrow ModDown_{D_l\rightarrow C_l}(\tilde{c}_0^{0},...,\tilde{c}_0^{k+l}) \\ (\hat{c}_1^{0},...,\hat{c}_1^{l})\leftarrow ModDown_{D_l\rightarrow C_l}(\tilde{c}_1^{0},...,\tilde{c}_1^{k+l})
(c^00,...,c^0l)←ModDownDl→Cl(c~00,...,c~0k+l)(c^10,...,c^1l)←ModDownDl→Cl(c~10,...,c~1k+l)
5.
5.
5.输出:
c
t
m
u
l
t
=
(
c
t
m
u
l
t
(
0
)
,
c
t
m
u
l
t
(
1
)
,
.
.
.
,
c
t
m
u
l
t
(
l
)
)
ct_{mult}=(ct_{mult}^{(0)},ct_{mult}^{(1)},...,ct_{mult}^{(l)})
ctmult=(ctmult(0),ctmult(1),...,ctmult(l))
其中
c
t
m
u
l
t
(
j
)
←
(
d
0
(
j
)
,
d
1
(
j
)
)
+
(
c
^
0
j
,
c
^
1
j
)
(
m
o
d
q
j
)
ct_{mult}^{(j)}\leftarrow (d_0^{(j)},d_1^{(j)})+(\hat{c}_0^{j},\hat{c}_1^{j}) \ \ \ (mod \ q_j)
ctmult(j)←(d0(j),d1(j))+(c^0j,c^1j) (mod qj)
3.2 旋转操作
待更新。。。。。。
3.3 共轭操作
待更新。。。。。。
3.4 KS算法全局分析
回想前边的 K S G e n KSGen KSGen步骤
K S G e n ( s 1 , s 2 ) KSGen(s_1,s_2) KSGen(s1,s2):
给定两个秘密多项式 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)
输出swk:
(
s
w
k
(
0
)
=
(
b
′
(
0
)
,
a
′
(
0
)
)
,
.
.
.
,
s
w
k
(
k
+
L
)
=
(
b
′
(
k
+
L
)
,
a
′
(
k
+
L
)
)
)
←
(
∏
i
=
0
k
−
1
R
p
i
×
∏
j
=
0
L
R
q
j
)
(swk^{(0)}=(b'^{(0)},a'^{(0)}),...,swk^{(k+L)}=(b'^{(k+L)},a'^{(k+L)}))\leftarrow (\prod_{i=0}^{k-1}R_{p_i} \times \prod_{j=0}^{L}R_{q_j})
(swk(0)=(b′(0),a′(0)),...,swk(k+L)=(b′(k+L),a′(k+L)))←(i=0∏k−1Rpi×j=0∏LRqj)
其中每一项满足下述关系:
{
b
′
(
i
)
←
−
a
′
(
i
)
⋅
s
2
+
e
′
(
m
o
d
p
i
)
,
f
o
r
0
≤
i
<
k
b
′
(
k
+
j
)
←
−
a
′
(
k
+
j
)
⋅
s
2
+
[
P
]
q
i
⋅
s
1
+
e
′
(
m
o
d
q
i
)
,
f
o
r
0
≤
j
<
L
\begin{cases} b'^{(i)} \leftarrow -a'^{(i)}·s_2+e' \ \ \ (mod \ \ p_i) , \ for \ 0\leq i < k \\ b'^{(k+j)} \leftarrow -a'^{(k+j)}·s_2+[P]_{q_i}·s_1+e' \ \ \ (mod \ \ q_i) , \ for \ 0\leq j < L \\ \end{cases}
{b′(i)←−a′(i)⋅s2+e′ (mod pi), for 0≤i<kb′(k+j)←−a′(k+j)⋅s2+[P]qi⋅s1+e′ (mod qi), for 0≤j<L
实际上相当于采样
a
′
∈
R
P
Q
a'\in R_{PQ}
a′∈RPQ,取
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)
我们从这个角度重新将
s
w
k
swk
swk转化到
R
N
S
RNS
RNS域上,可得
[ s w k ] D = ( s w k ( 0 ) = ( b ′ ( 0 ) , a ′ ( 0 ) ) , . . . , s w k ( k L ) = ( b ′ ( k + L ) , a ′ ( k + L ) ) ) [swk]_D=(swk^{(0)}=(b'^{(0)},a'^{(0)}),...,swk^{(k_L)}=(b'^{(k+L)},a'^{(k+L)})) [swk]D=(swk(0)=(b′(0),a′(0)),...,swk(kL)=(b′(k+L),a′(k+L)))
从这里可以看到可以先生成一个在模 P Q PQ PQ上的swk,然后再将其分解到 D L D_L DL基上进行RNS表示。
也可以直接从RNS域上生成 s w k swk swk的RNS表示。
为了后续的优化算法,这里我们需要记住一个事情,那就是RNS-CKKS中生成的 s w k swk swk是一个。
4.RS算法分析
RNS-CKKS中的 R S RS RS操作与CKKS中的 R S RS RS操作有些许不同,这里进行分析。
待更新。。。。。。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)