前言

借鉴致远的文章学习同态加密,本文主要记录同态加密中近似计算思想,参考文献为 Jung Hee Cheon,Andrey Kim,Miran Kim 和 Yongsoo Song 的《Homomorphic Encryption for Arithmetic of Approximate Numbers》。传统的同态加密方案依赖于解密时的模运算来消除噪声。CKKS方案则截然不同:作者将噪声当作近似计算中固有的、可接受的误差。其核心思路是,只要噪声幅度远小于明文,便不会破坏有效数字的精度。为实现这一点,方案在加密前引入缩放因子以抬升明文,从而压制噪声的相对大小;随后,在密文运算中通过重缩放技术持续截断累积的低位噪声;最终,在解密后移除缩放因子,即可得到高精度的近似结果。



一、核心思想

下面从参数设置和噪声累积两个角度分析现有方法的局限性。

1. 现有方法

1.1. 参数设置方面的局限性

学术界在处理加密数据上的实数或浮点数运算时,主要采用三类方法:

类别 细节 缺陷
比特编码 将有理数放大为整数后转为二进制,每个比特单独加密。 同态乘法会使比特长度增加,为恢复原始精度需执行右移操作以丢弃低位比特。然而,由于每个密文仅承载 1 比特信息,哪怕只是对单个数值执行一次舍入,都要对多个密文进行复杂交互,计算成本极高。
大整数缩放 将定点数乘上一个缩放因子得到大整数,再将其作为多项式系数或直接作为明文,在明文模数较大的环上加密。 由于同态乘法会进一步放大缩放因子,必须同态地执行右移,通常依赖复杂的比特提取电路。此外,为保证计算正确性,明文模数 t t t 的比特长度必须随电路深度指数级增长,导致性能大幅下降。
大基表示 将定点数按基向量展开,各维度数字作为多项式系数。 此方法比比特编码更高效,但若要确保定点运算的精确性并避免进位错误,所需的明文模数 t t t 仍需随电路深度呈指数级增长,从而限制了整体效率。

局限性:从上面的介绍可以看出,现有方法为追求精确计算,导致计算复杂度或参数尺寸变得无法接受

1.2. 噪声累积方面的局限性

现有的同态方案可以分为两类:

类别 BGV - type FV - type
核心思想 将明文放在最低有效位,并通过模运算消除噪声。 通过缩放因子( q / t q/t q/t)将明文提升到最高有效位,再通过缩放取整消除噪声 。
方法示意 在这里插入图片描述 在这里插入图片描述
密文与密钥的关系 < c i , s k > = m i + t e i + I i q \left<c_i,sk \right>=m_i+te_i +I_iq ci,sk=mi+tei+Iiq < c i , s k > = ( q / t ) ⋅ m i + e i + I i q \left<c_i,sk \right>=(q/t)\cdot m_i+e_i +I_iq ci,sk=(q/t)mi+ei+Iiq
解密算法 [ [ < c i , s k > ] q ] t [[\left<c_i,sk \right>]_q]_t [[ci,sk]q]t ⌈ ( t / q ) ⋅ [ < c i , s k > ] q ⌋ \lceil (t/q)\cdot [\left<c_i,sk \right>]_q\rfloor ⌈(t/q)[ci,sk]q
解密成功的情况 ∣ e i ∣ ≪ q |e_i| \ll q eiq 时, m i + t e i < q m_i+te_i < q mi+tei<q ,则 [ m i + t e i ] q = m i + t e i [m_i+te_i]_q = m_i+te_i [mi+tei]q=mi+tei,解密算法有 [ [ < c i , s k > ] q ] t = [ [ m i + t e i + I i q ] q ] t = [ m i + t e i ] t = m i \begin{aligned}[[\left<c_i,sk \right>]_q]_t &= [[m_i+te_i+I_iq]_q]_t\\ &= [m_i+te_i]_t\\ &= m_i\\ \end{aligned} [[ci,sk]q]t=[[mi+tei+Iiq]q]t=[mi+tei]t=mi ∣ e i ∣ ≪ q |e_i| \ll q eiq 时, ( q / t ) ⋅ m i + e i < q (q/t)\cdot m_i+e_i< q (q/t)mi+ei<q ,则 [ ( q / t ) ⋅ m i + e i ] q = ( q / t ) ⋅ m i + e i [(q/t)\cdot m_i+e_i]_q = (q/t)\cdot m_i+e_i [(q/t)mi+ei]q=(q/t)mi+ei,解密算法有 ⌈ ( t / q ) ⋅ [ < c i , s k > ] q ⌋ = ⌈ ( t / q ) ⋅ [ ( q / t ) ⋅ m i + e i + I i q ] q ⌋ = ⌈ m i + ( t / q ) ⋅ e i ⌋ = m i \begin{aligned}\lceil (t/q)\cdot [\left<c_i,sk \right>]_q\rfloor &= \lceil (t/q)\cdot [(q/t)\cdot m_i+e_i +I_iq]_q\rfloor \\ &= \lceil m_i+ (t/q)\cdot e_i \rfloor \\ &= m_i \end{aligned} ⌈(t/q)[ci,sk]q=⌈(t/q)[(q/t)mi+ei+Iiq]q=mi+(t/q)ei=mi
解密失败的情况 ∣ e i ∣ ≈ q |e_i| \approx q eiq 时, m i + t e i > q m_i+te_i > q mi+tei>q ,则 [ m i + t e i ] q = m i + t e i − k q [m_i+te_i]_q = m_i+te_i-kq [mi+tei]q=mi+teikq,解密算法有 [ [ < c i , s k > ] q ] t = [ [ m i + t e i + I i q ] q ] t = [ m i − k q + t e i ] t = m i − k q \begin{aligned}[[\left<c_i,sk \right>]_q]_t &= [[m_i+te_i+I_iq]_q]_t\\ &= [m_i-kq+te_i]_t\\ &= m_i-kq\\ \end{aligned} [[ci,sk]q]t=[[mi+tei+Iiq]q]t=[mikq+tei]t=mikq ∣ e i ∣ ≈ q |e_i| \approx q eiq 时, ( q / t ) ⋅ m i + e i > q (q/t)\cdot m_i+e_i> q (q/t)mi+ei>q ,则 [ ( q / t ) ⋅ m i + e i ] q = ( q / t ) ⋅ m i + e i − k q [(q/t)\cdot m_i+e_i]_q = (q/t)\cdot m_i+e_i-kq [(q/t)mi+ei]q=(q/t)mi+eikq,解密算法有 ⌈ ( t / q ) ⋅ [ < c i , s k > ] q ⌋ = ⌈ ( t / q ) ⋅ [ ( q / t ) ⋅ m i + e i + I i q ] q ⌋ = ⌈ m i − k t + ( t / q ) ⋅ e i ⌋ = m i − k t \begin{aligned}\lceil (t/q)\cdot [\left<c_i,sk \right>]_q\rfloor &= \lceil (t/q)\cdot [(q/t)\cdot m_i+e_i +I_iq]_q\rfloor \\ &= \lceil m_i-kt+ (t/q)\cdot e_i \rfloor \\ &= m_i -kt\end{aligned} ⌈(t/q)[ci,sk]q=⌈(t/q)[(q/t)mi+ei+Iiq]q=mikt+(t/q)ei=mikt

局限性:从上述介绍可以看出,无论哪种方案,成功解密的前提都是 B ≪ q B\ll q Bq 。然而,在同态乘法过程中,现有方案的噪声项均以指数速度累积并逐渐逼近模数 q q q ,导致噪声项远大于明文值,在密文中主导最高有效位,从而解密失败。

2. 动机

现实世界中的数据往往伴随各种误差,例如测量过程中的观测误差、统计分析中的采样误差,以及计算机因有限精度表示而产生的舍入误差。因此,在实际计算中通常只保留原始数据的高位,并在此基础上进行近似运算。完成计算后,为了保持有效数字的位宽,会再次进行舍入,以去除不可靠的低位数据。类似的,CKKS方案将噪声视作近似计算中的固有误差,通过舍入操作消除最低有效位所包含的噪声,从而模拟浮点数的近似运算

3. 思想

只要噪声 e e e 足够小,解密结果 m ′ = m + e m' = m + e m=m+e 就可以看作原始明文 m m m 的一个高精度近似值,通过计算噪声上界可以评估近似精度。在同态计算过程中,要求 m + e m + e m+e 的绝对值始终小于模数 q q q,不然解密时的模 q q q 运算会约减 m + e m + e m+e 的值。同时,为了防止密文维度随乘法深度增长,将同态计算的中间值除以一个预定义的基数,通过丢弃部分低位消息来降低噪声并控制明文比特规模。利用这一思想,CKKS 成功地将密文模数 q q q 的大小从关于电路深度的指数级降为线性级别,同时在精度方面与明文的浮点数计算最多只有 1 比特差距。


二、核心方案

CKKS相当于一个插件,对现有算法进行两部分改装。

1. 编码与解码

1.1. 核心思想

