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} Zqi=1kZqi
根据该环同构,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),其中aia (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=1kQi[Qi1]qiai   (mod q)
其中Qi=q/qiQ_i=q/q_iQi=q/qi[Qi−1]qi[Q_i^{-1}]_{q_i}[Qi1]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,...,qkB=m1,m2,...,mlB={m_1,m_2,...,m_l}B=m1,m2,...,ml,且满足q=∏i=1kq=\prod_{i=1}^kq=i=1km=∏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=1kQi[Qi1]qiai  mod mj)1jl
不妨假设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=1kQi[Qi1]qiai=a+eq
故实际上经过FastBConv(∗)FastBConv(*)FastBConv()算法后我们得到的是a+e⋅qa+e·qa+eq在基链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+eq   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+eq  (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,其中0lL
给定明文多项式mmmlll 级密文ct∈RQl2ct \in R_{Q_l}^2ctRQl2

则CKKS17中RSRSRS 操作为计算:
ctrs=⌊q−1⋅ct⌉∈RQl−12 ct_{rs}=\lfloor q^{-1}·ct\rceil \in R_{Q_{l-1}}^2 ctrs=q1ctRQl12
RSRSRS 操作会得到q−1⋅mq^{-1}·mq1m的近似加密ctrsct_{rs}ctrs,且这是l−1l-1l1级的密文。

可以看到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(12η,1+2η),其中qi遍历C
发现CCC中的每个元素都是缩放因子Δ\DeltaΔ的近似,这就是近似基的由来。

重新设置密文模结构如下:
Ql=∏i=0lqi Q_l=\prod_{i=0}^l q_i Ql=i=0lqi
如此一来每次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,...,pk1}C={q0,q1,...,ql1}D={p0,p1,...,pk1,q0,q1,...,ql1}
其中,P=∏i=0k−1piP=\prod_{i=0}^{k-1}p_iP=i=0k1pi, Q=∏j=0l−1qjQ=\prod_{j=0}^{l-1}q_jQ=j=0l1qj

(3) 近似模交换(Approximate  Modulus  SwitchingApproximate \ \ Modulus \ \ SwitchingApproximate  Modulus  Switching

RNS-CKKS中的模交换分为两个步骤,分别为Approximate  Modulus  RaisingApproximate \ \ Modulus \ \ RaisingApproximate  Modulus  RaisingApproximate  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(l1)),where a ZQ
2.procedure:ModUpC→D([a]C)2. procedure:ModUp_{C\rightarrow D}([a]_C)2.procedure:ModUpCD([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~(k1))ConCD([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~(k1),a(0),a(1),...,a(l1))


算法分析:

  1. 最后得到的RNS表示实际上是a~=a+e⋅Q\tilde a=a+e·Qa~=a+eQDDD上的RNS表示。
  2. 当误差足够小,我们可以近似的认为得到的是aaaDDD上的RNS表示。

算法功能描述:

  1. 该算法输入a∈ZQa\in \mathbb{Z}_QaZQCCC上的RNS表示,近似返回a∈ZPQa \in \mathbb{Z}_{PQ}aZPQDDD上的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+l1))=([b~]B,[b~]C),其中 b~ZPQ
2.procedure:ModDownD→C([b~]D)2. procedure:ModDown_{D \rightarrow C}([\tilde b]_D)2.procedure:ModDownDC([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~(k1))
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~(l1))ConBC([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)=P1(b~k+ja~(j))  mod qj,for   all   0jl1
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(l1))


算法分析:

  1. [b~]D[\tilde{b}]_D[b~]D可以计算得到b~∈ZP⋅Q\tilde{b} \in \mathbb{Z}_{P·Q}b~ZPQ,而由[b~]B[\tilde{b}]_B[b~]B只能得到b~  mod P∈ZP\tilde{b} \ \ mod \ P \in \mathbb{Z}_Pb~  mod PZP,由[b~]C[\tilde{b}]_C[b~]C只能得到b~  mod Q∈ZQ\tilde{b} \ \ mod \ Q \in \mathbb{Z}_Qb~  mod QZQ

  2. 在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)=P1(b~(b~  mod P)eP  (mod qj)

  1. 也就是说最后输出的结果为:

[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=[P1(b~(b~  mod P)eP)]C

  1. 即此时我们可以根据[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=P1(b~(b~  mod P)eP)ZQ

  1. 实际上这是一个近似值:

b≈P−1⋅b~ b\approx P^{-1}·\tilde{b} bP1b~

算法功能描述:

  1. 该算法输入b~\tilde{b}b~DDD上的RNS表示,近似返回b≈P−1⋅b~b\approx P^{-1}·\tilde{b}bP1b~CCC上的RNS表示。


(4) 算法扩展

ModUpC→D(⋅)ModUp_{C\rightarrow D}(·)ModUpCD()ModDownD→C(⋅)ModDown_{D\rightarrow C}(·)ModDownDC()可以直接扩展到多形式环中,如下所示:
{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} {ModUpCD()ModDownDC():j=0l1Rqji=0k1Rpi×j=0l1Rqj:i=0k1Rpi×j=0l1Rqjj=0l1Rqj
该算法可以实现近似模交换的功能:
b=ModDownD→C(ModUpC→D(a))≈P−1⋅a b=ModDown_{D \rightarrow C}(ModUp_{C\rightarrow D}(a))\approx P^{-1}·a b=ModDownDC(ModUpCD(a))P1a

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}P1

​ 一个ModDown(∗)ModDown(*)ModDown()算法被用在RS(ct)RS(ct)RS(ct)算法中,可以将一个ClC_lCl基上的密文放到Cl−1C_{l-1}Cl1基上并乘以ql−1q_l^{-1}ql1


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,s2R,均匀采样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=0k1Rpi×j=0LRqj)
输出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=0k1Rpi×j=0LRqj)
其中每一项满足下述关系:
{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 0i<kb(k+j)a(k+j)s2+[P]qis1+e   (mod  qi), for 0j<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=0LRqj)
输出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)0jL
其中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) rlkKSGen(s2,s)


Encpk(m)Enc_{pk}(m)Encpk(m):

​ 给定消息m∈Rm\in RmR,采样v←χencv\leftarrow \chi_{enc}vχence0,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=0LRqj2
​ 其中
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)vpk(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)))0jlct′=(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)))0jl​。

1. For  0≤j≤l  do:1.\ For\ \ 0\leq j \leq l \ \ do :1. For  0jl  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)}) ModUpClDl(d2(0),d2(1),...,d2(l))=(d~2(0),...,d~2(k1),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,...,pk1},故这个值是P=∏i=0k−1P=\prod_{i=0}^{k-1}P=i=0k1,而在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=0k1Rpi2×j=0lRqj2
其中
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)ModDownDlCl(c~00,...,c~0k+l)(c^10,...,c^1l)ModDownDlCl(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,s2R,均匀采样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=0k1Rpi×j=0LRqj)
输出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=0k1Rpi×j=0LRqj)
其中每一项满足下述关系:
{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 0i<kb(k+j)a(k+j)s2+[P]qis1+e   (mod  qi), for 0j<L


实际上相当于采样a′∈RPQa'\in R_{PQ}aRPQ,取
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) bas2+Ps1+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操作有些许不同,这里进行分析。

待更新。。。。。。

Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