Full-RNS BGV/BFV

参考文献:

  1. [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.
  2. [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.
  3. [CP16] Crockett E, Peikert C. Λολ: Functional Lattice Cryptography[C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016: 993-1005.
  4. [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.
  5. [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.
  6. [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=q1qi,集合 { q i } \{q_i\} {qi} 称为 RNS basis,它们的大小至多为 64 64 64 比特。我们希望 FHE 的全部运算都是单精度的(现代计算机的机器字),也就是全部运算都在 RNS 下完成,而不需要多精度算术。

不同的 RNS 之间的转换,将环元素 a ∈ R Q a \in \mathcal R_Q aRQ 从模数 Q = q 1 ⋯ q k Q=q_1\cdots q_k Q=q1qk 下的 [ a ] Q [a]_Q [a]Q 转换到模数 P = p 1 ⋯ p l P=p_1\cdots p_l P=p1pl 下的 [ [ 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=1k[a(qiQ)1]qiqiQ(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} qiq~i1(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[aq~i]qiqi=[a]Q+uQZ
其中的 ∥ u ∥ ∞ ≤ k / 2 \|u\|_\infty \le k/2 uk/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+uQ]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]QRP
因为上述运算是整除法,因此可以用模乘逆元替代, ( 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)Q1(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/Pm+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)[Q1]P[[γPa]Q+uQ]γP[Q1]γPQγP[a]Quγ(m+Pr)+QγPeu
γ \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γPeu]γ=QγPeuR
于是,纠错方式为:
[ 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γPeu]P[QγPeu]γ)[γ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=Qi[aq~i]qiqi=i=1kqi[aq~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[aq~i]qiqi)uQ,纠错方式为:
[ [ 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]

  1. 输入 [ 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
  2. 使用单精度整数指令,计算 y i = [ a i ⋅ q ~ i ] q i y_i=[a_i \cdot \tilde q_i]_{q_i} yi=[aiq~i]qi
  3. 使用单精度浮点指令,计算 z i = y i / q i z_i = y_i/q_i zi=yi/qi
  4. 计算出 u = ⌊ ∑ i z i ⌉ ∈ Z k u=\lfloor \sum_i z_i \rceil \in\mathbb Z_k u=iziZk
  5. 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)
  6. 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)
  7. 纠正错误 A j = A j ′ − u ⋅ [ Q ] p j A_j=A_j' - u \cdot [Q]_{p_j} Aj=Aju[Q]pj
  8. 输出 [ 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} ϵ<k253。我们定义 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} xZPQ 的 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 Px(易知 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=([x1P]q1,,[xkP]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) 导致实现简单。对于一般的明文模数 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 cRQk2,我们计算特殊的 c † ∈ R 2 c^\dagger \in \mathcal R^2 cR2(系数在 Z \mathbb Z Z 上),满足

  • 解密条件: c † ≡ c ⋅ q k ( m o d t ) c^\dagger \equiv c \cdot q_k \pmod t ccqk(modt),那么 c ′ = c † / q k = [ c † ⋅ q k − 1 ] Q k − 1 c'=c^\dagger/q_k=[c^\dagger \cdot q_k^{-1}]_{Q_{k-1}} c=c/qk=[cqk1]Qk1 加密了原始消息 [ m ] t [m]_t [m]t

  • 噪声条件: δ = c † − c \delta=c^\dagger-c δ=cc 的范数较小

  • 整除条件: q k ∣ c † q_k\mid c^\dagger qkc,注意 Z \mathbb Z Z 上的整除,恰好就是 Z Q k − 1 \mathbb Z_{Q_{k-1}} ZQk1 上的乘以逆元,

我们希望先计算出小差距 δ \delta δ 满足 δ ≡ ( q k − 1 ) ⋅ c ( m o d t ) \delta \equiv (q_k-1) \cdot c \pmod t δ(qk1)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] 转而计算如下密文([GHS12] 的附录里写的太简略了,令人难以理解),
c ^ = [ q k ] t ⋅ c ( m o d Q k ) \hat c=[q_k]_t \cdot c \pmod{Q_k} c^=[qk]tc(modQk)
它加密了扭曲的消息 [ q k ] t ⋅ m [q_k]_t \cdot m [qk]tm(对于 t = 2 t=2 t=2 特殊情况,恰好不扭转),并且噪声增长了 q k q_k qk,寻找 c † c^\dagger c 的条件改变为:

  • 解密条件: c † ≡ c ^ ( m o d t ) c^\dagger \equiv \hat c \pmod t cc^(modt),它使得 [ [ c † s ] Q k ] t = [ q k m ] t [[c^\dagger s]_{Q_k}]_t = [q_km]_t [[cs]Qk]t=[qkm]t
  • 噪声条件: δ = c † − c ^ \delta=c^\dagger-\hat c δ=cc^,注意这儿的变化导致 δ ≡ 0 ( m o d t ) \delta \equiv 0 \pmod t δ0(modt),从而 δ \delta δ 就是 t t t 的倍数(不再需要 [ c ] t [c]_t [c]t 的知识
  • 整除条件: q k ∣ c † q_k \mid c^\dagger qkc,计算出 c ′ = c † / q k c'=c^\dagger/q_k c=c/qk,它加密的是原始消息 [ [ c ′ s ] Q k − 1 ] t = [ [ q k − 1 c † s ] Q k − 1 ] t = [ m ] t [[c's]_{Q_{k-1}}]_t = [[q_k^{-1}c^\dagger s]_{Q_{k-1}}]_t = [m]_t [[cs]Qk1]t=[[qk1cs]Qk1]t=[m]t(这是我理解的,应该是吧,原文中没详细写)

此时的 δ \delta δ 容易计算(因为 [ δ ] t = 0 [\delta]_t=0 [δ]t=0 已知),算法如下:

  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]tc 的 RNS 表示,然后计算 [ c ^ ] q k [\hat c]_{q_k} [c^]qk 的系数表示 c ˉ \bar c cˉ
  3. 我们计算差距 δ ∈ [ − q k t / 2 , q k t / 2 ) N × 2 \delta \in [-q_kt/2, q_kt/2)^{N \times 2} δ[qkt/2,qkt/2)N×2,使得它满足 δ ≡ 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),确切地说我们设置 δ = t [ − c ˉ t − 1 ] q k \delta = t[-\bar ct^{-1}]_{q_k} δ=t[cˉt1]qk
  4. 计算出 c † = c ^ + δ c^\dagger=\hat c+\delta c=c^+δ(在模数 Q k Q_k Qk 下),易知 c † ≡ c ^ ( m o d t ) c^\dagger \equiv \hat c \pmod t cc^(modt)(解密相同)以及 c † ≡ 0 ( m o d q k ) c^\dagger \equiv 0 \pmod{q_k} c0(modqk)(整除性)
  5. 最后计算整除 c ′ = c † / q k ( m o d Q k − 1 ) c'=c^\dagger/q_k \pmod{Q_{k-1}} c=c/qk(modQk1),通过各分量乘以逆元 [ q k − 1 ] q i , ∀ i ≤ k − 1 [q_k^{-1}]_{q_i},\forall i\le k-1 [qk1]qi,ik1
  6. 输出 c ′ ( m o d Q k − 1 ) c' \pmod{Q_{k-1}} c(modQk1) 的 RNS 表示,它加密了 c ^ \hat c c^ 所加密的消息 [ m ] t [m]_t [m]t

其实可以不要求模切换的结果依旧是原始消息的加密:

  • 噪声条件改为 δ = c † − c \delta=c^\dagger-c δ=cc
  • 解密条件改为 c † ≡ c ( m o d t ) c^\dagger \equiv c \pmod t cc(modt)(即 c + δ ≡ c ( m o d t ) c+\delta \equiv c \pmod{t} c+δc(modt)),
  • 并使得 q ∣ c † q \mid c^\dagger qc(即 c + δ ≡ 0 ( m o d q ) c+\delta \equiv 0 \pmod{q} c+δ0(modq)

任意明文模数 t ≥ 2 t \ge 2 t2 的模切换算法为:

  1. 输入 [ m ] t [m]_t [m]t 的密文 c = ( c 0 , c 1 ) ∈ R Q c=(c_0,c_1) \in \mathcal R_{Q} c=(c0,c1)RQ,噪声是 v v v,从 Q Q Q 切换到 Q ′ Q' Q,简记 q = Q / Q ′ q=Q/Q' q=Q/Q(可以跨越多个 level)
  2. 计算差距 δ = ( δ 0 = t [ − t − 1 c 0 ] q , δ 1 = t [ − t − 1 c 1 ] q ) \delta = (\delta_0=t[-t^{-1}c_0]_q, \delta_1=t[-t^{-1}c_1]_q) δ=(δ0=t[t1c0]q,δ1=t[t1c1]q),它满足 δ ≡ 0 ( m o d t ) \delta \equiv 0 \pmod t δ0(modt) 以及 δ ≡ − c ( m o d q ) \delta \equiv -c \pmod q δc(modq),最后将 δ \delta δ 放到 Q Q Q 上(在 RNS 下并不平凡,需要 RNS Basis Extension
  3. 那么 c † = [ c + δ ] Q ∈ [ − Q / 2 , Q / 2 ) c^\dagger = [c+\delta]_{Q} \in [-Q/2,Q/2) c=[c+δ]Q[Q/2,Q/2) 恰好可被 q q q整除”(RNS 下基 q q q 对应的分量都是零),将它 Lift 到 Z \mathbb Z Z 上,除法结果落在 [ − Q ′ / 2 , Q ′ / 2 ) [-Q'/2,Q'/2) [Q/2,Q/2) 内,因此可以用 “乘以逆元” 来替代(RNS 下基 Q ′ Q' Q 对应的分量上的逆元, gcd ⁡ ( q , Q ′ ) = 1 \gcd(q,Q')=1 gcd(q,Q)=1),我们计算出 c ′ = [ c † ⋅ q − 1 ] Q ′ c' = [c^\dagger \cdot q^{-1}]_{Q'} c=[cq1]Q,它恰好是 c † / q ∈ Z c^\dagger/q \in \mathbb Z c/qZ 的结果(不模 Q ′ Q' Q 的)
  4. 输出 c ′ ∈ R Q ′ c' \in \mathcal R_{Q'} cRQ,它加密的是扭曲的消息 [ m ⋅ q − 1 ] t [m \cdot q^{-1}]_t [mq1]t,噪声大约缩放了 1 / q 1/q 1/q 成为 v / q + v m s v/q+v_{ms} v/q+vms(注意 [ c † ⋅ q − 1 ] Q ′ [c^\dagger \cdot q^{-1}]_{Q'} [cq1]Q 等价于整除法,这个标量乘法使得噪声增长为 q − 1 q^{-1} q1 倍,实际上反而降低了噪声的绝对大小

我们需要实时追踪不同密文的缩放因子(简单的模约简并不扭曲消息),两个密文运算之前首先要扭转到相同的因子。

Scaling for BFV

[HPS19] 给出了 BFV 的两种缩放程序,前者可用于解密,后者用于 GHS 秘钥切换。

Simple scaling

输入: x ∈ Z Q x \in \mathbb Z_Q xZQ 的 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/QxZt

类似 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=Qtx=Qti=1kxiqiq~iut=i=1kxi(qitq~i)ut
我们预计算其中的常数,分为整数小数两部分,
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,ωiZt,θ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θiZk
  3. 合并为 y = [ w + v ] t y=[w+v]_{t} y=[w+v]t

同样的,实际计算时存在误差:小数部分使用浮点表示 θ i ∗ = θ i + ϵ i , ∣ ϵ i ∣ < ϵ \theta_i^*=\theta_i+\epsilon_i, |\epsilon_i|<\epsilon θi=θi+ϵi,ϵi<ϵ(如果使用 IEEE-754 double 则误差规模是 ϵ = 2 − 53 \epsilon=2^{-53} ϵ=253),计算出的 v ∗ = ⌊ ∑ i = 1 k x i ( ω i + θ i ∗ ) ⌉ v^*=\left\lfloor \sum_{i=1}^k x_i (\omega_{i}+\theta_{i}^*) \right\rceil v=i=1kxi(ωi+θi) 可能会和 v = ⌊ ∑ i = 1 k x i ( ω i + θ i ) ⌉ v=\left\lfloor \sum_{i=1}^k x_i (\omega_{i}+\theta_{i}) \right\rceil v=i=1kxi(ωi+θi) 有差异,累计误差为 ∑ i x i ϵ i < ϵ / 2 ⋅ ∑ i q i \sum_i x_i \epsilon_{i} < \epsilon/2 \cdot \sum_i q_i ixiϵi<ϵ/2iqi,其中 x i = [ x ] q i ∈ [ − q i / 2 , q i / 2 ) x_i=[x]_{q_i} \in [-q_i/2,q_i/2) xi=[x]qi[qi/2,qi/2)

假如我们约束 y = ⌊ t Q ⋅ x ⌉ y = \left\lfloor \frac{t}{Q} \cdot x \right\rceil y=Qtx 满足 y ( m o d Z ) ∈ [ − 1 / 4 , 1 / 4 ] y \pmod{\mathbb Z} \in [-1/4,1/4] y(modZ)[1/4,1/4](控制密文中的噪声规模小于 Q / 4 t Q/4t Q/4t,而非通常的 Q / 2 t Q/2t Q/2t),那么只要累积误差满足 ∣ ∑ i x i ϵ i ∣ < 1 / 4 |\sum_i x_i \epsilon_i| < 1/4 ixiϵi<1/4(精度足够高的浮点数),就总是可以正确舍入( v = v ∗ v=v^* v=v)。可能 IEEE-754 double 精度不够,需要使用不标准的 C/C++ long double 或者高精度算术。

Complex scaling

输入: x ∈ Z P Q x \in \mathbb Z_{PQ} xZPQ 的 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/QxZQ

抽象地,这可以分为两步完成,

  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/Qx=t/QxZtP,丢弃 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/Qx[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') Pgcd(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=qiP,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=Qtx=Qt(i=1kxiQiQ~i+j=1lxjPjP~j)utP=i=1kxi(qitQ~iP)+j=1lxj(tP~jpj)utP
计算 [ 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=1kxi(qitQ~iP)+xj(tP~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,ωiZP,θ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 的步骤为:

  1. 使用浮点数指令,计算 v = ⌊ ∑ i x i θ i ⌉ ∈ Z k v=\lfloor \sum_i x_i\theta_i \rceil \in \mathbb Z_k v=ixiθiZk,这个是共用的
  2. 使用整数指令,计算 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) 基本消除
  3. 合并为 [ 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} xZQ 的 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[Q1]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=1k[Px]qi[q~i]qiqiuQ
因此最终结果的 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[Q1]pj=[ui=1k[Px]qi[q~i]qiqi1]pj
其中 ∥ u ∥ ∞ ≤ k / 2 \|u\|_\infty \le k/2 uk/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} ksAB
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) ksAB:=(ks0=[asB+te+sA]Q,ks1=[a]Q)
秘钥切换就是同态线性解密,抽象描述为 c 0 + c 1 ⋅ E ( s A ) c_0+c_1 \cdot E(s_A) c0+c1E(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)+c1ksAB=([c0+c1ks0]Q,[c1ks1]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=[as+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+c1E(s)+c2E(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)+c2rlk=([c0+c2rlk0]Q,[c1+c2rlk1])
但是 c 1 c_1 c1 的规模相对于密文模数 Q Q Q 过大,导致秘钥切换中 k s A → B ks_{A \to B} ksAB 的噪声被大幅增长。有两种方法来控制噪声,分别是 [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/wl1]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 ksABBV:=(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=q1qk,简记 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 ksABRNSBV:=(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)=([aq1q~1]Q,[aq2q~2]Q,,[aqkq~k]Q)RQk

因此 [ c 1 ] Q [c_1]_Q [c1]Q 直接就是 D ( c 1 ) D(c_1) D(c1),于是节约了一些数乘运算。

具体流程,以及对应的复杂度:

Full-RNS BGV/BFV_第1张图片

Gentry-Halevi-Smart

[GHS12] 使用临时扩展技术,选取足够大的 P = p 1 ⋯ p l ≈ Q P=p_1\cdots p_l \approx Q P=p1plQ

秘钥切换秘钥为:
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} ksABGHS:=(ks0=[asB+te+PsA]PQ,ks1=[a]PQ)RPQ2
秘钥切换程序是:

  1. 先在 P Q PQ PQ 下计算 c 1 ⋅ E ( s A ) c_1 \cdot E(s_A) c1E(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=[c1ks0]PQ,c1=[c1ks1]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[t1c0]P,δ1=t[t1c1]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 uk/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} ksABGHS 的乘积,得到 [ c t B ′ ] P Q [ct_B']_{PQ} [ctB]PQ
  3. [ − t − 1 c t B ′ ] P [-t^{-1}ct_B']_P [t1ctB]P 利用 RNS Basis Extension 扩展到 [ [ − t − 1 c t B ′ ] P + u ′ P ] Q [[-t^{-1}ct_B']_P+u'P]_Q [[t1ctB]P+uP]Q,其中 ∥ u ′ ∥ ∞ ≤ l / 2 \|u'\|_\infty \le l/2 ul/2
  4. 我们计算出了 P Q PQ PQ 下差距的近似值 δ ′ = δ + t u ′ P \delta'=\delta+tu'P δ=δ+tuP,再利用 Madulus-Switching / Scaling,计算出 [ c t B ] Q [ct_B]_Q [ctB]Q

其中的 u , u ′ u,u' u,u 可以通过 [BEHZ16] 和 [HPS19] 的技术来消除,但在这里它们都很小,仅对噪声增长有一个可忽略的贡献。

具体流程,以及对应的复杂度:

Full-RNS BGV/BFV_第2张图片

Hybrid

BV Key-Switch 的缺点是:密文扩张了 l l l 倍,需要的 NTT 数量较多。GHS Key-Switch 的缺点是:模数增大了 P P P 倍,为了补偿安全损失,要么维度扩大两倍,要么乘法层数减少一半。[GHS12] 提出可以混合使用两者,做 tradeoff 性能。

一般而言,混合方案的效率和噪声控制是表现更好的。使用一个相对较大的 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 Plw/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}) ksABHybrid=([a sB+te +PPw,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)

你可能感兴趣的:(#,全同态加密,密码学,计算机,数学,数论,抽象代数)