相关基础知识见:分圆多项式

  • Step1:选择明文空间
    为了将多个明文数值(一个向量)加密到单个密文中,现有方法选择有限特征环 R t = Z t [ X ] / ( Φ M ( X ) ) R_t=\Z_t[X]/(\Phi_M(X)) Rt=Zt[X]/(ΦM(X)) 作为明文空间。根据中国剩余定理,环 R t R_t Rt 同构于多个有限域的乘积,因此环上的每个元素都包含 M M M 个独立的槽位,对该元素的同态操作等同于对多个槽位进行并行计算。相比之下,本文使用特征为 0 的环 R = Z [ X ] / ( Φ M ( X ) ) R=\Z[X]/(\Phi_M(X)) R=Z[X]/(ΦM(X)),利用等距环同构进行密文的并行同态运算。其中, Φ M ( X ) \Phi_M(X) ΦM(X) 是第 M M M 个分圆多项式,阶数为 N = ϕ ( Φ M ( x ) ) N=\phi(\Phi_M(x)) N=ϕ(ΦM(x)),则分圆多项式 Φ M ( X ) \Phi_M(X) ΦM(X) N N N 个本原单位根 ζ M 1 , ⋯   , ζ M N \zeta_M^1,\cdots,\zeta_M^N ζM1,,ζMN,并且存在共轭关系:
    ζ M j = ζ M M − j ‾ \zeta_M^j = \overline{\zeta_M^{M-j}} ζMj=ζMMj

环的特征:使得乘法单位元相加得 0 的最小乘法次数,若不存在则环的特征为 0。例如,分圆多项式环的特征为0,而模 t t t 下的分圆多项式环的特征为 t t t

  • Step2:将明文解码为消息
    通过如下流程可以将整数多项式环上的明文解码为复数向量空间上的原始消息:
    在这里插入图片描述
    现有一个明文 m ( x ) = ∑ j = 0 N − 1 m j ⋅ x j ∈ R m(x)=\sum_{j=0}^{N-1}m_j \cdot x^j\in R m(x)=j=0N1mjxjR ,在系数表示法下是一个 N N N 维向量 [ m 0 , ⋯   , m N − 1 ] [m_0,\cdots,m_{N-1}] [m0,,mN1] ,对其进行典范嵌入 σ : R → H \sigma:R\rightarrow \mathbb{H} σ:RH
    σ ( m ( x ) ) = [ m ( ζ M 1 ) , ⋯   , m ( ζ M N − 1 ) ] \sigma(m(x))=[m(\zeta_M^1),\cdots,m(\zeta_M^{N-1})] σ(m(x))=[m(ζM1),,m(ζMN1)] 映射后的结果 σ ( m ( x ) ) \sigma(m(x)) σ(m(x)) 可以看作将本原单位根 ζ M \zeta_M ζM 输入 m ( x ) m(x) m(x) 得到的点值表示,是空间 H = { z = ( z j ) j ∈ Z M ∗ ∣ z j = z − j ‾ } ⊆ C N \mathbb{H}=\{z=(z_j)_{j\in \Z^*_M}|z_j=\overline{z_{-j}} \} \subseteq \mathbb{C}^{N} H={z=(zj)jZMzj=zj}CN 下的一个 N N N 维复数向量。根据共轭复数的运算法则,我们知道
    m ( ζ M j ) = m ( ζ M M − j ‾ ) = m ( ζ M M − j ) ‾ m(\zeta_M^j)=m\bigg(\overline{\zeta_M^{M-j}}\bigg)=\overline{m(\zeta_M^{M-j})} m(ζMj)=m(ζMMj)=m(ζMMj) 因此,复数向量 σ ( m ( x ) ) \sigma(m(x)) σ(m(x)) 中有一半的元素可以通过共轭运算得到,我们可以进一步利用映射 π : H → C N / 2 \pi:\mathbb{H}\rightarrow \mathbb{C}^{N/2} π:HCN/2 将其长度压缩 N / 2 N/2 N/2 ,即
    z = π ( σ ( m ( x ) ) ) z = \pi(\sigma(m(x))) z=π(σ(m(x)))

  • Step3:将消息编码为明文
    编码过程与解码过程互逆:
    在这里插入图片描述
    对复数向量 z z z 进行逆映射 π − 1 \pi^{-1} π1 时,可能产生无限精度的小数值,但我们希望将其映射回整数多项式环上,因此需要取整操作。最简单的取整方法就是将每个复数的实部和虚部都四舍五入到最近的整数,即将复数舍入到最近的高斯整数。因此,选择高斯整数环 Z [ i ] \Z[i] Z[i] 作为典范映射的空间。此外,为了减小取整操作带来的截断误差,引入缩放因子 Δ ≥ 1 \Delta\geq 1 Δ1,将部分小数值扩大为整数,以保留对应的精度。对应的,在解码阶段需要除去 Δ \Delta Δ

