参考文献:
- [BV11] Brakerski Z, Vaikuntanathan V. Fully homomorphic encryption from ring-LWE and security for key dependent messages[C]//Annual cryptology conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2011: 505-524.
- [GHS12] Gentry C, Halevi S, Smart N P. Homomorphic evaluation of the AES circuit[C]//Annual Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 850-867.
- [CP16] Crockett E, Peikert C. Λολ: Functional Lattice Cryptography[C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016: 993-1005.
- [BEHZ16] Bajard J C, Eynard J, Hasan M A, et al. A full RNS variant of FV like somewhat homomorphic encryption schemes[C]//International Conference on Selected Areas in Cryptography. Cham: Springer International Publishing, 2016: 423-442.
- [HPS19] Halevi S, Polyakov Y, Shoup V. An improved RNS variant of the BFV homomorphic encryption scheme[C]//Topics in Cryptology–CT-RSA 2019: The Cryptographers’ Track at the RSA Conference 2019, San Francisco, CA, USA, March 4–8, 2019, Proceedings. Springer International Publishing, 2019: 83-105.
- [KPZ21] Kim A, Polyakov Y, Zucca V. Revisiting homomorphic encryption schemes for finite fields[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the Theory and Application of Cryptology and Information Security, Singapore, December 6–10, 2021, Proceedings, Part III 27. Springer International Publishing, 2021: 608-639.
文章目录
- RNS Basis Extension
- γ \gamma γ-correction technique
- Retrieve the Overflow
- Modulus-Switching and Scaling in RNS
- Simple Reduction
- Modulus-Switching for BGV
- Scaling for BFV
- Simple scaling
- Complex scaling
- Scaling between Arbitrary RNS Bases
- Key-Switch in RNS
- Brakerski-Vaikuntanathan
- Gentry-Halevi-Smart
- Hybrid
- Complexities and Size
RNS Basis Extension
一般地,FHE 需要很大的模数 Q Q Q,将它写作 Q = ∏ i = 1 L q i Q=\prod_{i=1}^L q_i Q=∏i=1Lqi,满足 q i = 1 ( m o d 2 N ) q_i=1\pmod{2N} qi=1(mod2N),我们简记 Q i = q 1 ⋯ q i Q_i=q_1\cdots q_i Qi=q1⋯qi,集合 { q i } \{q_i\} {qi} 称为 RNS basis,它们的大小至多为 64 64 64 比特。我们希望 FHE 的全部运算都是单精度的(现代计算机的机器字),也就是全部运算都在 RNS 下完成,而不需要多精度算术。
不同的 RNS 之间的转换,将环元素
a
∈
R
Q
a \in \mathcal R_Q
a∈RQ 从模数
Q
=
q
1
⋯
q
k
Q=q_1\cdots q_k
Q=q1⋯qk 下的
[
a
]
Q
[a]_Q
[a]Q 转换到模数
P
=
p
1
⋯
p
l
P=p_1\cdots p_l
P=p1⋯pl 下的
[
[
a
]
Q
]
P
[[a]_Q]_P
[[a]Q]P,可以直接在 RNS 下计算:
FastBaseExt
(
a
,
Q
,
P
)
=
{
∑
i
=
1
k
[
a
⋅
(
Q
q
i
)
−
1
]
q
i
⋅
Q
q
i
(
m
o
d
p
j
)
}
j
=
1
,
⋯
,
l
\text{FastBaseExt}(a,Q,P) = \left\{ \sum_{i=1}^k \left[ a \cdot \left(\dfrac{Q}{q_i}\right)^{-1} \right]_{q_i} \cdot \dfrac{Q}{q_i} \pmod{p_j} \right\}_{j=1,\cdots,l}
FastBaseExt(a,Q,P)=⎩
⎨
⎧i=1∑k[a⋅(qiQ)−1]qi⋅qiQ(modpj)⎭
⎬
⎫j=1,⋯,l
我们简记
q
i
∗
:
=
Q
/
q
i
q_i^*:=Q/q_i
qi∗:=Q/qi 和
q
~
i
:
=
(
Q
/
q
i
)
−
1
(
m
o
d
q
i
)
\tilde q_i:=(Q/q_i)^{-1} \pmod{q_i}
q~i:=(Q/qi)−1(modqi),满足
q
i
∗
⋅
q
~
i
≡
1
(
m
o
d
q
i
)
q_i^* \cdot \tilde q_i\equiv 1 \pmod{q_i}
qi∗⋅q~i≡1(modqi),那么根据 CRT 合成定理,
∑
i
[
a
⋅
q
~
i
]
q
i
⋅
q
i
∗
=
[
a
]
Q
+
u
⋅
Q
∈
Z
\sum_i [a \cdot \tilde q_i]_{q_i} \cdot q_i^* = [a]_Q + u \cdot Q \in \mathbb Z
i∑[a⋅q~i]qi⋅qi∗=[a]Q+u⋅Q∈Z
其中的
∥
u
∥
∞
≤
k
/
2
\|u\|_\infty \le k/2
∥u∥∞≤k/2 称为
Q
Q
Q-overflow,因此算法
FastBaseExt
(
a
,
Q
,
P
)
\text{FastBaseExt}(a,Q,P)
FastBaseExt(a,Q,P) 输出的只是
[
[
a
]
Q
]
P
[[a]_Q]_P
[[a]Q]P 的近似值
[
[
a
]
Q
+
u
⋅
Q
]
P
[[a]_Q + u \cdot Q]_P
[[a]Q+u⋅Q]P
在有些实例中, u u u 的影响几乎可忽略;但是还有一些实例中, u u u 可能会导致较为显著的噪声增长,需要想办法去除它。
我们滥用符号, Q , P Q,P Q,P 代表对应的 RNS basis 集合, [ a ] Q [a]_Q [a]Q 代表它的 RNS 表示。
γ \gamma γ-correction technique
BFV 的一个关键计算是
⌊
P
Q
[
a
]
Q
⌉
=
P
⋅
[
a
]
Q
−
[
P
a
]
Q
Q
∈
R
P
\left\lfloor \dfrac{P}{Q}[a]_Q \right\rceil = \dfrac{P \cdot[a]_Q - [Pa]_Q}{Q} \in \mathcal R_P
⌊QP[a]Q⌉=QP⋅[a]Q−[Pa]Q∈RP
因为上述运算是整除法,因此可以用模乘逆元替代,
(
P
⋅
[
a
]
Q
−
[
P
a
]
Q
)
⋅
Q
−
1
(
m
o
d
P
)
(P \cdot[a]_Q - [Pa]_Q) \cdot Q^{-1} \pmod P
(P⋅[a]Q−[Pa]Q)⋅Q−1(modP)
[BEHZ16] 采取整数指令,额外引入和
P
,
Q
P,Q
P,Q 互素的整数
γ
\gamma
γ,假设
[
a
]
Q
=
Q
/
P
⋅
m
+
e
+
Q
r
[a]_Q=Q/P \cdot m+e+Qr
[a]Q=Q/P⋅m+e+Qr,将
[
a
]
Q
[a]_Q
[a]Q 加倍
γ
\gamma
γ,那么
FastBaseExt
(
γ
P
a
,
Q
,
γ
P
)
⋅
[
−
Q
−
1
]
P
=
[
[
γ
P
a
]
Q
+
u
⋅
Q
]
γ
P
⋅
[
−
Q
−
1
]
γ
P
=
⌊
γ
P
Q
[
a
]
Q
⌉
−
u
=
γ
⋅
(
m
+
P
r
)
+
⌊
γ
P
e
Q
⌉
−
u
\begin{aligned} &\,\, \text{FastBaseExt}(\gamma Pa,Q,\gamma P) \cdot [-Q^{-1}]_P\\ =&\,\, [[\gamma Pa]_Q + u \cdot Q]_{\gamma P} \cdot [-Q^{-1}]_{\gamma P}\\ =&\,\, \left\lfloor \dfrac{\gamma P}{Q}[a]_Q \right\rceil - u\\ =&\,\, \gamma \cdot (m + Pr) + \left\lfloor \dfrac{\gamma Pe}{Q} \right\rceil - u \end{aligned}
===FastBaseExt(γPa,Q,γP)⋅[−Q−1]P[[γPa]Q+u⋅Q]γP⋅[−Q−1]γP⌊QγP[a]Q⌉−uγ⋅(m+Pr)+⌊QγPe⌉−u
当
γ
\gamma
γ 满足某条件时(文章中写的我看不懂,它没解释),RNS 的关于
γ
\gamma
γ 的部分,满足
[
⌊
γ
P
e
Q
⌉
−
u
]
γ
=
⌊
γ
P
e
Q
⌉
−
u
∈
R
\left[ \left\lfloor \dfrac{\gamma Pe}{Q} \right\rceil - u \right]_\gamma = \left\lfloor \dfrac{\gamma Pe}{Q} \right\rceil - u \in \mathcal R
[⌊QγPe⌉−u]γ=⌊QγPe⌉−u∈R
于是,纠错方式为:
[
m
]
P
=
(
[
γ
⋅
(
m
+
P
r
)
+
⌊
γ
P
e
Q
⌉
−
u
]
P
−
[
⌊
γ
P
e
Q
⌉
−
u
]
γ
)
⋅
[
γ
−
1
]
P
[m]_P = \left(\left[ \gamma \cdot (m + Pr) + \left\lfloor \dfrac{\gamma Pe}{Q} \right\rceil - u \right]_P - \left[ \left\lfloor \dfrac{\gamma Pe}{Q} \right\rceil - u \right]_\gamma\right) \cdot [\gamma^{-1}]_P
[m]P=([γ⋅(m+Pr)+⌊QγPe⌉−u]P−[⌊QγPe⌉−u]γ)⋅[γ−1]P
不过,[BEHZ16] 的这个方法只能缓解,并没有根本地解决 Q Q Q-overflow 的问题。而 [HPS19] 的方法可以完全移除它。
Retrieve the Overflow
[HPS19] 采取浮点指令,直接计算
u
u
u 的值(精度受限的),
u
=
⌊
∑
i
[
a
⋅
q
~
i
]
q
i
⋅
q
i
∗
Q
⌉
=
⌊
∑
i
=
1
k
[
a
⋅
q
~
i
]
q
i
q
i
⌉
\begin{aligned} u &= \left\lfloor \dfrac{\sum_i [a \cdot \tilde q_i]_{q_i} \cdot q_i^*}{Q} \right\rceil = \left\lfloor \sum_{i=1}^k \dfrac{[a \cdot \tilde q_i]_{q_i}}{q_i} \right\rceil \end{aligned}
u=⌊Q∑i[a⋅q~i]qi⋅qi∗⌉=⌊i=1∑kqi[a⋅q~i]qi⌉
于是
[
a
]
Q
=
(
∑
i
[
a
⋅
q
~
i
]
q
i
⋅
q
i
∗
)
−
u
⋅
Q
[a]_Q = (\sum_i [a \cdot \tilde q_i]_{q_i} \cdot q_i^*) - u \cdot Q
[a]Q=(∑i[a⋅q~i]qi⋅qi∗)−u⋅Q,纠错方式为:
[
[
a
]
Q
]
P
=
FastBaseExt
(
a
,
Q
,
P
)
−
u
⋅
[
Q
]
P
[[a]_Q]_P = \text{FastBaseExt}(a,Q,P) -u\cdot [Q]_P
[[a]Q]P=FastBaseExt(a,Q,P)−u⋅[Q]P
具体步骤:预计算 [ q i ∗ ] p j , ∀ i ∈ [ k ] , ∀ j ∈ [ l ] [q_i^*]_{p_j},\forall i \in [k],\forall j \in [l] [qi∗]pj,∀i∈[k],∀j∈[l],预计算 [ q ~ i ] q i , ∀ i ∈ [ k ] [\tilde q_i]_{q_i},\forall i \in [k] [q~i]qi,∀i∈[k],预计算 [ Q ] p j , ∀ j ∈ [ l ] [Q]_{p_j},\forall j \in [l] [Q]pj,∀j∈[l]
- 输入 [ a ] Q [a]_Q [a]Q 的 RNS 表示 ( a 1 , ⋯ , a k ) (a_1,\cdots,a_k) (a1,⋯,ak),其中 a i = [ a ] q i a_i=[a]_{q_i} ai=[a]qi
- 使用单精度整数指令,计算 y i = [ a i ⋅ q ~ i ] q i y_i=[a_i \cdot \tilde q_i]_{q_i} yi=[ai⋅q~i]qi
- 使用单精度浮点指令,计算 z i = y i / q i z_i = y_i/q_i zi=yi/qi
- 计算出 u = ⌊ ∑ i z i ⌉ ∈ Z k u=\lfloor \sum_i z_i \rceil \in\mathbb Z_k u=⌊∑izi⌉∈Zk
- 在 Q Q Q 的 RNS 下,计算 x i = a i ⋅ [ q ~ i ] q i ( m o d q i ) x_i = a_i \cdot [\tilde q_i]_{q_i} \pmod{q_i} xi=ai⋅[q~i]qi(modqi)
- 在 P P P 的 RNS 下,计算 A j ′ = ∑ i x i ⋅ [ q i ∗ ] p j ( m o d p j ) A_j'=\sum_i x_i \cdot [q_i^*]_{p_j} \pmod{p_j} Aj′=∑ixi⋅[qi∗]pj(modpj)
- 纠正错误, A j = A j ′ − u ⋅ [ Q ] p j A_j=A_j' - u \cdot [Q]_{p_j} Aj=Aj′−u⋅[Q]pj
- 输出 [ a ] P = { A 1 , ⋯ , A l } [a]_{P} = \{A_1,\cdots,A_l\} [a]P={A1,⋯,Al},易知 [ a ] Q ∪ [ a ] P = [ a ] P Q [a]_Q \cup [a]_P = [a]_{PQ} [a]Q∪[a]P=[a]PQ
因为浮点数精度是有限的,因此实际计算出的数值为 z i ∗ = z i + ϵ i z_i^*=z_i+\epsilon_i zi∗=zi+ϵi,最终得到 u ∗ = ⌊ ∑ i z i ∗ ⌉ u^*=\lfloor\sum_i z_i^*\rceil u∗=⌊∑izi∗⌉,总噪声是 ϵ = ∑ i ϵ i \epsilon=\sum_i \epsilon_i ϵ=∑iϵi,使用 IEEE-754 double 那么有 ϵ < k ⋅ 2 − 53 \epsilon < k \cdot 2^{-53} ϵ<k⋅2−53。我们定义 Z + [ 0.5 − ϵ , 0.5 + ϵ ] \mathbb Z+[0.5-\epsilon, 0.5+\epsilon] Z+[0.5−ϵ,0.5+ϵ] 是 possible-error region,一旦 ∑ i z i ∗ \sum_i z_i^* ∑izi∗ 落入这个区间,就应当采取高精度算术。不过,即使忽略它也影响不大,仅仅对噪声增长有一个极小的贡献。
Modulus-Switching and Scaling in RNS
Simple Reduction
输入 x ∈ Z P Q x \in \mathbb Z_{PQ} x∈ZPQ 的 RNS 表示,记为 ( x 1 , ⋯ , x k , x 1 ′ , ⋯ , x l ′ ) (x_1,\cdots,x_k,x_1',\cdots,x_l') (x1,⋯,xk,x1′,⋯,xl′),分别对应到 Q = ∏ i q i Q=\prod_i q_i Q=∏iqi 和 P = ∏ j p j P=\prod_j p_j P=∏jpj
RNS 下的模约减:为了计算 x ( m o d Q ) x \pmod Q x(modQ),简单删除 P P P 的分量,输出 [ x ] Q = ( x 1 , ⋯ , x k ) [x]_Q=(x_1,\cdots,x_k) [x]Q=(x1,⋯,xk)
RNS 下的整除法:假设 P ∣ x P|x P∣x(易知 x j ′ = 0 x_j'=0 xj′=0),为了计算 x / P x/P x/P,预计算 [ P ] q i [P]_{q_i} [P]qi,在线计算 [ x / P ] Q = ( [ x 1 ⋅ P ] q 1 , ⋯ , [ x k ⋅ P ] q k ) [x/P]_Q = ([x_1\cdot P]_{q_1},\cdots,[x_k\cdot P]_{q_k}) [x/P]Q=([x1⋅P]q1,⋯,[xk⋅P]qk)
注意 RNS 系统不是数位系统(positional system),不能计算 Z \mathbb Z Z 上的带余除法,也不能执行比较和舍入运算。因此,对于 BGV、BFV 中的某些必要运算(BGV 模切换、BFV 乘法缩放、秘钥切换、解密),需要设计特殊的解决方案。
Modulus-Switching for BGV
[GHS12] 给出了 BGV 的 Double-CRT 实现,对于 t = 2 t=2 t=2 平凡明文模数,因为 q i = 1 ( m o d t ) q_i=1\pmod t qi=1(modt) 导致实现简单。根据数论,
- a ≡ b ( m o d q ) → k a ≡ k b ( m o d k q ) a \equiv b \pmod q \to ka \equiv kb \pmod{kq} a≡b(modq)→ka≡kb(modkq)
- a ≡ b ( m o d q ) → a / d ≡ b / d ( m o d q / d ) , d = gcd ( a , b , q ) a \equiv b \pmod{q} \to a/d \equiv b/d \pmod{q/d},d=\gcd(a,b,q) a≡b(modq)→a/d≡b/d(modq/d),d=gcd(a,b,q)
- a ≡ b ( m o d q ) , d ∣ q → a ≡ b ( m o d d ) a \equiv b \pmod q,d\mid q \to a \equiv b \pmod{d} a≡b(modq),d∣q→a≡b(modd)
- a ≡ b ( m o d m i ) → a ≡ b ( m o d l c m ( m i ) ) a \equiv b \pmod{m_i} \to a \equiv b \pmod{lcm(m_i)} a≡b(modmi)→a≡b(modlcm(mi))
对于一般的明文模数 t t t,令它是大素数(例如 t = 2 16 + 1 t=2^{16}+1 t=216+1),给定密文 c ∈ R Q k 2 c \in \mathcal R_{Q_k}^2 c∈RQk2,我们计算特殊的 c † ∈ R 2 c^\dagger \in \mathcal R^2 c†∈R2(系数在 Z \mathbb Z Z 上),满足
-
解密条件: c † ≡ c ⋅ q k ( m o d t ) c^\dagger \equiv c \cdot q_k \pmod t c†≡c⋅qk(modt),
LSD编码,因为 c ⋅ s ≡ m + t e ( m o d Q k ) c \cdot s \equiv m+te \pmod{Q_k} c⋅s≡m+te(modQk),假如小噪声 m + t e m+te m+te 不回绕 Q k − 1 Q_{k-1} Qk−1,从而 [ c s ] Q k = [ c s ] Q k − 1 [cs]_{Q_k}=[cs]_{Q_{k-1}} [cs]Qk=[cs]Qk−1 就是 m + t e ∈ Z N m+te \in \mathbb Z^N m+te∈ZN 的精确值,进而得到 [ [ c s ] Q k − 1 ] t = [ m + t e ] t = [ m ] t [[cs]_{Q_{k-1}}]_t = [m+te]_t = [m]_t [[cs]Qk−1]t=[m+te]t=[m]t
假如噪声 q k ( m + t e ) q_k(m+te) qk(m+te) 不回绕 Q k Q_{k} Qk,那么 [ [ c † s ] Q k ] t = [ q k ( m + t e ) ] t = [ q k m ] t [[c^\dagger s]_{Q_{k}}]_t = [q_k(m+te)]_t=[q_km]_t [[c†s]Qk]t=[qk(m+te)]t=[qkm]t
-
噪声条件: δ = c † − c \delta=c^\dagger-c δ=c†−c 的范数较小
-
整除条件: q k ∣ c † q_k\mid c^\dagger qk∣c†,注意 Z \mathbb Z Z 上的整除恰好是 Z Q k − 1 \mathbb Z_{Q_{k-1}} ZQk−1 上的乘以逆元,
于是 c ′ = c † / q k c'=c^\dagger/q_k c′=c†/qk 的系数落在 [ − Q k − 1 / 2 , Q k − 1 ) [-Q_{k-1}/2,Q_{k-1}) [−Qk−1/2,Qk−1) 内,并且满足 [ c ′ s ] Q k − 1 = [ q k − 1 c † s ] Q k − 1 = [ c s ] Q k − 1 [c's]_{Q_{k-1}}=[q_k^{-1}c^\dagger s]_{Q_{k-1}}=[cs]_{Q_{k-1}} [c′s]Qk−1=[qk−1c†s]Qk−1=[cs]Qk−1,从而 c ′ c' c′ 是 m m m 的密文
我们希望先计算出小差距
δ
≡
(
q
k
−
1
)
⋅
c
(
m
o
d
t
)
\delta \equiv (q_k-1) \cdot c \pmod t
δ≡(qk−1)⋅c(modt),然后再求出
c
†
c^\dagger
c†,最后计算出
c
′
=
c
†
/
q
k
c'=c^\dagger/q_k
c′=c†/qk,但是输入的 RNS 表示中不存在
[
c
]
t
[c]_t
[c]t,导致
δ
\delta
δ 难以计算。[GHS12] 转而计算密文:
c
^
=
[
q
k
]
t
⋅
c
(
m
o
d
Q
k
)
\hat c=[q_k]_t \cdot c \pmod{Q_k}
c^=[qk]t⋅c(modQk)
它加密了扭曲的消息
[
q
k
]
t
⋅
m
[q_k]_t \cdot m
[qk]t⋅m(对于
t
=
2
t=2
t=2 特殊情况,恰好不扭转),寻找
c
†
c^\dagger
c† 的条件改变为:
- 解密条件: c † ≡ c ^ ( m o d t ) c^\dagger \equiv \hat c \pmod t c†≡c^(modt),它使得 [ [ c † s ] Q k ] t = [ q k m ] t [[c^\dagger s]_{Q_k}]_t = [q_km]_t [[c†s]Qk]t=[qkm]t
- 噪声条件: δ = c † − c ^ \delta=c^\dagger-\hat c δ=c†−c^,注意这儿的变化导致 δ ≡ 0 ( m o d t ) \delta \equiv 0 \pmod t δ≡0(modt)
- 整除条件: q k ∣ c † q_k \mid c^\dagger qk∣c†,计算出 c ′ = c † / q k c'=c^\dagger/q_k c′=c†/qk 它满足 [ [ c ′ s ] Q k − 1 ] t = [ q k m ] t [[c's]_{Q_{k-1}}]_t=[q_km]_t [[c′s]Qk−1]t=[qkm]t(似乎不太对)
此时的 δ \delta δ 容易计算,算法如下:
- 输入 c ( m o d Q k ) c \pmod{Q_k} c(modQk) 的 RNS 表示(加密了 [ m ] t [m]_t [m]t)
- 先计算 c ^ = [ q k ] t ⋅ c \hat c=[q_k]_t \cdot c c^=[qk]t⋅c 的 RNS 表示,然后计算 [ c ^ ] q k [\hat c]_{q_k} [c^]qk 的系数表示 c ˉ \bar c cˉ
- 我们计算差距 δ ∈ [ − q k t / 2. q k t / 2 ) N \delta \in [-q_kt/2.q_kt/2)^N δ∈[−qkt/2.qkt/2)N,使得它满足 δ ≡ 0 ( m o d t ) \delta \equiv 0 \pmod t δ≡0(modt) 以及 δ ≡ − c ˉ ( m o d q k ) \delta \equiv -\bar c \pmod{q_k} δ≡−cˉ(modqk)
- 计算出 c † = c ^ + δ c^\dagger=\hat c+\delta c†=c^+δ,易知 c † ≡ c ^ ( m o d t ) c^\dagger \equiv \hat c \pmod t c†≡c^(modt) 以及 c † ≡ 0 ( m o d q k ) c^\dagger \equiv 0 \pmod{q_k} c†≡0(modqk)
- 最后计算整除 c ′ = c † / q k ( m o d Q k − 1 ) c'=c^\dagger/q_k \pmod{Q_{k-1}} c′=c†/qk(modQk−1),通过各分量乘以逆元 [ q k − 1 ] q i , ∀ i ≤ k − 1 [q_k^{-1}]_{q_i},\forall i\le k-1 [qk−1]qi,∀i≤k−1
- 输出 c ′ ( m o d Q k − 1 ) c' \pmod{Q_{k-1}} c′(modQk−1) 的 RNS 表示(加密了 [ q k m ] t [q_km]_t [qkm]t)
由于每次模切换都会扭曲消息,因此我们需要实时地追踪它,在同态加法/乘法时也需要调整这个扭曲因子。
Scaling for BFV
[HPS19] 给出了 BFV 的两种缩放程序,前者可用于解密,后者用于 GHS 秘钥切换。
Simple scaling
输入: x ∈ Z Q x \in \mathbb Z_Q x∈ZQ 的 RNS 表示 ( x 1 , ⋯ , x k ) (x_1,\cdots,x_k) (x1,⋯,xk),任意的正整数 t t t(单精度整数)
输出: y = ⌊ t / Q ⋅ x ⌉ ∈ Z t y=\lfloor t/Q \cdot x\rceil \in \mathbb Z_t y=⌊t/Q⋅x⌉∈Zt
类似 CRT Basis Extension 的思路,将
[
x
]
Q
[x]_Q
[x]Q 重建为
x
x
x,观察提取出可预计算的部分,
y
=
⌊
t
Q
⋅
x
⌉
=
⌊
t
Q
⋅
∑
i
=
1
k
x
i
⋅
q
i
∗
⋅
q
~
i
−
u
⋅
t
⌉
=
⌊
∑
i
=
1
k
x
i
⋅
(
t
q
i
⋅
q
~
i
)
⌉
−
u
⋅
t
\begin{aligned} y &= \left\lfloor \dfrac{t}{Q} \cdot x \right\rceil = \left\lfloor \dfrac{t}{Q} \cdot \sum_{i=1}^k x_i \cdot q_i^* \cdot \tilde q_i - u \cdot t \right\rceil\\ &= \left\lfloor \sum_{i=1}^k x_i \cdot \left(\dfrac{t}{q_i} \cdot \tilde q_i\right) \right\rceil - u \cdot t\\ \end{aligned}
y=⌊Qt⋅x⌉=⌊Qt⋅i=1∑kxi⋅qi∗⋅q~i−u⋅t⌉=⌊i=1∑kxi⋅(qit⋅q~i)⌉−u⋅t
我们预计算其中的常数,分为整数和小数两部分,
t
q
~
i
q
i
=
ω
i
+
θ
i
,
ω
i
∈
Z
t
,
θ
i
∈
[
−
0.5
,
0.5
)
\dfrac{t\tilde q_i}{q_i} = \omega_{i}+\theta_{i},\,\, \omega_{i} \in \mathbb Z_{t},\,\, \theta_{i} \in [-0.5,0.5)
qitq~i=ωi+θi,ωi∈Zt,θi∈[−0.5,0.5)
缩放步骤为:
- 使用单精度整数指令,计算 w = [ ∑ i x i ⋅ ω i ] t w=[\sum_i x_i \cdot \omega_{i}]_{t} w=[∑ixi⋅ωi]t
- 使用单精度浮点指令,计算 v = ⌊ ∑ i x i ⋅ θ i ⌉ ∈ Z k v=\lfloor \sum_i x_i \cdot \theta_{i} \rceil \in \mathbb Z_{k} v=⌊∑ixi⋅θi⌉∈Zk
- 合并为 y = [ w + v ] t y=[w+v]_{t} y=[w+v]t
同样的,实际计算时存在误差 θ i ∗ = θ i + ϵ i , ∣ ϵ i ∣ < 2 − 53 \theta_{i}^*=\theta_{i}+\epsilon_{i},\,\, |\epsilon_{i}|<2^{-53} θi∗=θi+ϵi,∣ϵi∣<2−53,累计为 ϵ = ∑ i x i ϵ i \epsilon=\sum_i x_i \epsilon_{i} ϵ=∑ixiϵi,其中 x i = [ x ] q i ∈ [ − q i , q i ) x_i=[x]_{q_i} \in [-q_i,q_i) xi=[x]qi∈[−qi,qi),于是 ∣ ϵ j ∣ < 2 − 54 ⋅ ∑ i q i |\epsilon_j|<2^{-54} \cdot \sum_i q_i ∣ϵj∣<2−54⋅∑iqi,我们应当选取合适的 k k k 和 q i q_i qi,使得 ∣ ϵ j ∣ < 1 / 4 |\epsilon_j|<1/4 ∣ϵj∣<1/4 保证舍入是正确的。可能 IEEE-754 double 精度不够,需要使用不标准的 C/C++ long double 或者高精度算术。
Complex scaling
输入: x ∈ Z P Q x \in \mathbb Z_{PQ} x∈ZPQ 的 RNS 表示,某正整数 t t t,满足 x ∈ [ − P Q / 2 t , P Q / 2 t ) x \in [-PQ/2t, PQ/2t) x∈[−PQ/2t,PQ/2t) 落在较小范围内
输出: y = ⌊ t / Q ⋅ x ⌉ ∈ Z Q y=\lfloor t/Q \cdot x\rceil \in \mathbb Z_Q y=⌊t/Q⋅x⌉∈ZQ
抽象地,这可以分为两步完成,
- 利用 Simple scaling 过程,设置 Q ′ = P Q , t ′ = t P Q'=PQ, t'=tP Q′=PQ,t′=tP,获得 y ′ = ⌊ t ′ / Q ′ ⋅ x ⌉ = ⌊ t / Q ⋅ x ⌉ ∈ Z t P y' = \lfloor t'/Q' \cdot x\rceil = \lfloor t/Q \cdot x\rceil \in \mathbb Z_{tP} y′=⌊t′/Q′⋅x⌉=⌊t/Q⋅x⌉∈ZtP,丢弃 t t t 的部分(等价于简单取模)获得 y ′ = ⌊ t / Q ⋅ x ⌉ ∈ [ − P / 2 , P / 2 ) y'=\lfloor t/Q \cdot x\rceil \in [-P/2,P/2) y′=⌊t/Q⋅x⌉∈[−P/2,P/2)(因为 x x x 的范围小, y ′ y' y′ 是不取模的结果)
- 利用 RNS Basis Extension 过程,从 [ y ′ ] P [y']_P [y′]P 扩展出 [ y ′ ] P Q [y']_{PQ} [y′]PQ,丢弃 P P P 的部分,输出 y = [ y ′ ] Q y=[y']_Q y=[y′]Q
其中的 step 1 使用的 t ′ t' t′ 是高精度数字,需要先做 RNS 分解,然后分别执行 Simple scaling 过程,不过我们实际上只需要 [ y ′ ] P [y']_{P} [y′]P 而非 [ y ′ ] t P [y']_{tP} [y′]tP,并且 P ∣ gcd ( Q ′ , t ′ ) P|\gcd(Q',t') P∣gcd(Q′,t′),其实存在更快的算法。
简记
Q
i
∗
=
Q
/
q
i
=
q
i
∗
P
,
P
j
=
Q
/
p
j
=
Q
p
j
∗
Q_i^*=Q/q_i=q_i^*P, P_j=Q/p_j=Qp_j^*
Qi∗=Q/qi=qi∗P,Pj=Q/pj=Qpj∗,计算
Q
~
i
=
[
(
Q
i
∗
)
−
1
]
q
i
,
P
~
j
=
[
(
P
j
∗
)
−
1
]
p
j
\tilde Q_i=[(Q_i^*)^{-1}]_{q_i}, \tilde P_j=[(P_j^*)^{-1}]_{p_j}
Q~i=[(Qi∗)−1]qi,P~j=[(Pj∗)−1]pj,简记
x
i
=
[
x
]
q
i
,
x
j
′
=
[
x
]
p
j
x_i=[x]_{q_i}, x_j'=[x]_{p_j}
xi=[x]qi,xj′=[x]pj,那么
y
′
=
⌊
t
′
Q
′
⋅
x
⌉
=
⌊
t
Q
⋅
(
∑
i
=
1
k
x
i
⋅
Q
i
∗
⋅
Q
~
i
+
∑
j
=
1
l
x
j
′
⋅
P
j
∗
⋅
P
~
j
)
−
u
⋅
t
P
⌉
=
⌊
∑
i
=
1
k
x
i
⋅
(
t
q
i
⋅
Q
~
i
P
)
+
∑
j
=
1
l
x
j
′
⋅
(
t
⋅
P
~
j
p
j
∗
)
⌉
−
u
⋅
t
P
\begin{aligned} y' &= \left\lfloor \dfrac{t'}{Q'} \cdot x \right\rceil = \left\lfloor \dfrac{t}{Q} \cdot \left(\sum_{i=1}^k x_i \cdot Q_i^* \cdot \tilde Q_i + \sum_{j=1}^l x_j' \cdot P_j^* \cdot \tilde P_j\right) - u \cdot tP \right\rceil\\ &= \left\lfloor \sum_{i=1}^k x_i \cdot \left(\dfrac{t}{q_i} \cdot \tilde Q_iP\right) + \sum_{j=1}^l x_j' \cdot \left(t \cdot \tilde P_jp_j^*\right) \right\rceil - u \cdot tP\\ \end{aligned}
y′=⌊Q′t′⋅x⌉=⌊Qt⋅(i=1∑kxi⋅Qi∗⋅Q~i+j=1∑lxj′⋅Pj∗⋅P~j)−u⋅tP⌉=⌊i=1∑kxi⋅(qit⋅Q~iP)+j=1∑lxj′⋅(t⋅P~jpj∗)⌉−u⋅tP
计算
[
y
′
]
P
[y']_P
[y′]P 的 RNS 表示,
[
y
′
]
p
j
=
[
⌊
∑
i
=
1
k
x
i
⋅
(
t
q
i
⋅
Q
~
i
P
)
⌉
+
x
j
′
⋅
(
t
⋅
P
~
j
p
j
∗
)
]
p
j
[y']_{p_j} = \left[ \left\lfloor \sum_{i=1}^k x_i \cdot \left(\dfrac{t}{q_i} \cdot \tilde Q_iP\right) \right\rceil + x_j' \cdot \left(t \cdot \tilde P_jp_j^*\right) \right]_{p_j}
[y′]pj=[⌊i=1∑kxi⋅(qit⋅Q~iP)⌉+xj′⋅(t⋅P~jpj∗)]pj
需要预计算
t
Q
~
i
P
q
i
=
ω
i
+
θ
i
,
ω
i
∈
Z
P
,
θ
i
∈
[
−
0.5
,
0.5
)
\dfrac{t\tilde Q_iP}{q_i} = \omega_{i}+\theta_{i},\,\, \omega_{i} \in \mathbb Z_{P},\,\, \theta_{i} \in [-0.5,0.5)
qitQ~iP=ωi+θi,ωi∈ZP,θi∈[−0.5,0.5)
继续将
w
i
w_i
wi 分解为单精度整数
w
i
j
:
=
[
w
i
]
p
j
,
∀
i
∈
[
k
]
,
∀
j
∈
[
l
]
w_{ij}:=[w_i]_{p_j},\forall i\in [k],\forall j \in [l]
wij:=[wi]pj,∀i∈[k],∀j∈[l],另外预计算
λ
j
:
=
[
t
P
~
j
p
j
∗
]
p
j
,
∀
j
∈
[
l
]
\lambda_j:=[t\tilde P_jp_j^*]_{p_j}, \forall j \in [l]
λj:=[tP~jpj∗]pj,∀j∈[l]
输入 ( x 1 , ⋯ , x k , x 1 ′ , ⋯ , x l ′ ) (x_1,\cdots,x_k,x_1',\cdots,x_l') (x1,⋯,xk,x1′,⋯,xl′),则 step 1 的步骤为:
- 使用浮点数指令,计算 v = ⌊ ∑ i x i θ i ⌉ ∈ Z k v=\lfloor \sum_i x_i\theta_i \rceil \in \mathbb Z_k v=⌊∑ixiθi⌉∈Zk,这个是共用的
- 使用整数指令,计算 w j = [ ∑ i x i w i j + λ j x j ′ ] p j w_j=[\sum_i x_iw_{ij} + \lambda_jx_j']_{p_j} wj=[∑ixiwij+λjxj′]pj,第二项累加被 ( m o d p j ) \pmod{p_j} (modpj) 基本消除
- 合并为 [ y ′ ] p j = [ v + w j ] p j [y']_{p_j}=[v+w_j]_{p_j} [y′]pj=[v+wj]pj
Scaling between Arbitrary RNS Bases
[KPZ21] 给出了另一种 Simple scaling 的实现,
输入: x ∈ Z Q x \in \mathbb Z_{Q} x∈ZQ 的 RNS 表示,与 Q Q Q 互素的多精度整数 P P P
输出: ⌊ P / Q ⋅ [ x ] Q ⌉ ( m o d P ) \lfloor P/Q \cdot [x]_Q\rceil \pmod P ⌊P/Q⋅[x]Q⌉(modP)
在 [BEHZ16] 中,它将舍入运算可以写作整除法,
⌊
P
Q
⋅
[
x
]
Q
⌉
=
P
⋅
[
x
]
Q
−
[
P
x
]
Q
Q
\left\lfloor \dfrac{P}{Q} \cdot [x]_Q \right\rceil = \dfrac{P \cdot[x]_Q - [Px]_Q}{Q}
⌊QP⋅[x]Q⌉=QP⋅[x]Q−[Px]Q
因此它等价于在
Z
P
\mathbb Z_P
ZP 中乘以逆元,
[
⌊
P
Q
⋅
[
x
]
Q
⌉
]
P
=
[
−
[
P
x
]
Q
]
P
⋅
[
Q
−
1
]
P
\left[ \left\lfloor \dfrac{P}{Q} \cdot [x]_Q \right\rceil \right]_P = \Big[- [Px]_Q\Big]_P \cdot [Q^{-1}]_P
[⌊QP⋅[x]Q⌉]P=[−[Px]Q]P⋅[Q−1]P
根据 CRT 组合公式,
[
P
x
]
Q
=
∑
i
=
1
k
[
P
x
]
q
i
⋅
[
q
~
i
]
q
i
⋅
q
i
∗
−
u
⋅
Q
[Px]_Q = \sum_{i=1}^k [Px]_{q_i} \cdot [\tilde q_i]_{q_i} \cdot q_i^* - u \cdot Q
[Px]Q=i=1∑k[Px]qi⋅[q~i]qi⋅qi∗−u⋅Q
因此最终结果的 RNS 表示的计算公式为:
[
−
[
P
x
]
Q
]
p
j
⋅
[
Q
−
1
]
p
j
=
[
u
−
∑
i
=
1
k
[
P
x
]
q
i
⋅
[
q
~
i
]
q
i
⋅
q
i
−
1
]
p
j
\Big[- [Px]_Q\Big]_{p_j} \cdot [Q^{-1}]_{p_j} = \left[ u - \sum_{i=1}^k [Px]_{q_i} \cdot [\tilde q_i]_{q_i} \cdot q_i^{-1} \right]_{p_j}
[−[Px]Q]pj⋅[Q−1]pj=[u−i=1∑k[Px]qi⋅[q~i]qi⋅qi−1]pj
其中
∥
u
∥
∞
≤
k
/
2
\|u\|_\infty \le k/2
∥u∥∞≤k/2,可以使用 [HPS19] 的浮点数算法来精确计算。
Key-Switch in RNS
输入
s
A
s_A
sA 加密的密文
c
t
A
=
(
c
0
,
c
1
)
ct_A=(c_0,c_1)
ctA=(c0,c1),给定
s
B
s_B
sB 加密的
s
A
s_A
sA 的密文
k
s
A
→
B
ks_{A \to B}
ksA→B,
k
s
A
→
B
:
=
(
k
s
0
=
[
a
⋅
s
B
+
t
e
+
s
A
]
Q
,
k
s
1
=
[
−
a
]
Q
)
ks_{A \to B} := (ks_0=[a \cdot s_B+te+s_A]_Q, ks_1=[-a]_Q)
ksA→B:=(ks0=[a⋅sB+te+sA]Q,ks1=[−a]Q)
秘钥切换就是同态线性解密,抽象描述为
c
0
+
c
1
⋅
E
(
s
A
)
c_0+c_1 \cdot E(s_A)
c0+c1⋅E(sA),具体地:
c
t
B
=
c
0
⋅
(
1
,
0
)
+
c
1
⋅
k
s
A
→
B
=
(
[
c
0
+
c
1
⋅
k
s
0
]
Q
,
[
c
1
⋅
k
s
1
]
Q
)
\begin{aligned} ct_B &= c_0\cdot(1,0)+c_1 \cdot ks_{A \to B}\\ &= ([c_0+c_1 \cdot ks_0]_Q, [c_1 \cdot ks_1]_Q) \end{aligned}
ctB=c0⋅(1,0)+c1⋅ksA→B=([c0+c1⋅ks0]Q,[c1⋅ks1]Q)
重现性化是一种特殊的秘钥切换:输入密文
c
t
=
(
c
0
,
c
1
,
c
2
)
ct=(c_0,c_1,c_2)
ct=(c0,c1,c2),给定
s
s
s 加密的
s
2
s^2
s2 的密文
r
l
k
rlk
rlk,
r
l
k
:
=
(
r
l
k
0
=
[
a
⋅
s
+
t
e
+
s
2
]
Q
,
r
l
k
1
=
[
−
a
]
Q
)
rlk := (rlk_0=[a \cdot s+te+s^2]_Q, rlk_1=[-a]_Q)
rlk:=(rlk0=[a⋅s+te+s2]Q,rlk1=[−a]Q)
由于
(
0
,
1
)
(0,1)
(0,1) 就是
s
s
s 自身的密文,重现性化的抽象描述为
c
0
+
c
1
⋅
E
(
s
)
+
c
2
⋅
E
(
s
2
)
c_0+c_1\cdot E(s)+c_2\cdot E(s^2)
c0+c1⋅E(s)+c2⋅E(s2),具体地:
c
t
′
=
c
0
⋅
(
1
,
0
)
+
c
1
⋅
(
0
,
1
)
+
c
2
⋅
r
l
k
=
(
[
c
0
+
c
2
⋅
r
l
k
0
]
Q
,
[
c
1
+
c
2
⋅
r
l
k
1
]
)
\begin{aligned} ct' &= c_0 \cdot(1,0)+c_1\cdot(0,1)+c_2 \cdot rlk\\ &= ([c_0+c_2 \cdot rlk_0]_Q, [c_1+c_2 \cdot rlk_1]) \end{aligned}
ct′=c0⋅(1,0)+c1⋅(0,1)+c2⋅rlk=([c0+c2⋅rlk0]Q,[c1+c2⋅rlk1])
但是
c
1
c_1
c1 的规模相对于密文模数
Q
Q
Q 过大,导致秘钥切换中
k
s
A
→
B
ks_{A \to B}
ksA→B 的噪声被大幅增长。有两种方法来控制噪声,分别是 [BV11] 和 [GHS12],以及它们的混合。
Brakerski-Vaikuntanathan
[BV11] 采取数字分解技术,选取 radix- w w w,数位是 l = ⌊ log w Q ⌉ + 1 l=\lfloor \log_w Q\rceil+1 l=⌊logwQ⌉+1
- 分解: D w , Q ( a ) = ( [ a ] w , [ ⌊ a / w ⌉ ] w , ⋯ , [ ⌊ a / w l − 1 ⌉ ] w ) ∈ R w l D_{w,Q}(a) = ([a]_w,[\lfloor a/w\rceil]_w,\cdots,[\lfloor a/w^{l-1}\rceil]_w) \in \mathcal R_w^l Dw,Q(a)=([a]w,[⌊a/w⌉]w,⋯,[⌊a/wl−1⌉]w)∈Rwl,
- 幂次: P w , Q ( a ) = ( [ a ] Q , [ a w ] Q , ⋯ , [ a w l ] Q ) ∈ R Q l P_{w,Q}(a) = ([a]_Q,[aw]_Q,\cdots,[aw^l]_Q) \in \mathcal R_Q^l Pw,Q(a)=([a]Q,[aw]Q,⋯,[awl]Q)∈RQl
- 易知 ⟨ D ( a ) , P ( b ) ⟩ ≡ a b ( m o d Q ) \langle D(a),P(b)\rangle \equiv ab \pmod Q ⟨D(a),P(b)⟩≡ab(modQ)
因此,秘钥切换秘钥是:
k
s
A
→
B
B
V
:
=
(
k
s
0
=
[
a
⃗
⋅
s
B
+
t
e
⃗
+
P
w
,
Q
(
s
A
)
]
Q
,
k
s
1
=
[
−
a
⃗
]
Q
)
∈
R
Q
l
×
2
ks_{A \to B}^{BV} := (ks_0=[\vec a \cdot s_B+t\vec e+P_{w,Q}(s_A)]_Q, ks_1=[-\vec a]_Q) \in \mathcal R^{l \times 2}_Q
ksA→BBV:=(ks0=[a⋅sB+te+Pw,Q(sA)]Q,ks1=[−a]Q)∈RQl×2
秘钥切换程序是:
c
t
B
=
(
[
c
0
+
⟨
D
w
,
Q
(
c
1
)
,
k
s
0
⟩
]
Q
,
[
⟨
D
w
,
Q
(
c
1
)
,
k
s
1
⟩
]
Q
)
ct_B = ([c_0+\langle D_{w,Q}(c_1),ks_0\rangle]_Q, [\langle D_{w,Q}(c_1),ks_1\rangle]_Q)
ctB=([c0+⟨Dw,Q(c1),ks0⟩]Q,[⟨Dw,Q(c1),ks1⟩]Q)
然而,RNS 系统不是数位系统,上述的 radix-
w
w
w 分解无法自然地执行。[BEHZ16] 直接使用 RNS 的各个余数作为元素的分解形式,设
Q
=
q
1
⋯
q
k
Q=q_1\cdots q_k
Q=q1⋯qk,简记
q
i
∗
=
Q
/
q
i
,
q
~
i
=
(
q
i
∗
)
−
1
(
m
o
d
q
i
)
q_i^*=Q/q_i, \tilde q_i=(q_i^*)^{-1}\pmod{q_i}
qi∗=Q/qi,q~i=(qi∗)−1(modqi)
- 分解: D Q ( a ) = ( [ a q ~ 1 ] q 1 , [ a q ~ 2 ] q 2 , ⋯ , [ a q ~ k ] q k ) ∈ R k D_{Q}(a) = ([a\tilde q_1]_{q_1},[a\tilde q_2]_{q_2},\cdots,[a\tilde q_k]_{q_k}) \in \mathcal R^k DQ(a)=([aq~1]q1,[aq~2]q2,⋯,[aq~k]qk)∈Rk
- 幂次: P Q ( a ) = ( [ a q 1 ∗ ] Q , [ a q 2 ∗ ] Q , ⋯ , [ a q k ∗ ] Q ) ∈ R Q k P_{Q}(a) = ([aq_1^*]_{Q},[aq_2^*]_{Q},\cdots,[aq_k^*]_{Q}) \in \mathcal R_Q^k PQ(a)=([aq1∗]Q,[aq2∗]Q,⋯,[aqk∗]Q)∈RQk
- 容易验证,它也满足 ⟨ D ( a ) , P ( b ) ⟩ ≡ a b ( m o d Q ) \langle D(a),P(b)\rangle \equiv ab \pmod Q ⟨D(a),P(b)⟩≡ab(modQ)
在 RNS 下,秘钥切换秘钥是:
k
s
A
→
B
R
N
S
−
B
V
:
=
(
k
s
0
=
[
a
⃗
⋅
s
B
+
t
e
⃗
+
P
Q
(
s
A
)
]
Q
,
k
s
1
=
[
−
a
⃗
]
Q
)
∈
R
Q
k
×
2
ks_{A \to B}^{RNS-BV} := (ks_0=[\vec a \cdot s_B+t\vec e+P_{Q}(s_A)]_Q, ks_1=[-\vec a]_Q) \in \mathcal R^{k \times 2}_Q
ksA→BRNS−BV:=(ks0=[a⋅sB+te+PQ(sA)]Q,ks1=[−a]Q)∈RQk×2
秘钥切换程序是:
c
t
B
=
(
[
c
0
+
⟨
D
Q
(
c
1
)
,
k
s
0
⟩
]
Q
,
[
⟨
D
Q
(
c
1
)
,
k
s
1
⟩
]
Q
)
ct_B = ([c_0+\langle D_{Q}(c_1), ks_0\rangle]_Q, [\langle D_{Q}(c_1), ks_1\rangle]_Q)
ctB=([c0+⟨DQ(c1),ks0⟩]Q,[⟨DQ(c1),ks1⟩]Q)
[HPS19] 进一步优化,修改为
- 分解: D Q ( a ) = ( [ a ] q 1 , [ a ] q 2 , ⋯ , [ a ] q k ) ∈ R k D_{Q}(a) = ([a]_{q_1},[a]_{q_2},\cdots,[a]_{q_k}) \in \mathcal R^k DQ(a)=([a]q1,[a]q2,⋯,[a]qk)∈Rk
- 幂次: P Q ( a ) = ( [ a q 1 ∗ q ~ 1 ] Q , [ a q 2 ∗ q ~ 2 ] Q , ⋯ , [ a q k ∗ q ~ k ] Q ) ∈ R Q k P_{Q}(a) = ([aq_1^*\tilde q_1]_{Q},[aq_2^*\tilde q_2]_{Q},\cdots,[aq_k^*\tilde q_k]_{Q}) \in \mathcal R_Q^k PQ(a)=([aq1∗q~1]Q,[aq2∗q~2]Q,⋯,[aqk∗q~k]Q)∈RQk
因此 [ c 1 ] Q [c_1]_Q [c1]Q 直接就是 D ( c 1 ) D(c_1) D(c1),于是节约了一些数乘运算。
具体流程,以及对应的复杂度:
Gentry-Halevi-Smart
[GHS12] 使用临时扩展技术,选取足够大的 P = p 1 ⋯ p l ≈ Q P=p_1\cdots p_l \approx Q P=p1⋯pl≈Q
秘钥切换秘钥为:
k
s
A
→
B
G
H
S
:
=
(
k
s
0
=
[
a
⋅
s
B
+
t
e
+
P
s
A
]
P
Q
,
k
s
1
=
[
−
a
]
P
Q
)
∈
R
P
Q
2
ks_{A \to B}^{GHS} := (ks_0=[a \cdot s_B+te+Ps_A]_{PQ}, ks_1=[-a]_{PQ}) \in \mathcal R^{2}_{PQ}
ksA→BGHS:=(ks0=[a⋅sB+te+PsA]PQ,ks1=[−a]PQ)∈RPQ2
秘钥切换程序是:
-
先在 P Q PQ PQ 下计算 c 1 ⋅ E ( s A ) c_1 \cdot E(s_A) c1⋅E(sA),
c t B ′ = ( c 0 ′ = [ c 1 ⋅ k s 0 ] P Q , c 1 ′ = [ c 1 ⋅ k s 1 ] P Q ) ct_B' = (c_0'=[c_1 \cdot ks_0]_{PQ}, c_1'=[c_1 \cdot ks_1]_{PQ}) ctB′=(c0′=[c1⋅ks0]PQ,c1′=[c1⋅ks1]PQ) -
然后计算 c t B ′ ct_B' ctB′ 整除 P P P 的差距(满足 [ δ ] t = 0 [\delta]_t=0 [δ]t=0 和 [ c t B ′ ] P = [ δ ] P [ct_B']_P=[\delta]_P [ctB′]P=[δ]P),
δ = ( δ 0 = t [ − t − 1 c 0 ′ ] P , δ 1 = t [ − t − 1 c 1 ′ ] P ) ∈ R P Q 2 \delta = (\delta_0=t[-t^{-1}c_0']_P, \delta_1=t[-t^{-1}c_1']_P) \in \mathcal R^{2}_{PQ} δ=(δ0=t[−t−1c0′]P,δ1=t[−t−1c1′]P)∈RPQ2 -
将 c t B ′ + δ ct_B'+\delta ctB′+δ 从 P Q PQ PQ 缩放到 Q Q Q(除以 P P P,而非简单取模),计算出
c t B = ( [ c 0 + c 0 ′ + δ 0 P ] Q , [ c 1 + c 1 ′ + δ 1 P ] Q ) ct_B = \left( \left[c_0+\dfrac{c_0'+\delta_0}{P}\right]_Q, \left[c_1+\dfrac{c_1'+\delta_1}{P}\right]_Q \right) ctB=([c0+Pc0′+δ0]Q,[c1+Pc1′+δ1]Q)
在 RNS 下执行,
- 将 [ c 1 ] Q [c_1]_Q [c1]Q 利用 RNS Basis Extension 扩展到 [ [ c 1 ] Q + u Q ] P [[c_1]_Q+uQ]_P [[c1]Q+uQ]P,其中的 ∥ u ∥ ∞ ≤ k / 2 \|u\|_\infty \le k/2 ∥u∥∞≤k/2 是 CRT 合成时的 Q Q Q-overflow
- 计算 [ c 1 ] P Q [c_1]_{PQ} [c1]PQ 和 k s A → B G H S ks_{A \to B}^{GHS} ksA→BGHS 的乘积,得到 [ c t B ′ ] P Q [ct_B']_{PQ} [ctB′]PQ
- 将 [ − t − 1 c t B ′ ] P [-t^{-1}ct_B']_P [−t−1ctB′]P 利用 RNS Basis Extension 扩展到 [ [ − t − 1 c t B ′ ] P + u ′ P ] Q [[-t^{-1}ct_B']_P+u'P]_Q [[−t−1ctB′]P+u′P]Q,其中 ∥ u ′ ∥ ∞ ≤ l / 2 \|u'\|_\infty \le l/2 ∥u′∥∞≤l/2
- 我们计算出了 P Q PQ PQ 下差距的近似值 δ ′ = δ + t u ′ P \delta'=\delta+tu'P δ′=δ+tu′P,再利用 Madulus-Switching / Scaling,计算出 [ c t B ] Q [ct_B]_Q [ctB]Q
其中的 u , u ′ u,u' u,u′ 可以通过 [BEHZ16] 和 [HPS19] 的技术来消除,但在这里它们都很小,仅对噪声增长有一个可忽略的贡献。
具体流程,以及对应的复杂度:
Hybrid
BV Key-Switch 的缺点是:密文扩张了 l l l 倍,需要的 NTT 数量较多。
GHS Key-Switch 的缺点是:模数增大了 P P P 倍,为了补偿安全损失,要么维度扩大两倍,要么乘法层数减少一半。
一般而言,混合方案的效率和噪声控制是表现更好的。使用一个相对较大的 radix-
w
w
w,使得数位
l
=
⌊
log
w
Q
⌉
+
1
l=\lfloor \log_w Q\rceil+1
l=⌊logwQ⌉+1 很小,以及一个较小规模的
P
≈
l
w
/
2
P \approx lw/2
P≈lw/2,
k
s
A
→
B
H
y
b
r
i
d
=
(
[
a
⃗
⋅
s
B
+
t
e
⃗
+
P
⋅
P
w
,
Q
(
s
A
)
]
P
Q
,
[
−
a
⃗
]
P
Q
)
ks_{A \to B}^{Hybrid} = ([\vec a \cdot s_B + t\vec e + P\cdot P_{w,Q}(s_A)]_{PQ}, [-\vec a]_{PQ})
ksA→BHybrid=([a⋅sB+te+P⋅Pw,Q(sA)]PQ,[−a]PQ)
计算流程是:
- 输入 c t A = ( c 0 , c 1 ) ∈ R Q 2 ct_A=(c_0,c_1) \in \mathcal R_Q^2 ctA=(c0,c1)∈RQ2,分解 c 1 c_1 c1 为 D w , Q ( c 1 ) ∈ R l D_{w,Q}(c_1) \in \mathcal R^l Dw,Q(c1)∈Rl
- 计算 c t B ′ = ( [ ⟨ D w , Q ( c 1 ) , k s 0 ⟩ ] P Q , [ ⟨ D w , Q ( c 1 ) , k s 1 ⟩ ] P Q ) ct_B' = ([\langle D_{w,Q}(c_1), ks_0\rangle]_{PQ}, [\langle D_{w,Q}(c_1), ks_1\rangle]_{PQ}) ctB′=([⟨Dw,Q(c1),ks0⟩]PQ,[⟨Dw,Q(c1),ks1⟩]PQ)
- 利用模切换将它除以 P P P 缩放到 Q Q Q 上,计算出 c t B = ( [ c 0 + ( c 0 ′ + δ 0 ) / P ] Q , [ c 1 + ( c 1 ′ + δ 1 ) / P ] Q ) ct_B=([c_0+(c_0'+\delta_0)/P]_Q, [c_1+(c_1'+\delta_1)/P]_Q) ctB=([c0+(c0′+δ0)/P]Q,[c1+(c1′+δ1)/P]Q)
对于 RNS 系统,使用 [BEHZ16] 的类似分解,将 Q Q Q 分为 Q 0 , ⋯ , Q d Q_0,\cdots,Q_d Q0,⋯,Qd,每个 Q i Q_i Qi 包含 α ≈ k / d \alpha\approx k/d α≈k/d 个小素数,简记 Q i ∗ = Q / Q i Q_i^*=Q/Q_i Qi∗=Q/Qi, Q ~ i = [ ( Q i ∗ ) − 1 ] Q i \tilde Q_i=[(Q_i^*)^{-1}]_{Q_i} Q~i=[(Qi∗)−1]Qi
分解函数就是
D
~
Q
(
a
)
=
(
[
a
]
Q
1
,
⋯
,
[
a
]
Q
d
)
∈
R
d
\tilde D_Q(a)=([a]_{Q_1},\cdots,[a]_{Q_d}) \in \mathcal R^d
D~Q(a)=([a]Q1,⋯,[a]Qd)∈Rd,幂次函数定义为
P
~
Q
(
a
)
=
(
[
s
B
Q
i
∗
Q
~
i
]
Q
,
⋯
,
[
s
B
Q
i
∗
Q
~
i
]
Q
)
∈
R
Q
d
\tilde P_Q(a) = \left( \left[s_B Q_i^*\tilde Q_i\right]_{Q}, \cdots, \left[s_B Q_i^*\tilde Q_i\right]_{Q} \right) \in \mathcal R^d_Q
P~Q(a)=([sBQi∗Q~i]Q,⋯,[sBQi∗Q~i]Q)∈RQd
那么,秘钥切换秘钥为:
k
s
A
→
B
R
N
S
−
H
y
b
r
i
d
=
(
[
a
⃗
⋅
s
B
+
t
e
⃗
+
P
⋅
P
~
Q
(
s
B
)
]
P
Q
,
[
−
a
⃗
]
P
Q
)
ks_{A\to B}^{RNS-Hybrid} = ([\vec a \cdot s_B + t\vec e + P \cdot \tilde P_Q(s_B)]_{PQ}, [-\vec a]_{PQ})
ksA→BRNS−Hybrid=([a⋅sB+te+P⋅P~Q(sB)]PQ,[−a]PQ)
计算步骤就是 RNS-BV 和 RNS-GHS 的恰当组合,
- 分解 c 1 c_1 c1 为 D ~ Q ( c 1 ) \tilde D_Q(c_1) D~Q(c1),并扩展到 P Q PQ PQ
- 在 P Q PQ PQ 上计算出 c t B ′ ct_B' ctB′
- 缩放到 Q Q Q,再加上 c 0 c_0 c0,得到 c t B ct_B ctB
具体流程,以及对应的复杂度:
Complexities and Size
GHS 选取:BFV 的 k ≈ l k \approx l k≈l,BGV 的 k ′ ≈ l ′ k' \approx l' k′≈l′
Hybrid 选取:BFV 的 α ≈ k , d α ≈ l \alpha \approx k, d\alpha \approx l α≈k,dα≈l,BGV 的 α ′ ≈ k ′ , d α ′ ≈ l ′ \alpha' \approx k', d\alpha' \approx l' α′≈k′,dα′≈l′
复杂度为: