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} Zqi=1kZqi
根据该环同构,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),其中aia (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=1kQi[Qi1]qiai   (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} [Qi1]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=1kQi[Qi1]qiai  mod mj)1jl
不妨假设 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=1kQi[Qi1]qiai=a+eq
故实际上经过 F a s t B C o n v ( ∗ ) FastBConv(*) FastBConv()算法后我们得到的是 a + e ⋅ q a+e·q a+eq在基链 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+eq   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+eq  (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,其中0lL
给定明文多项式 m m m l l l 级密文 c t ∈ R Q l 2 ct \in R_{Q_l}^2 ctRQl2

则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=q1ctRQl12
R S RS RS 操作会得到 q − 1 ⋅ m q^{-1}·m q1m的近似加密 c t r s ct_{rs} ctrs,且这是 l − 1 l-1 l1级的密文。

可以看到 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(12η,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=0lqi
如此一来每次 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,...,pk1}C={q0,q1,...,ql1}D={p0,p1,...,pk1,q0,q1,...,ql1}
其中, P = ∏ i = 0 k − 1 p i P=\prod_{i=0}^{k-1}p_i P=i=0k1pi, Q = ∏ j = 0 l − 1 q j Q=\prod_{j=0}^{l-1}q_j Q=j=0l1qj

(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(l1)),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:ModUpCD([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~(k1))ConCD([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~(k1),a(0),a(1),...,a(l1))


算法分析:

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

算法功能描述:

  1. 该算法输入 a ∈ Z Q a\in \mathbb{Z}_Q aZQ C C C上的RNS表示,近似返回 a ∈ Z P Q a \in \mathbb{Z}_{PQ} aZPQ 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+l1))=([b~]B,[b~]C),其中 b~ZPQ
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:ModDownDC([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~(k1))
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~(l1))ConBC([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)=P1(b~k+ja~(j))  mod qj,for   all   0jl1
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(l1))


算法分析:

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

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

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

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

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

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

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

算法功能描述:

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


(4) 算法扩展

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

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

​ 一个 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} Cl1基上并乘以 q l − 1 q_l^{-1} ql1


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


E n c p k ( m ) Enc_{pk}(m) Encpk(m):

​ 给定消息 m ∈ R m\in R mR,采样 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=0LRqj2
​ 其中
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)vpk(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)))0jl 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)))0jl​。

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


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

待更新。。。。。。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