高斯整数:形如 a + b i a+bi a+bi 的复数,其中 a , b ∈ Z a,b\in \Z a,bZ

1.2. 核心设计

算法 细节
编码算法 Δ \Delta Δ 为缩放因子,则通过以下步骤将 N / 2 N/2 N/2 维的复数向量 z = [ z i ] i ∈ T z=[z_i]_{i\in T} z=[zi]iT 编码为明文 m ( x ) m(x) m(x) m ( x ) = σ − 1 ( ⌊ Δ ⋅ π − 1 ( z ) ⌉ σ ( R ) ) ∈ R m(x)=\sigma^{-1}(\lfloor\Delta\cdot\pi^{-1}(z)\rceil_{\sigma(R)})\in R m(x)=σ1(⌊Δπ1(z)σ(R))R
解码算法 Δ \Delta Δ 为缩放因子,则通过以下步骤将明文 m ( x ) m(x) m(x) 解码为 N / 2 N/2 N/2 维的复数向量 z = [ z i ] i ∈ T z=[z_i]_{i\in T} z=[zi]iT z = π ( σ ( Δ − 1 ⋅ m ( x ) ) ) z = \pi(\sigma(\Delta^{-1}\cdot m(x))) z=π(σ(Δ1m(x))) 其中,对于 z z z 的第 j ∈ T j\in T jT 维是 z j = Δ − 1 ⋅ m ( ζ M j ) z_j=\Delta^{-1}\cdot m(\zeta_M^j) zj=Δ1m(ζMj)

2. 重缩放

2.1. 核心思想

在没有舍入的情况下,两个 k k k 比特的数相乘,结果会变为 2 k 2k 2k 比特,例如二进制乘法 11 × 11 = 1001 11\times 11 = 1001 11×11=1001 。经过 L L L 次乘法后,运算结果有 2 L ⋅ k 2^L\cdot k 2Lk 比特。为了容纳这种指数级别的噪声增长,明文模数也要设置为指数级别位数。针对这一问题,文章提出了重缩放算法,通过对密文除以一个预定义基数,实现明文和噪声幅度的缩减,在控制明文比特位数的同时舍去了小噪声

2.2. 核心设计

算法 细节
重缩放算法 为了将第 l l l 层的密文 c ∈ R q l k c\in R^k_{q_l} cRqlk 缩减到第 l ′ < l l'<l l<l 层,进行如下操作 c ′ = ⌊ q l ′ q l ⋅ c ⌉ ∈ R q l ′ k c'=\lfloor \frac{q_{l'}}{q_l}\cdot c\rceil \in R^k_{q_{l'}} c=qlqlcRqlk

假设重缩放操作引入的阶段误差为 τ = q l ′ q l ⋅ c − c ′ \tau = \frac{q_{l'}}{q_l}\cdot c -c' τ=qlqlcc ,则重缩放后密文有:
< c ′ , s k > = < q l ′ q l ⋅ c − τ , s k > = q l ′ q l ⋅ < c , s k > − < τ , s k > = q l ′ q l ⋅ ( m + e ) − < τ , s k > = q l ′ q l ⋅ m + ( q l ′ q l ⋅ e − < τ , s k > ) \begin{aligned} \left<c',sk \right> &= \left< \frac{q_{l'}}{q_l}\cdot c -\tau,sk \right> \\ &=\frac{q_{l'}}{q_l}\cdot \left< c,sk \right> - \left< \tau,sk \right> \\ &=\frac{q_{l'}}{q_l}\cdot (m+e) - \left< \tau,sk \right> \\ &=\frac{q_{l'}}{q_l}\cdot m+ ( \frac{q_{l'}}{q_l}\cdot e- \left< \tau,sk \right> )\\ \end{aligned} c,sk=qlqlcτ,sk=qlqlc,skτ,sk=qlql(m+e)τ,sk=qlqlm+(qlqleτ,sk) 可以看出,重缩放同时减小了明文与噪声的幅度。

2.3. 算法对比

重缩放算法与模切换算法很像,下面对比这两个操作:

