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=1kqiq=\prod_{i=1}^kq_iq=∏i=1kqi,其中qiq_iqi之间两两互素。CRT阐述了一个环同构的存在,即:
Zq≃∏i=1kZqi \mathbb{Z}_q \simeq \prod_{i=1}^k \mathbb{Z}_{q_i} Zq≃i=1∏kZqi
根据该环同构,CRT蕴含了一个余数系统(RNS),即可以将模qqq上的大整数运算同构到模q1,q2,...,qk{q_1,q_2,...,q_k}q1,q2,...,qk上的平行小整数运算,即:
a (mod q)≃(a1,a2,...,ak),其中ai≡a (mod qi) 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)
根据CRTCRTCRT,由RNSRNSRNS表示的数字a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak可以在模qqq的意义下,唯一恢复得到aaa,计算过程如下:
a=∑i=1kQi⋅[Qi−1]qi⋅ai (mod 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)
其中Qi=q/qiQ_i=q/q_iQi=q/qi,[Qi−1]qi[Q_i^{-1}]_{q_i}[Qi−1]qi表示QiQ_iQi在模qiq_iqi下的逆。
1.3 Fast RNS Base Conversion(该算法首先被提出在RNS-FV中)
给定两组基链,分别为C=q1,q2,...,qkC={q_1,q_2,...,q_k}C=q1,q2,...,qk和B=m1,m2,...,mlB={m_1,m_2,...,m_l}B=m1,m2,...,ml,且满足q=∏i=1kq=\prod_{i=1}^kq=∏i=1k和m=∏j=1lmjm=\prod_{j=1}^lm_jm=∏j=1lmj。给定a (mod q)a \ (mod \ q)a (mod q)对基链C的RNS表示(a1,a2,...,ak)(a_1,a_2,...,a_k)(a1,a2,...,ak)。则Fast RNS Base Conversion的目的为将(a1,a2,...,ak)(a_1,a_2,...,a_k)(a1,a2,...,ak)直接转换为在基链BBB下的RNS表示,而不需要进行RNS组合操作,该算法定义如下:
FastBConv(a,C,B)=(∑i=1kQi⋅[Qi−1]qi⋅ai mod mj)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 mod qa \ mod \ qa mod q在基链BBB下的RNS表示为(b1,b2,...,bl)(b_1,b_2,...,b_l)(b1,b2,...,bl)。则我们本意希望的是这个RNS表示满足如下计算:
bi=a mod mj b_i = a \ \ \ mod \ m_j bi=a mod mj
但实际上我们知道
∑i=1kQi⋅[Qi−1]qi⋅ai=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
故实际上经过FastBConv(∗)FastBConv(*)FastBConv(∗)算法后我们得到的是a+e⋅qa+e·qa+e⋅q在基链BBB下的RNS表示(b1,b2,...,bl)(b_1,b_2,...,b_l)(b1,b2,...,bl),实际上满足如下计算:
bi=a+e⋅q mod mj b_i = a+e·q \ \ \ mod \ m_j bi=a+e⋅q mod mj
若此时将(b1,b2,...,bl)(b_1,b_2,...,b_l)(b1,b2,...,bl)恢复成模mmm的大整数,则得到的大整数是a+e⋅q (mod 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,设置密文模结构为:
Ql=ql,其中0≤l≤L Q_l=q^l, 其中0\leq l\leq L Ql=ql,其中0≤l≤L
给定明文多项式mmm的lll 级密文ct∈RQl2ct \in R_{Q_l}^2ct∈RQl2。
则CKKS17中RSRSRS 操作为计算:
ctrs=⌊q−1⋅ct⌉∈RQl−12 ct_{rs}=\lfloor q^{-1}·ct\rceil \in R_{Q_{l-1}}^2 ctrs=⌊q−1⋅ct⌉∈RQl−12
即RSRSRS 操作会得到q−1⋅mq^{-1}·mq−1⋅m的近似加密ctrsct_{rs}ctrs,且这是l−1l-1l−1级的密文。
可以看到RSRSRS 每次操作后,密文内部的缩放因子Δ\DeltaΔ是不变的。
(2) 现在定义RNS-CKKS中的近似基概念
RNS表示的先决条件就是基链中的元素是互素的。
首先我们仍然选择缩放因子为Δ=q>0\Delta=q>0Δ=q>0,同时我们设置一个预定义的精度η\etaη,然后我们选择一组基如下:
C={q0,q1,...,qL} C=\{q_0,q_1,...,q_L\} C={q0,q1,...,qL}
CCC中的每个元素都需要满足以下条件:
qi/q∈(1−2−η,1+2−η),其中qi遍历C q_i/q \in (1-2^{-\eta},1+2^{-\eta}),其中q_i遍历C qi/q∈(1−2−η,1+2−η),其中qi遍历C
发现CCC中的每个元素都是缩放因子Δ\DeltaΔ的近似,这就是近似基的由来。
重新设置密文模结构如下:
Ql=∏i=0lqi Q_l=\prod_{i=0}^l q_i Ql=i=0∏lqi
如此一来每次RSRSRS 操作的元素就变成了CCC中的元素。
很明显可以观察到,现在每次RSRSRS 操作后,密文内部的缩放因子会发生改变,换句话说,这就是RS操作引入的误差,还是利用CKKS的核心思想,只要这个误差足够小,那我们就可以接受。
1.5 近似模交换
(1) 模交换(Modulus—Switching)
MS操作被介绍在BGV12中,
简单来说就是将模Q1Q_1Q1下的密文转换为模Q2Q_2Q2下的密文。
(2) 基的选择
给出RNS-CKKS中基的选择如下:
{B={p0,p1,...,pk−1}C={q0,q1,...,ql−1}D={p0,p1,...,pk−1,q0,q1,...,ql−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=0k−1piP=\prod_{i=0}^{k-1}p_iP=∏i=0k−1pi, Q=∏j=0l−1qjQ=\prod_{j=0}^{l-1}q_jQ=∏j=0l−1qj。
(3) 近似模交换(Approximate Modulus SwitchingApproximate \ \ Modulus \ \ SwitchingApproximate Modulus Switching)
RNS-CKKS中的模交换分为两个步骤,分别为Approximate Modulus RaisingApproximate \ \ Modulus \ \ RaisingApproximate Modulus Raising和Approximate Modulus ReductionApproximate \ \ Modulus \ \ ReductionApproximate Modulus Reduction
首先介绍Approximate Modulus RaisingApproximate \ \ Modulus \ \ RaisingApproximate Modulus Raising算法:
Algorithm1:Approximate Modulus RaisingAlgorithm 1: Approximate \ Modulus \ RaisingAlgorithm1:Approximate Modulus Raising
1.input1. input1.input:
[a]C=(a(0),a(1),...,a(l−1)),where a∈ ZQ [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.procedure:ModUpC→D([a]C)2. procedure:ModUp_{C\rightarrow D}([a]_C)2.procedure:ModUpC→D([a]C):
(a~(0),a~(1),...,a~(k−1))←ConC→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.retrun3. retrun3.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·Qa~=a+e⋅Q在DDD上的RNS表示。
- 当误差足够小,我们可以近似的认为得到的是aaa在DDD上的RNS表示。
算法功能描述:
- 该算法输入a∈ZQa\in \mathbb{Z}_Qa∈ZQ在CCC上的RNS表示,近似返回a∈ZPQa \in \mathbb{Z}_{PQ}a∈ZPQ在DDD上的RNS表示。
然后介绍Approximate Modulus ReductionApproximate \ \ Modulus \ \ ReductionApproximate Modulus Reduction算法:
Algorithm2:Approximate Modulus ReductionAlgorithm 2:Approximate \ Modulus \ ReductionAlgorithm2:Approximate Modulus Reduction
1.input1. input1.input:
[b~]D=(b~(0),b~(1),...,b~(k+l−1))=([b~]B,[b~]C),其中 b~∈ZP⋅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.procedure:ModDownD→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~ mod 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))←ConB→C([b~ mod 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)) mod qj,for all 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.retrun3. retrun3.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~∈ZP⋅Q\tilde{b} \in \mathbb{Z}_{P·Q}b~∈ZP⋅Q,而由[b~]B[\tilde{b}]_B[b~]B只能得到b~ mod P∈ZP\tilde{b} \ \ mod \ P \in \mathbb{Z}_Pb~ mod P∈ZP,由[b~]C[\tilde{b}]_C[b~]C只能得到b~ mod Q∈ZQ\tilde{b} \ \ mod \ Q \in \mathbb{Z}_Qb~ mod Q∈ZQ。
-
在2.3步骤的计算中,每一次计算的值为:
b(j)=P−1⋅(b~−(b~ mod P)−e⋅P (mod qj) 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~ mod 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~ mod P)−e⋅P)∈ZQ 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~在DDD上的RNS表示,近似返回b≈P−1⋅b~b\approx P^{-1}·\tilde{b}b≈P−1⋅b~在CCC上的RNS表示。
(4) 算法扩展
ModUpC→D(⋅)ModUp_{C\rightarrow D}(·)ModUpC→D(⋅)和ModDownD→C(⋅)ModDown_{D\rightarrow C}(·)ModDownD→C(⋅)可以直接扩展到多形式环中,如下所示:
{ModUpC→D(⋅):∏j=0l−1Rqj→∏i=0k−1Rpi×∏j=0l−1RqjModDownD→C(⋅):∏i=0k−1Rpi×∏j=0l−1Rqj→∏j=0l−1Rqj \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=ModDownD→C(ModUpC→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的公钥pkpkpk,计算密钥evkevkevk,密文ctctct,放到RNS域上,即普通的RNS分解即可。
$(2) $近似模交换算法:
该算法主要用在KS操作中,KS操作的对象是一个密文和一个计算密钥。
首先通过ModUp(∗)ModUp(*)ModUp(∗)算法将ClC_lCl基上需要进行密钥交换的密文放到DlD_lDl基上。然后同DlD_lDl基上的计算密钥进行RNS组件级的乘法。然后通过ModDown(∗)ModDown(*)ModDown(∗)算法将DlD_lDl基上的密文重新放到ClC_lCl基上并乘以P−1P^{-1}P−1。
一个ModDown(∗)ModDown(*)ModDown(∗)算法被用在RS(ct)RS(ct)RS(ct)算法中,可以将一个ClC_lCl基上的密文放到Cl−1C_{l-1}Cl−1基上并乘以ql−1q_l^{-1}ql−1。
Setup(q,L,η,1λ)Setup(q,L,\eta,1^{\lambda})Setup(q,L,η,1λ):
初始化操作
KSGen(s1,s2)KSGen(s_1,s_2)KSGen(s1,s2):
给定两个秘密多项式s1,s2∈Rs_1,s_2 \in Rs1,s2∈R,均匀采样e′←χerre'\leftarrow \chi _{err}e′←χerr。
以RNS的形式均匀采样元素:
(a′(0),a′(1),...,a′(k+L))←(∏i=0k−1Rpi×∏j=0LRqj) (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:
(swk(0)=(b′(0),a′(0)),...,swk(k+L)=(b′(k+L),a′(k+L)))←(∏i=0k−1Rpi×∏j=0LRqj) (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)⋅s2+e′ (mod pi), for 0≤i<kb′(k+j)←−a′(k+j)⋅s2+[P]qi⋅s1+e′ (mod qi), for 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
KeyGenKeyGenKeyGen:
skGenskGenskGen: 采样s←χkeys\leftarrow \chi_{key}s←χkey,设置密钥为sk←(1,s)sk\leftarrow (1,s)sk←(1,s)。
pkGenpkGenpkGen: 采样e←χerre\leftarrow \chi _{err}e←χerr。
以RNS的形式均匀采样元素:
(a(0),a(1),...,a(L))←(∏j=0LRqj) (a^{(0)},a^{(1)},...,a^{(L)})\leftarrow (\prod_{j=0}^{L}R_{q_j}) (a(0),a(1),...,a(L))←(j=0∏LRqj)
输出pkpkpk:
pk←(pk(j)=(b(j),a(j))∈Rqj2)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 (mod qj)b^{(j)}\leftarrow -a^{(j)}·s+e\ \ (mod \ q_j)b(j)←−a(j)⋅s+e (mod qj)
rlkGen:rlkGen:rlkGen:
rlk←KSGen(s2,s) rlk \leftarrow KSGen(s^2,s) rlk←KSGen(s2,s)
Encpk(m)Enc_{pk}(m)Encpk(m):
给定消息m∈Rm\in Rm∈R,采样v←χencv\leftarrow \chi_{enc}v←χenc和e0,e1←χerre_0,e_1\leftarrow \chi_{err}e0,e1←χerr。输出:
ct=(ct(0),ct(1),...,ct(L))∈∏j=0LRqj2 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
其中
ct(j)←v⋅pk(j)+(m+e0,e1) (mod qj) 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组件上就可以解密得到消息mmm。
Decsk(m)Dec_sk(m)Decsk(m):
<ct(0),sk> (mod q0) <ct^{(0)},sk> \ \ \ (mod \ q_0) <ct(0),sk> (mod q0)
Add(ct,ct′)Add(ct,ct')Add(ct,ct′)
Multevk(ct,ct′)Mult_{evk}(ct,ct')Multevk(ct,ct′):乘法操作涉及到重线性化操作,即KS操作。
RS(ct)RS(ct)RS(ct):
Rotateevk(ct)Rotate_{evk}(ct)Rotateevk(ct):旋转操作即KS操作。
3.KS算法分析
KS算法包括重线性化操作、旋转操作和共轭操作,下面来详细介绍RNS-CKKS中的KS算法。
由于后续的文章里有对KS算法的优化,而且需要考虑全局的情况,因此这里会对KS算法进行RNS组合,二者对比分析。
3.1 重线性化操作
RNSRNSRNS分解形式的重线性化操作分析:
给定两个lll 级别的密文ct=(ct(j)=(c0(j),c1(j)))0≤j≤lct=(ct^{(j)}=(c_0^{(j)},c_1^{(j)}))_{0\leq j \leq l}ct=(ct(j)=(c0(j),c1(j)))0≤j≤l和ct′=(ct′(j)=(c0′(j),c1′(j)))0≤j≤lct'=(ct'^{(j)}=(c_0'^{(j)},c_1'^{(j)}))_{0\leq j \leq l}ct′=(ct′(j)=(c0′(j),c1′(j)))0≤j≤l。
1. For 0≤j≤l do:1.\ For\ \ 0\leq j \leq l \ \ do :1. For 0≤j≤l do:
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) 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.计算:
ModUpCl→Dl(d2(0),d2(1),...,d2(l))=(d~2(0),...,d~2(k−1),d2(0),...,d2(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中的重线性化一样,同计算密钥直接计算的是d2d_2d2,所以这里也需要将ClC_lCl基上的d2d_2d2放到重线性化公钥rlkrlkrlk所在的DlD_lDl基上。然后二者执行RNS组件级的乘法。
为什么一定要放到DlD_lDl基上呢?
如果我们仔细分析ModDown(∗)ModDown(*)ModDown(∗)算法,可以发现该算法执行完毕后,舍弃的一些基的乘积,正好是算法结束后需要除以掉的部分。在KS操作中,发现舍弃掉的基为{p0,p1,...,pk−1}\{p_0,p_1,...,p_{k-1}\}{p0,p1,...,pk−1},故这个值是P=∏i=0k−1P=\prod_{i=0}^{k-1}P=∏i=0k−1,而在RS操作中这个值就是qlq_lql。
3.3.3.计算:
ct~=(ct~(0)=(c~0(0),c~1(0)),...,ct~(k+l)=(c~0(k+l),c~1(k+l)))∈∏i=0k−1Rpi2×∏j=0lRqj2 \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
其中
ct~(i)=d~2(i)⋅rlk(i) (mod pi) \tilde{ct}^{(i)}=\tilde{d}_2^{(i)}·rlk^{(i)} \ \ \ (mod \ p_i) ct~(i)=d~2(i)⋅rlk(i) (mod pi)
ct~(k+j)=d2(j)⋅rlk(k+j) (mod qj) \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^00,...,c^0l)←ModDownDl→Cl(c~00,...,c~0k+l)(c^10,...,c^1l)←ModDownDl→Cl(c~10,...,c~1k+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.输出:
ctmult=(ctmult(0),ctmult(1),...,ctmult(l)) ct_{mult}=(ct_{mult}^{(0)},ct_{mult}^{(1)},...,ct_{mult}^{(l)}) ctmult=(ctmult(0),ctmult(1),...,ctmult(l))
其中
ctmult(j)←(d0(j),d1(j))+(c^0j,c^1j) (mod qj) 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算法全局分析
回想前边的KSGenKSGenKSGen步骤
KSGen(s1,s2)KSGen(s_1,s_2)KSGen(s1,s2):
给定两个秘密多项式s1,s2∈Rs_1,s_2 \in Rs1,s2∈R,均匀采样e′←χerre'\leftarrow \chi _{err}e′←χerr。
以RNS的形式均匀采样元素:
(a′(0),a′(1),...,a′(k+L))←(∏i=0k−1Rpi×∏j=0LRqj) (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:
(swk(0)=(b′(0),a′(0)),...,swk(k+L)=(b′(k+L),a′(k+L)))←(∏i=0k−1Rpi×∏j=0LRqj) (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)⋅s2+e′ (mod pi), for 0≤i<kb′(k+j)←−a′(k+j)⋅s2+[P]qi⋅s1+e′ (mod qi), for 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′∈RPQa'\in R_{PQ}a′∈RPQ,取
swk=(b′,a′)∈RPQ2 swk=(b',a')\in R_{PQ}^2 swk=(b′,a′)∈RPQ2
其中
b′←−a′⋅s2+P⋅s1+e′ (mod PQ) b'\leftarrow -a'·s_2+P·s_1+e' \ \ \ (mod \ PQ) b′←−a′⋅s2+P⋅s1+e′ (mod PQ)
我们从这个角度重新将swkswkswk转化到RNSRNSRNS域上,可得
[swk]D=(swk(0)=(b′(0),a′(0)),...,swk(kL)=(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)))
从这里可以看到可以先生成一个在模PQPQPQ上的swk,然后再将其分解到DLD_LDL基上进行RNS表示。
也可以直接从RNS域上生成swkswkswk的RNS表示。
为了后续的优化算法,这里我们需要记住一个事情,那就是RNS-CKKS中生成的swkswkswk是一个。
4.RS算法分析
RNS-CKKS中的RSRSRS操作与CKKS中的RSRSRS操作有些许不同,这里进行分析。
待更新。。。。。。
更多推荐
所有评论(0)