参考文献:
-
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.
-
CP16\] Crockett E, Peikert C. Λολ: Functional Lattice Cryptography\[C\]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016: 993-1005.
-
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.
文章目录
- [RNS Basis Extension](#RNS Basis Extension)
-
- [γ \gamma γ-correction technique](#γ \gamma γ-correction technique)
- [Retrieve the Overflow](#Retrieve the Overflow)
- [Modulus-Switching and Scaling in RNS](#Modulus-Switching and Scaling in RNS)
-
- [Simple Reduction](#Simple Reduction)
- [Modulus-Switching for BGV](#Modulus-Switching for BGV)
- [Scaling for BFV](#Scaling for BFV)
-
- [Simple scaling](#Simple scaling)
- [Complex scaling](#Complex scaling)
- [Scaling between Arbitrary RNS Bases](#Scaling between Arbitrary RNS Bases)
- [Key-Switch in RNS](#Key-Switch in RNS)
-
- Brakerski-Vaikuntanathan
- Gentry-Halevi-Smart
- Hybrid
- [Complexities and Size](#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 实现](https://blog.csdn.net/weixin_44885334/article/details/133277268),对于 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 δ 容易计算,算法如下: 1. 输入 c ( m o d Q k ) c \\pmod{Q_k} c(modQk) 的 RNS 表示(加密了 \[ m \] t \[m\]_t \[m\]t) 2. 先计算 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ˉ 3. 我们计算差距 δ ∈ \[ − 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) 4. 计算出 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) 5. 最后计算整除 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 6. 输出 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) 缩放步骤为: 1. 使用单精度**整数指令** ,计算 w = \[ ∑ i x i ⋅ ω i \] t w=\[\\sum_i x_i \\cdot \\omega_{i}\]_{t} w=\[∑ixi⋅ωi\]t 2. 使用单精度**浮点指令** ,计算 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 3. 合并为 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 抽象地,这可以分为两步完成, 1. 利用 **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′ 是不取模的结果) 2. 利用 **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 秘钥切换程序是: 1. 先在 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) 2. 然后计算 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 3. 将 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 下执行, 1. 将 \[ 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 2. 计算 \[ 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 3. 将 \[ − 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 4. 我们计算出了 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) 计算流程是: 1. 输入 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 2. 计算 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) 3. 利用模切换将它除以 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 的恰当组合, 1. 分解 c 1 c_1 c1 为 D \~ Q ( c 1 ) \\tilde D_Q(c_1) D\~Q(c1),并扩展到 P Q PQ PQ 2. 在 P Q PQ PQ 上计算出 c t B ′ ct_B' ctB′ 3. 缩放到 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′ 复杂度为: 