算法 重缩放 模切换
图示 在这里插入图片描述 在这里插入图片描述
算法前的密文 < c , s k > = m + e m o d    q l \left<c,sk \right> = m+e \mod q_l c,sk=m+emodql < c , s k > = m + e m o d    q l \left<c,sk \right> = m+e \mod q_l c,sk=m+emodql
算法后的密文 < c ′ , s k > = q l ′ q l ⋅ m + e ′ m o d    q l ′ \left<c',sk \right> = \frac{q_{l'}}{q_l}\cdot m+e' \mod q_{l'} c,sk=qlqlm+emodql < c , s k > = m + e ′ m o d    q l ′ \left<c,sk \right> = m+e' \mod q_{l'} c,sk=m+emodql
差距 重缩放后,模数减小,明文幅度减小,并且位于最低有效位的噪声也被舍去 模切换后,模数减小,明文幅度不变,噪声减小

3. 槽置换

相关基础知识见:数域
CKKS 方案将多个明文打包到一个密文进行批处理,但是后续计算可能需要置换明文槽的位置。为此,利用伽罗瓦自同构实现。对于明文槽的置换流程如下:

  • Step1:为了将槽位 i i i 中的明文移至槽位 j j j ,首先计算 k = j − 1 ⋅ i m o d    M k=j^{-1}\cdot i \mod M k=j1imodM
  • Step2:使用伽罗瓦同构对明文 m ( x ) m(x) m(x) 进行映射 ϕ \phi ϕ ,如下 m ′ ( x ) = ϕ ( m ( x ) ) = m ( x k ) = [ ( ζ M 1 ) k , ⋯   , ( ζ M N ) k ] = [ ζ M k , ⋯   , ζ M N ⋅ k ] m'(x) =\phi(m(x))= m(x^k)=[(\zeta_M^1)^k,\cdots,(\zeta_M^N)^k] = [\zeta_M^k,\cdots,\zeta_M^{N\cdot k}] m(x)=ϕ(m(x))=m(xk)=[(ζM1)k,,(ζMN)k]=[ζMk,,ζMNk]

同理,可以对密文槽进行置换,则置换后的密文 ϕ ( c ) \phi(c) ϕ(c) 对应的明文是 ϕ ( m ) \phi(m) ϕ(m) ,私钥是 ϕ ( s k ) \phi(sk) ϕ(sk) 。这里需要注意的是,置换后密文私钥发生改变,但是整个同态计算都需要在统一的私钥 s k sk sk 下计算。因此,需要提前生成切换密钥,用于将 ϕ ( s k ) \phi(sk) ϕ(sk) 切换为 s k sk sk


二、方案实现

CKKS算法可以用于改进现有的基于环 R R R 的算法,下面以 BGV 方案为例,讲解其 CKKS 版本。

1. 方案描述

相关基础知识见:离散高斯分布

算法 细节
参数设置 安全参数: λ \lambda λ
缩放因子: p > 0 p>0 p>0
模数: q 0 q_0 q0
模数链: q l ∈ ( 0 , L ] = p l ⋅ q 0 q_{l\in(0,L]}=p^l\cdot q_0 ql(0,L]=plq0 ,从第 L L L 层开始使用
分圆多项式次数: M = M ( λ , q L ) M=M(\lambda,q_L) M=M(λ,qL)
噪声方差: σ 2 \sigma ^2 σ2
整数: P = P ( λ , q L ) P=P(\lambda,q_L) P=P(λ,qL) h = h ( λ , q L ) h=h(\lambda,q_L) h=h(λ,qL)
密钥生成 私钥:首先从 { − 1 , 0 , 1 } N \{-1,0,1\}^N {1,0,1}N 中采样 N N N 维多项式 s s s ,则私钥为 s k = ( 1 , s ) sk=(1,s) sk=(1,s) 在采样 s s s 时要保证恰好有 h h h 个非零系数,这样私钥较为稀疏且范数较小,有利于控制噪声增长,并且稀疏张量的运算更快。
公钥:随机采样多项式 a ∈ R q L a\in R_{q_L} aRqL 和噪声多项式 e e e ,其中噪声多项式的每一项独立取自方差为 σ 2 \sigma ^2 σ2 的离散高斯分布,则 公钥 p k = ( a , b ) pk=(a,b) pk=(a,b) 满足 b = − a s + e m o d    q L b=-as+e \mod q_L b=as+emodqL
评估密钥:随机采样多项式 a ′ ∈ R P ⋅ q L a'\in R_{P\cdot q_L} aRPqL 和噪声多项式 e ′ e' e ,其中噪声多项式的每一项独立取自方差为 σ 2 \sigma ^2 σ2 的离散高斯分布,则 评估密钥 e v k = ( a ′ , b ′ ) evk=(a',b') evk=(a,b) 满足 b = − a ′ s + e ′ + P s 2 m o d    ( P ⋅ q L ) b=-a's+e'+Ps^2 \mod (P\cdot q_L) b=as+e+Ps2mod(PqL)
编码算法 Δ \Delta Δ 为缩放因子,将高斯整数环 Z [ i ] N / 2 \Z[i]^{N/2} Z[i]N/2 中的一个 N / 2 N/2 N/2 维复数向量 z = [ z i ] i ∈ T z=[z_i]_{i\in T} z=[zi]iT 编码为明文 m ( x ) m(x) m(x) m ( x ) = σ − 1 ( ⌊ Δ ⋅ π − 1 ( z ) ⌉ σ ( R ) ) m(x)=\sigma^{-1}(\lfloor\Delta\cdot\pi^{-1}(z)\rceil_{\sigma(R)}) m(x)=σ1(⌊Δπ1(z)σ(R)) 注意,加密前先编码
解码算法 Δ \Delta Δ 为缩放因子,将明文 m ( x ) ∈ R m(x) \in R m(x)R 解码为高斯整数环 Z [ i ] N / 2 \Z[i]^{N/2} Z[i]N/2 中的复数向量 z = [ z i ] i ∈ T z=[z_i]_{i\in T} z=[zi]iT z = π ( σ ( Δ − 1 ⋅ m ( x ) ) ) z = \pi(\sigma(\Delta^{-1}\cdot m(x))) z=π(σ(Δ1m(x))) 其中,对于 z z z 的第 j ∈ T j\in T jT 维是 z j = Δ − 1 ⋅ m ( ζ M j ) z_j=\Delta^{-1}\cdot m(\zeta_M^j) zj=Δ1m(ζMj) 。注意,解密后要解码
加密算法 随机采样随机多项式 v v v ,和噪声向量 e 0 , e 1 e_0,e_1 e0,e1 ,则明文 m m m 被加密为: c = v ⋅ p k + ( m + e 0 , e 1 ) m o d    q L c=v \cdot pk + (m + e_0,e_1) \mod q_L c=vpk+(m+e0,e1)modqL 其中,噪声多项式的每一项独立取自方差为 σ 2 \sigma ^2 σ2 的离散高斯分布。同时,为确保 IND-CPA 安全性,即同一个明文加密两次会产生两个看起来不相关的密文,在采样随机多项式 v v v 时引入随机性,以概率 ρ / 2 \rho/2 ρ/2 取 +1,以概率 ρ / 2 \rho/2 ρ/2 取 -1,以概率 1 − ρ 1-\rho 1ρ 取 0,此时 v v v 的汉明重量是一个围绕 ρ N \rho N ρN 的随机变量。本文设置 ρ = 0.5 \rho=0.5 ρ=0.5
解密算法 对于第 l l l 层密文 c = ( a , b ) c=(a,b) c=(a,b) m = a ⋅ s + b m o d    q l m = a\cdot s+b \mod q_l m=as+bmodql
同态加法 对于密文 c 1 , c 2 ∈ R q l 2 c_1,c_2 \in R_{q_l}^2 c1,c2Rql2 c a d d = c 1 + c 2 m o d    q l c_{add} = c_1+c_2 \mod q_l cadd=c1+c2modql 特别的,如果两个密文不在同一层,需要先用换模算法将高层密文降到低层。
同态乘法 对于密文 c 1 = ( a 1 , b 1 ) , c 2 = ( a 2 , b 2 ) ∈ R q l 2 c_1=(a_1,b_1),c_2=(a_2,b_2) \in R_{q_l}^2 c1=(a1,b1),c2=(a2,b2)Rql2 ,计算 ( d 0 , d 1 , d 2 ) = ( b 1 b 2 , a 1 b 2 + a 2 b 1 , a 1 a 2 ) ( m o d q l ) (d_0,d_1,d_2)=(b_1b_2,a_1b_2+a_2b_1,a_1a_2) \pmod {q_l} (d0,d1,d2)=(b1b2,a1b2+a2b1,a1a2)(modql) ,则 c m u l t = ( d 0 + d 1 ) + ⌊ P − 1 ⋅ d 2 ⋅ e v k ⌉ m o d    q l c_{mult} = (d_0+d_1)+\lfloor P^{-1}\cdot d_2\cdot evk\rceil \mod q_l cmult=(d0+d1)+P1d2evkmodql
重缩放算法 对于第 l l l 层密文 c ∈ R q l 2 c \in R_{q_l}^2 cRql2 c ′ = ⌊ q l ′ q l ⋅ c ⌉ m o d    q l ′ c'=\lfloor \frac{q_{l'}}{q_l}\cdot c\rceil \mod q_{l'} c=qlqlcmodql

2. 噪声分析

2.1. 绝对误差

在这里插入图片描述

  • 编码与加密:刚加密完的密文噪声上界为 B c l e a n = 8 2 σ N + 6 σ N + 16 σ h N B_{clean}=8\sqrt{2}\sigma N+6\sigma \sqrt{N}+16\sigma \sqrt{hN} Bclean=82 σN+6σN +16σhN ,当缩放因子为 Δ > N + 2 B c l e a n \Delta >N+2B_{clean} Δ>N+2Bclean 时可成功解密。
  • 重缩放 B s c a l e = N / 3 ⋅ ( 3 + 8 h ) B_{scale}=\sqrt{N/3}\cdot(3+8 \sqrt{h}) Bscale=N/3 (3+8h )
  • 同态乘法 B m u l t = P − 1 ⋅ q l ⋅ 8 σ N / 3 + B s c a l e B_{mult}=P^{-1}\cdot q_l \cdot 8\sigma N/ \sqrt{3}+B_{scale} Bmult=P1ql8σN/3 +Bscale

2.2. 相对误差

此外,我们还要分析相对误差:

  • 相对误差噪声幅度上界 B B B 和明文幅度上界 v v v 的比值 β = B / v \beta=B/v β=B/v。相对误差越小,信噪比越大,有效位越多。相反,相对误差每增加一倍 β → 2 β \beta\rightarrow 2\beta β2β,损失 1 比特精度
  • 同态加法的相对误差:相对误差分别为 β 1 , β 2 \beta_1,\beta_2 β1,β2 的两个密文相加,其结果的相对误差为
    β a d d = B 1 + B 2 v 1 + v 2 ≤ max ⁡ { β 1 , β 2 } \beta_{add}=\frac{B_1+B_2}{v_1+v_2}\leq \max\{\beta_1,\beta_2\} βadd=v1+v2B1+B2max{β1,β2}
  • 同态乘法的相对误差:相对误差分别为 β 1 , β 2 \beta_1,\beta_2 β1,β2 的两个密文相乘,其结果的相对误差为
    β m u l t = β 1 + β 2 + β 1 β 2 + B m u l t + p l − l ′ ⋅ B s c a l e v 1 v 2 \beta_{mult}=\beta_1+\beta_2+\beta_1\beta_2+\frac{B_{mult}+p^{l-l'}\cdot B_{scale}}{v_1v_2} βmult=β1+β2+β1β2+v1v2Bmult+pllBscale 其中,如果明文幅度 v 1 , v 2 v_1,v_2 v1,v2 足够大,最后一项趋近于 0 。

三、方案应用

下面讲解使用 CKKS 实现常见电路的同态计算。
😀懒得打字了,就只记录个大概

1. 线性函数

函数 密态计算 密文变化 层数变化 明文幅度变化 噪声幅度变化
f ( x ) = x + a f(x)=x+a f(x)=x+a c a = c + ( a , 0 ) m o d    q l c_a=c+(a,0) \mod q_l ca=c+(a,0)modql c → c a c\rightarrow c_a cca l → l l\rightarrow l ll v → v + ∥ a ∥ ∞ c a n v\rightarrow v+\|a\|_\infty^{can} vv+acan B → B B\rightarrow B BB
f ( x ) = a ⋅ x f(x)=a\cdot x f(x)=ax c m = a ⋅ c m o d    q l c_m=a\cdot c \mod q_l cm=acmodql c → c m c\rightarrow c_m ccm l → l l\rightarrow l ll v → ∥ a ∥ ∞ c a n ⋅ v v\rightarrow \|a\|_\infty^{can} \cdot v vacanv B → ∥ a ∥ ∞ c a n ⋅ B B\rightarrow \|a\|_\infty^{can} \cdot B BacanB
f ( x ) = x d f(x)=x^d f(x)=xd 见算法1,解密计算得到的密文有 m d / p d − 1 m^d/p^{d-1} md/pd1 c → c ′ c\rightarrow c' cc l → l − ⌈ log ⁡ d ⌉ l\rightarrow l-\lceil \log d\rceil lllogd p → p p\rightarrow p pp B → β d ⋅ p B \rightarrow \beta_d\cdot p Bβdp,其中 β d ≤ d ⋅ β 0 + ( d − 1 ) ⋅ β ∗ \beta_d \leq d\cdot \beta_0+(d-1)\cdot \beta_* βddβ0+(d1)β
f ( x ) = ∑ i = 0 d a i x i f(x)=\sum_{i=0}^{d} a_i x^i f(x)=i=0daixi 结合前三个函数 c → c ′ c\rightarrow c' cc l → l − ⌈ log ⁡ d ⌉ l\rightarrow l-\lceil \log d\rceil lllogd p → M f p\rightarrow M_f pMf,其中 M f = p ⋅ ∑ i = 0 d ∥ a i ∥ ∞ c a n M_f=p\cdot \sum_{i=0}^{d} \|a_i\|_\infty^{can} Mf=pi=0daican β 0 ⋅ p → β d ⋅ M f \beta_0\cdot p \rightarrow \beta_d\cdot M_f β0pβdMf,其中 β d ≤ d ⋅ β 0 + ( d − 1 ) ⋅ β ∗ \beta_d \leq d\cdot \beta_0+(d-1)\cdot \beta_* βddβ0+(d1)β

算法1如下,其中 RS 表示重缩放算法,Mult表示同态乘法:
在这里插入图片描述

2. 非线性函数

非线性函数可以用泰勒级数近似为 f ( x ) = T d ( x ) + R d ( x ) f(x)=T_d(x)+R_d(x) f(x)=Td(x)+Rd(x) 其中 T d ( x ) T_d(x) Td(x) d d d泰勒多项式,如下:
T d ( x ) = ∑ i = 0 d f ( j ) ( 0 ) j ! ⋅ x j T_d(x) = \sum_{i=0}^d \frac{f^{(j)}(0)}{j!}\cdot x^j Td(x)=i=0dj!f(j)(0)xj
R d ( x ) = f ( x ) − T d ( x ) R_d(x) = f(x)-T_d(x) Rd(x)=f(x)Td(x) 为截断误差,或者说是余项。变换后,泰勒多项式 T d ( x ) T_d(x) Td(x) 可通过上面线性函数介绍的方法进行计算,并且为了保证计算结果的精度,需要乘以一个缩放因子 p u p^u pu ,最终得到的密文解密后为 p u + 1 ⋅ f ( m / d ) p^{u+1}\cdot f(m/d) pu+1f(m/d)误差来自三方面:同态计算累积的评估误差、编码和重缩放引入的舍入误差、泰勒级数近似引入的截断误差。下面介绍两个常用的非线性函数的同态计算:

函数 密态计算 密文变化 层数变化 明文幅度变化 噪声幅度变化
f ( x ) = e x f(x)=e^x f(x)=ex 根据线性函数的方法进行计算 T d ( x ) = ∑ j = 0 d 1 j ! ⋅ x j T_d(x)=\sum_{j=0}^d \frac{1}{j!}\cdot x^j Td(x)=j=0dj!1xj解密计算得到的密文有 p u + 1 ⋅ t d ( m / p ) p^{u+1}\cdot t_d(m/p) pu+1td(m/p) c → c ′ c\rightarrow c' cc l → l − ⌈ log ⁡ d ⌉ l\rightarrow l-\lceil \log d\rceil lllogd p → p u + 1 p \rightarrow p^{u+1} ppu+1 β 0 ⋅ p → B ′ \beta_0\cdot p \rightarrow B' β0pB,其中 B ′ = d p + p u + 1 ⋅ ( e β 0 + β ∗ + e ( d + 1 ) ! ) B'=dp+ p^{u+1}\cdot (e\beta_0+\beta_*+\frac{e}{(d+1)!}) B=dp+pu+1(eβ0+β+(d+1)!e)
f ( x ) = x − 1 f(x)=x^{-1} f(x)=x1 见算法2,解密计算得到的密文有 p ⋅ ∏ i = 0 r − 1 ( 1 + ( p − m p ) 2 i ) p\cdot \prod_{i=0}^{r-1}(1+(\frac{p-m}{p})^{2^i}) pi=0r1(1+(ppm)2i) c → v r c\rightarrow v_r cvr l → l − r l\rightarrow l-r llr p / 2 → 2 p p/2 \rightarrow 2p p/22p β 0 ⋅ p / 2 → β ⋅ 2 p \beta_0\cdot p/2 \rightarrow \beta\cdot 2p β0p/2β2p,其中 β ≤ β 0 + r β ∗ \beta\leq \beta_0+r\beta_* ββ0+rβ

算法2如下,其中 m ^ = p − m \hat m = p-m m^=pm
在这里插入图片描述

3. 傅里叶变换

😕彻底不想打字了,以后用到了再填坑吧

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