CKKS 同态加密数学基础推导

Cheon-Kim-Kim-Song (CKKS) Scheme - 首个支持近似算术的高效同态加密方案

阅读本文需要一定的代数学基础

本文将介绍CKKS构造同态,密钥生成,加解密,加乘法同构,旋转,自举的数学原理


目录

  1. 引言
  2. 数学基础
  3. [CKKS 方案概览](#CKKS 方案概览)
  4. 核心构造
  5. 同态运算
  6. 重缩放与模数切换

引言

同态加密的发展

同态加密(Homomorphic Encryption, HE)允许在密文上直接进行计算,而无需解密。这一特性使得云计算场景下的数据隐私保护成为可能。

\[\begin{array}{c|c|c} \text{方案} & \text{提出时间} & \text{特性} \\ \hline \text{RSA} & 1978 & \text{仅支持乘法同态} \\ \text{Paillier} & 1999 & \text{仅支持加法同态} \\ \text{Gentry} & 2009 & \text{首个全同态加密方案(FHE)} \\ \text{BGV} & 2012 & \text{基于RLWE的分层FHE} \\ \text{BFV} & 2012 & \text{适用于精确整数运算} \\ \textbf{CKKS} & \textbf{2017} & \textbf{首个支持近似实数运算的FHE} \end{array} \]

CKKS 的核心创新

CKKS(Cheon-Kim-Kim-Song) 方案于 2017 年提出,其核心创新在于:

  1. 支持近似算术:可以加密实数/复数向量,计算结果与明文计算存在可控误差
  2. SIMD 风格批处理 :单次加密可处理 \(N\) 个数据,支持向量化的并行计算
  3. 高效的旋转操作:支持密文向量的循环移位
  4. 重缩放(Rescaling)技术:管理噪声增长,支持任意深度的计算

应用场景

CKKS 特别适合以下场景:

  • 机器学习推理(加密神经网络)
  • 隐私保护的统计分析
  • 基因组数据分析
  • 金融数据的安全计算

数学基础

2.1 环与多项式

2.1.1 分圆多项式

设 \(N = 2^d\) 为 2 的幂次,\(m = 2N\)。第 \(m\) 个分圆多项式为:

\[\Phi_m(X) = X^N + 1 \]

分圆域 \(\mathbb{Q}(\zeta_m)\) 是有理数域添加本原 \(m\) 次单位根 \(\zeta_m = e^{2\pi i/m}\) 得到的扩张。

2.1.2 多项式环

定义两个重要的多项式环:

原始多项式环

\[R = \mathbb{Z}[X]/(X^N + 1) \]

这个符号表示商环(Quotient Ring),下面分步拆解:

\[\begin{array}{c|c} \text{符号} & \text{含义} \\ \hline \mathbb{Z}[X] & \text{整数系数多项式环:所有形如 } a_0 + a_1 X + \cdots + a_d X^d \text{ 的多项式,系数 } a_i \in \mathbb{Z} \\ (X^N + 1) & \text{由多项式 } X^N + 1 \text{ 生成的理想(ideal)} \\ / & \text{商运算:将环中相差一个理想元素的元素视为等价} \end{array} \]

\(R\) 中的元素是次数小于 \(N\) 的整数系数多项式

\[a_0 + a_1 X + a_2 X^2 + \cdots + a_{N-1} X^{N-1}, \quad a_i \in \mathbb{Z} \]

且满足约束关系 \(X^N \equiv -1 \pmod{X^N + 1}\),即所有 \(X^N\) 都可以用 \(-1\) 替换。

运算示例 (设 \(N=4\),即在 \(R = \mathbb{Z}[X]/(X^4+1)\) 中):

  • 加法:\((1 + 2X) + (3 - X) = 4 + X\)
  • 乘法降次:\(X^2 \cdot X^3 = X^5 = X \cdot X^4 \equiv -X\)
  • 幂运算:\(X^6 = X^2 \cdot X^4 \equiv -X^2\)

可以将商群理解为将正规子群 N"压缩"为单位元",即在 G 中把 N 内的元素视作同一个单位元。这样,商群将原群划分为若干等价类,每个等价类对应一个陪集。

模 \(q\) 多项式环

\[R_q = \mathbb{Z}_q[X]/(X^N + 1) = \mathbb{Z}[X]/(q, X^N + 1) \]

这是原始多项式环 \(R\) 的模 \(q\) 版本 ,其中 \(q\) 为整数模数(通常是若干素数的乘积)。两种写法等价:

\[\begin{array}{c|c} \text{写法} & \text{含义} \\ \hline \mathbb{Z}_q[X]/(X^N + 1) & \mathbb{Z}_q = \mathbb{Z}/q\mathbb{Z} \text{ 是模 } q \text{ 整数环(元素为 } \{0, 1, ..., q-1\}\text{),先对系数取模 } q\text{,再对多项式取模 } (X^N+1) \\ \mathbb{Z}[X]/(q, X^N + 1) & \text{同时模去两个理想:系数模 } q\text{,且满足 } X^N \equiv -1 \end{array} \]

\(R_q\) 中的元素是次数小于 \(N\)、系数在 \([0, q-1]\) 范围内的多项式

\[a_0 + a_1 X + \cdots + a_{N-1} X^{N-1}, \quad a_i \in \{0, 1, ..., q-1\} \]

双重取模

  1. 系数层面 :所有系数运算都在模 \(q\) 下进行(即结果对 \(q\) 取余)
  2. 多项式层面 :满足 \(X^N \equiv -1\),高次项需降次

运算示例 (设 \(N=4, q=17\)):

  • 系数模 \(q\):\(15X + 7X = 22X \equiv 5X \pmod{17}\)
  • 乘法:\(3X^2 \cdot 5X^3 = 15X^5 = 15X \cdot X^4 \equiv -15X \equiv 2X \pmod{(17, X^4+1)}\)

在 CKKS 中的作用 :密文多项式的系数都存储为模 \(q\) 的整数,这是实现同态运算的基础。

其中 \(q\) 为整数模数,\(N\) 为 2 的幂次。

2.1.3 中国剩余定理与环同构

引理 2.1 (环同构):设 \(N = 2^k\) 为 2 的幂次,考虑多项式在复数域上的求值,存在以下环同构:

\[\mathbb{C}[X]/(X^N + 1) \cong \mathbb{C}^N \]

即系数为复数的分圆多项式环同构于 \(N\) 个复数域的直积。同构映射由中国剩余定理(CRT)给出:

\[\text{CRT}: a(X) \mapsto (a(\zeta), a(\zeta^3), \ldots, a(\zeta^{2N-1})) \in \mathbb{C}^N \]

这里 \(\zeta = e^{\pi i/N}\) 是 \(2N\) 次本原单位根。

:\(N = 2^k\) 的条件至关重要。此时:

  1. \(X^N + 1\) 恰好是第 \(2N\) 个分圆多项式 \(\Phi_{2N}(X)\)
  2. 模 \(2N\) 的乘法群 \(\mathbb{Z}_{2N}^* = \{1, 3, 5, \ldots, 2N-1\}\) 恰好包含所有奇数
  3. 因此 \(X^N + 1\) 的根为 \(\zeta^j\)(\(j\) 取所有奇数)

CRT 证明 :下面我们从整数环 出发,逐步推广到主理想整环(PID) ,最后应用到多项式环,完整证明上述同构关系。

第一步:整数环上的 CRT

定理(整数 CRT) :设 \(n_1, n_2, \ldots, n_k\) 是两两互素的正整数,令 \(n = n_1 n_2 \cdots n_k\)。则:

\[\mathbb{Z}/n\mathbb{Z} \cong \mathbb{Z}/n_1\mathbb{Z} \times \mathbb{Z}/n_2\mathbb{Z} \times \cdots \times \mathbb{Z}/n_k\mathbb{Z} \]

证明

  1. 构造同态:定义映射

    \[\phi: \mathbb{Z} \to \mathbb{Z}/n_1\mathbb{Z} \times \cdots \times \mathbb{Z}/n_k\mathbb{Z}, \quad a \mapsto (a \bmod n_1, \ldots, a \bmod n_k) \]

  2. 确定核(Kernel)

    \[\ker(\phi) = \{a \in \mathbb{Z} : n_i \mid a \text{ 对所有 } i\} = \{a \in \mathbb{Z} : n \mid a\} = n\mathbb{Z} \]

    (若 \(n_i\) 两两互素,则 \(\text{lcm}(n_1,\ldots,n_k) = n_1\cdots n_k = n\))

  3. 证明满射(Surjective) :需证:对任意 \((a_1, \ldots, a_k)\),存在 \(a\) 使得 \(a \equiv a_i \pmod{n_i}\) 对所有 \(i\)。

    令 \(m_i = n / n_i = \prod_{j \neq i} n_j\)。由两两互素,\(\gcd(m_i, n_i) = 1\)。

    因此存在 \(m_i^{-1} \bmod n_i\)(乘法逆元)。构造:

    \[a = \sum_{i=1}^k a_i \cdot m_i \cdot (m_i^{-1} \bmod n_i) \]

    验证:当 \(j \neq i\) 时,\(n_j \mid m_i\),故 \(a \equiv a_i \cdot m_i \cdot m_i^{-1} \equiv a_i \pmod{n_i}\)。

  4. 应用同态基本定理

    \[\mathbb{Z}/n\mathbb{Z} = \mathbb{Z}/\ker(\phi) \cong \text{Im}(\phi) = \prod_{i=1}^k \mathbb{Z}/n_i\mathbb{Z} \]

\(\square\)

显式同构

  • 正向 :\(a \bmod n \mapsto (a \bmod n_1, \ldots, a \bmod n_k)\)

  • 逆向(CRT重构) :给定 \((a_1, \ldots, a_k)\),计算

    \[a = \sum_{i=1}^k a_i \cdot m_i \cdot (m_i^{-1} \bmod n_i) \bmod n \]

第二步:推广到主理想整环(PID)

在将CRT从整数环推广到多项式环之前,我们需要理解**主理想整环(Principal Ideal Domain, PID)**这一重要代数结构。

定义(主理想整环) :一个整环 \(R\) 称为主理想整环 ,如果 \(R\) 的每个理想都是主理想,即对 \(R\) 的任意理想 \(I\),存在元素 \(a \in R\) 使得:

\[I = (a) = \{r \cdot a : r \in R\} \]

PID中的"理想"都可以由单个元素生成 ,就像整数环中所有偶数构成理想 \((2)\),由2生成。

为什么整数环 \(\mathbb{Z}\) 和多项式环 \(\mathbb{C}[X]\) 都是PID?

\[\begin{array}{c|c|c} \text{环} & \text{理想的结构} & \text{为何是PID} \\ \hline \mathbb{Z} & \text{所有理想形如 } n\mathbb{Z} = (n) & \text{任意理想都是某个整数 } n \text{ 的所有倍数} \\ \mathbb{C}[X] & \text{所有理想形如 } (f(X)) & \text{多项式环是Euclidean整环,可用带余除法证明} \end{array} \]

在PID中,任意两个元素 \(a, b\) 都存在最大公因式 \(\gcd(a,b)\),且满足Bézout恒等式 :存在 \(u, v \in R\) 使得:

\[u \cdot a + v \cdot b = \gcd(a,b) \]

这正是CRT证明中构造逆元的关键工具!

定理(PID 上的 CRT) :设 \(R\) 是PID,\(f_1, \ldots, f_k \in R\) 两两互素(即 \(\gcd(f_i, f_j) = 1\) 对 \(i \neq j\)),令 \(f = f_1 f_2 \cdots f_k\)。则:

\[R/(f) \cong R/(f_1) \times \cdots \times R/(f_k) \]

证明

  1. 构造同态

    \[\phi: R \to R/(f_1) \times \cdots \times R/(f_k), \quad a \mapsto (a \bmod f_1, \ldots, a \bmod f_k) \]

  2. 确定核

    \[\ker(\phi) = \{a \in R : f_i \mid a \text{ 对所有 } i\} = (f) \]

    因为 \(f_i\) 两两互素,所以 \(\text{lcm}(f_1,\ldots,f_k) = f_1 \cdots f_k = f\)。

  3. 证明满射(关键步骤) :需找到 \(e_i \in R\) 使得:

    • \(e_i \equiv 1 \pmod{f_i}\)
    • \(e_i \equiv 0 \pmod{f_j}\) 对 \(j \neq i\)

    令 \(g_i = f / f_i = \prod_{j \neq i} f_j\)。因 \(\gcd(f_i, f_j) = 1\),有 \(\gcd(g_i, f_i) = 1\)。

    在PID中,由Bézout恒等式 ,存在 \(u_i, v_i \in R\) 使得:

    \[u_i \cdot g_i + v_i \cdot f_i = 1 \]

    取 \(e_i = u_i \cdot g_i\),则:

    • \(e_i \equiv 1 \pmod{f_i}\)(因 \(e_i = 1 - v_i f_i\))
    • \(e_i \equiv 0 \pmod{f_j}\) 对 \(j \neq i\)(因 \(f_j \mid g_i\))

    对任意 \((a_1, \ldots, a_k)\),构造 \(a = \sum_{i=1}^k a_i \cdot e_i\),则 \(a \equiv a_i \pmod{f_i}\)。

  4. 由同态基本定理得证

    \[R/(f) \cong \prod_{i=1}^k R/(f_i) \]

\(\square\)

第三步:应用到多项式环 \(\mathbb{C}[X]\)

设定

  • \(R = \mathbb{C}[X]\) 是PID(因 \(\mathbb{C}\) 是域,\(\mathbb{C}[X]\) 是Euclidean整环,从而是PID)
  • \(f(X) = X^N + 1\)
  • 在 \(\mathbb{C}\) 上完全分解:\(f(X) = \prod_{j=0}^{N-1} (X - \zeta^{2j+1})\),其中 \(\zeta = e^{2\pi i / 2N}\) 是 \(2N\) 次本原单位根

验证互素条件 :对 \(i \neq j\),一次多项式 \((X - \zeta^{2i+1})\) 和 \((X - \zeta^{2j+1})\):

  • 都是首一的
  • 根不同
  • \(\gcd = 1\)(两两互素)

应用CRT

\[\mathbb{C}[X]/(X^N+1) \cong \prod_{j=0}^{N-1} \mathbb{C}[X]/(X - \zeta^{2j+1}) \]

第四步:简化每个分量

定理 :\(\mathbb{C}[X]/(X - \alpha) \cong \mathbb{C}\)

证明 :定义求值映射

\[\text{ev}_\alpha: \mathbb{C}[X] \to \mathbb{C}, \quad f(X) \mapsto f(\alpha) \]

  • 满射 :对任意 \(c \in \mathbb{C}\),常数多项式 \(f(X) = c\) 满足 \(f(\alpha) = c\)
  • :\(\ker(\text{ev}_\alpha) = \{f \in \mathbb{C}[X] : f(\alpha) = 0\} = (X - \alpha)\)(因 \(X-\alpha\) 不可约)

由同态基本定理:\(\mathbb{C}[X]/(X-\alpha) \cong \mathbb{C}\)

\(\square\)

在模 \((X - \alpha)\) 下,\(X \equiv \alpha\),所以任何多项式 \(f(X)\) 都等价于常数 \(f(\alpha)\)。

第五步:综合结果

\[\boxed{\mathbb{C}[X]/(X^N + 1) \cong \mathbb{C}^N} \]

显式同构

  • 正向(NTT) :\(f(X) \mapsto (f(\zeta), f(\zeta^3), \ldots, f(\zeta^{2N-1}))\)
  • 逆向(INTT) :\((z_0, \ldots, z_{N-1}) \mapsto \sum_{j=0}^{N-1} z_j \cdot e_j(X)\),其中 \(e_j\) 是Lagrange基多项式(逆向本质上是在做多项式插值)

总结表

\[\begin{array}{c|c} \text{步骤} & \text{核心思想} \\ \hline \text{整数CRT} & \text{利用 } \gcd(m_i, n_i) = 1 \text{ 构造逆元,证明满射} \\ \text{PID推广} & \text{Bézout恒等式保证逆元存在,互素条件保证可分解} \\ \text{多项式应用} & \text{一次因式互素 } \Rightarrow \text{ 分量为 } \mathbb{C} \\ \text{NTT根源} & \text{求值映射 = CRT同构的具体实现} \end{array} \]

符号说明

  • \(R = \mathbb{Z}[X]/(X^N + 1)\) 是前面定义的原始多项式环 (次数 \(< N\) 的整系数多项式)
  • \(\mathbb{C}[X]/(X^N + 1)\):系数为复数的多项式环,模 \((X^N + 1)\)。从代数角度,这与 \(R \otimes_{\mathbb{Z}} \mathbb{C}\)(\(R\) 与复数域在 \(\mathbb{Z}\) 上的张量积)同构
  • \(\mathbb{Z}_{2N}^*\):模 \(2N\) 的乘法群 (与 \(2N\) 互素的剩余类),由于 \(N=2^d\),互素的数即为奇数

环同态的性质 :映射 \(\sigma: a(X) \mapsto (a(\zeta), a(\zeta^3), \ldots, a(\zeta^{2N-1}))\) 保持环运算:

  • 加法 :\(\sigma(a + b) = \sigma(a) + \sigma(b)\)(分量相加)
  • 乘法 :\(\sigma(a \cdot b) = \sigma(a) \odot \sigma(b)\)(分量相乘,Hadamard积)

实例 (设 \(N=4\)):

  • \(\zeta = e^{\pi i/4} = \frac{1+i}{\sqrt{2}}\)(8次本原单位根)
  • 根为 \(\zeta^1, \zeta^3, \zeta^5, \zeta^7\)(即 \(\zeta, i\zeta, -\zeta, -i\zeta\))
  • 多项式 \(a(X) = 1 + 2X + 3X^2 + 4X^3\) 映射为向量:

\[\sigma(a) = (a(\zeta), a(\zeta^3), a(\zeta^5), a(\zeta^7)) \in \mathbb{C}^4 \]

2.2 格密码学基础

2.2.1 格的定义

定义 2.1 (格):设 \(\mathbf{b}_1, \ldots, \mathbf{b}_n \in \mathbb{R}^m\) 是 \(n\) 个线性无关的向量,由它们生成的格定义为:

\[\mathcal{L} = \left\{ \sum_{i=1}^n z_i \mathbf{b}_i : z_i \in \mathbb{Z} \right\} \]

在 CKKS 中,我们使用的是一种特殊的格------理想格(Ideal Lattice),它具有额外的代数结构。

定义 2.2 (理想格):设 \(R = \mathbb{Z}[X]/(X^N + 1)\) 为分圆多项式环,\(I \subseteq R\) 是 \(R\) 的一个理想。通过系数嵌入 (coefficient embedding),将多项式 \(a(X) = a_0 + a_1 X + \cdots + a_{N-1} X^{N-1} \in R\) 映射为整数向量 \((a_0, a_1, \ldots, a_{N-1}) \in \mathbb{Z}^N\)。

理想格是指由理想 \(I\) 的系数嵌入生成的格:

\[\mathcal{L}(I) = \left\{ (a_0, a_1, \ldots, a_{N-1}) \in \mathbb{Z}^N : a(X) = \sum_{i=0}^{N-1} a_i X^i \in I \right\} \]

理想格具有以下性质:代数结构(不仅是加法群,还保持多项式乘法结构)、循环性(由于 \(X^N \equiv -1\),格具有特定的对称性)、效率优势(基于理想格的运算可用 NTT 加速,比普通格快 \(O(N)\) 倍)。

一般格中的向量是任意的,而理想格中的向量必须对应某个理想中的多项式。例如,若 \(f(X) \in I\),则 \(X \cdot f(X) \in I\) 也必须在格中,这给格带来了额外的约束和结构。

2.2.2 环面学习问题(RLWE)

CKKS 的安全性基于 Ring Learning With Errors (RLWE) 问题。

定义 2.3 (RLWE 分布):设安全参数为 \(N\)(2 的幂次)和模数 \(q\)。定义:

  • 多项式环 :\(R = \mathbb{Z}[X]/(X^N + 1)\),\(R_q = \mathbb{Z}_q[X]/(X^N + 1)\)
  • 误差分布 :\(\chi\) 是 \(R\) 上的概率分布(通常为离散高斯分布 \(D_{R, \sigma}\),标准差 \(\sigma\) 较小)

多项式环 \(R\) 中的元素是 \(N-1\) 次整系数多项式 \(a(X) = a_0 + a_1 X + \cdots + a_{N-1} X^{N-1}\)。

"\(\chi\) 是 \(R\) 上的概率分布"意味着:从 \(R\) 中按某种规则随机选取多项式。具体采样方式为:

  1. 对每个系数位置 \(i = 0, 1, \ldots, N-1\),独立地从一维离散高斯分布 \(D_{\mathbb{Z}, \sigma}\) 采样整数 \(e_i\)
  2. 组合成多项式:\(e(X) = e_0 + e_1 X + \cdots + e_{N-1} X^{N-1}\)

RLWE 分布 \(D_{\text{RLWE}}\) 由以下方式生成:

  • 均匀随机选取 \(a \leftarrow R_q\)
  • 均匀随机选取密钥 \(s \leftarrow R\)
  • 从误差分布采样 \(e \leftarrow \chi\)
  • 输出样本 \((a, b) \in R_q^2\),其中 \(b = a \cdot s + e \mod q\)

定义 2.4 (决策性 RLWE 问题):给定 \((a, b) \in R_q^2\),区分以下两种情况:

  • 情况 1(RLWE 样本) :\((a, b)\) 按 RLWE 分布生成,即 \(a \leftarrow R_q\) 均匀随机,\(b = a \cdot s + e \mod q\)
  • 情况 2(均匀随机) :\(a, b\) 均独立均匀随机从 \(R_q\) 中选取

攻击者的目标是判断给定的 \((a, b)\) 属于哪种情况。

定义 2.5 (最短向量问题):设 \(\mathcal{L}\) 是一个格,定义:

  • 最短向量问题(SVP) :找到格中长度最短的非零向量,即找到 \(\mathbf{v} \in \mathcal{L} \setminus \{\mathbf{0}\}\) 使得 \(\|\mathbf{v}\|\) 最小
  • 近似最短向量问题(Approximate SVP,\(\gamma\)-SVP) :找到非零向量 \(\mathbf{v} \in \mathcal{L}\),使得 \(\|\mathbf{v}\| \leq \gamma \cdot \lambda_1(\mathcal{L})\),其中 \(\lambda_1(\mathcal{L})\) 是最短向量的长度,\(\gamma \geq 1\) 是近似因子

对于理想格 ,相应地定义 Ideal-SVP\(\gamma\)-Ideal-SVP

定理 2.1 (安全性归约):对于适当选择的参数,如果存在一个算法能在多项式时间内解决 RLWE 问题,那么存在一个算法能在多项式时间内解决 \(\gamma\)-Ideal-SVP(对于某个近似因子 \(\gamma\))。即:

\[\text{RLWE} \leq_P \gamma\text{-Ideal-SVP} \]

这意味着 RLWE 问题的困难性至少与 Ideal-SVP 相当

证明:此归约证明涉及复杂的格归约技术,超出本文范围,详见相关密码学文献。

\(\square\)

2.3 复数编码理论

CKKS 的核心是将复数向量编码为多项式,这是实现 SIMD 风格并行计算的关键。

2.3.1 规范嵌入

定义 2.6 (规范嵌入):定义映射 \(\sigma: R \to \mathbb{C}^N\) 为:

\[\sigma: a(X) \mapsto (a(\zeta), a(\zeta^3), \ldots, a(\zeta^{2N-1})) \]

其中 \(\zeta^j\)(\(j\) 为奇数)是 \(X^N + 1\) 的所有根。

注意:规范嵌入 vs. CKKS 编码

规范嵌入 \(\sigma: R \to \mathbb{C}^N\) 的方向是多项式 → 复数向量

CKKS 的编码(Encode)使用的是 \(\sigma^{-1}\) ,方向是复数向量 → 多项式

\[\text{Encode}: \mathbf{z} \in \mathbb{C}^{N/2} \xrightarrow{\text{扩展+缩放}} \mathbf{z}_{\text{full}} \in \mathbb{C}^N \xrightarrow{\sigma^{-1}} m(X) \in R \]

因此:

  • 规范嵌入 \(\sigma\):用于理论分析和解码(Decode)
  • CKKS 编码 \(\sigma^{-1}\):用于加密前的数据准备

性质 2.1

  • \(\sigma\) 是环同态(保持加法和乘法)
  • 对于 \(a, b \in R\):\(\sigma(a \cdot b) = \sigma(a) \odot \sigma(b)\)(分量乘法)

2.3.2 解码空间

定义 明文空间 为:

\[\mathcal{S} = \mathbb{C}^{N/2} \]

注意:由于 \(a(X) \in \mathbb{R}[X]/(X^N+1)\) 时 \(a(\zeta^{2N-j}) = \overline{a(\zeta^j)}\),所以我们只有 \(N/2\) 个复数槽位。


CKKS 方案概览

3.1 核心思想

CKKS 方案的核心思想可以用以下图示表示:

复制代码
复数向量 z ∈ ℂ^(N/2)      【待加密数据】
        ↓ 编码 (σ⁻¹)
多项式 m(X) ∈ R           【SIMD: N/2个槽位打包到一个多项式】
        ↓ 加密
密文 ct = (c₀, c₁) ∈ R_q² 【含噪声的加密容器】
        ↓ 同态运算 (⊕, ⊗)
结果密文 ct'               【密文上完成批量计算】
        ↓ 解密
近似多项式 m̃(X)            【含误差,可控】
        ↓ 解码 (σ)
结果向量 z' ∈ ℂ^(N/2)     【z'_j ≈ f(z_j)】
  1. 编码 ≠ 加密:编码是确定性的插值转换(无密钥);加密才是带噪声的同态加密
  2. 为什么编码? CKKS 只能加密多项式,不能直接加密复数向量
  3. SIMD 优势 :一次加密处理 \(N/2\) 个复数,同态运算自动并行作用于所有槽位
  4. 近似性 :解密后是近似值,误差可通过增大缩放因子 \(\Delta\) 控制

3.2 参数设置

CKKS 方案由以下参数完全确定:

\[\begin{array}{c|c|c} \text{参数} & \text{符号} & \text{含义} \\ \hline \text{多项式次数} & N = 2^d & \text{决定 SIMD 槽数,槽数 } = N/2 \\ \text{密文模数} & Q = q_L \cdot q_{L-1} \cdots q_0 & \text{层级模数链} \\ \text{层级数} & L & \text{最大乘法深度} \\ \text{误差分布} & \chi & \text{通常为 } D_{\mathbb{Z}^N, \sigma} \\ \text{缩放因子} & \Delta & \text{控制精度,通常为 } 2^p \end{array} \]

3.2.1 安全性级别

根据同态加密标准(Homomorphic Encryption Standard):

\[\begin{array}{c|c|c|c} \text{安全级别} & \text{128-bit} & \text{192-bit} & \text{256-bit} \\ \hline \text{最小 } \log_2(N) & 12 & 13 & 14 \\ \text{最小 } \log_2(Q) & 109 & 218 & 438 \end{array} \]

3.2.2 误差分布

通常使用离散高斯分布 \(D_{\mathbb{Z}^N, \sigma}\):

  • 标准差 \(\sigma \approx 3.2\)
  • 密钥分布:稀疏分布(HWHM = Hamming Weight Half Minimum)

3.2.3 参数选择原则

安全性约束

  • \(N\) 和 \(Q\) 的选择必须满足安全性要求(见上表)
  • 更大的 \(Q\) 允许更深的计算,但需要更大的 \(N\) 来保持安全性

精度与效率权衡

\[\begin{array}{c|c|c} \text{缩放因子 } \Delta & \text{精度} & \text{乘法深度} \\ \hline 2^{20} & \sim 6 \text{ 位小数} & \text{较大} \\ 2^{30} & \sim 9 \text{ 位小数} & \text{中等} \\ 2^{40} & \sim 12 \text{ 位小数} & \text{较小} \end{array} \]

性能基准 (\(N = 2^{14} = 16384\),128-bit 安全性):

\[\begin{array}{c|c|c} \text{操作} & \text{时间(单线程)} & \text{吞吐量} \\ \hline \text{加密} & \sim 1 \text{ ms} & 16K \text{ 个槽} \\ \text{解密} & \sim 0.5 \text{ ms} & 16K \text{ 个槽} \\ \text{加法} & \sim 0.01 \text{ ms} & 16K \text{ 个槽} \\ \text{乘法} & \sim 10 \text{ ms} & 16K \text{ 个槽} \\ \text{旋转} & \sim 5 \text{ ms} & 16K \text{ 个槽} \end{array} \]

3.3 关键特性

近似算术

CKKS 是一种 近似同态加密(Approximate Homomorphic Encryption)方案。解密结果包含小误差:

\[\text{Decrypt}(\text{Encrypt}(m)) \approx m \]

误差满足:

\[\|m - \tilde{m}\|_\infty \leq \epsilon \]

其中 \(\epsilon\) 可通过参数选择控制在可接受范围内。

SIMD 批处理

单次加密可处理 \(N/2\) 个复数,支持:

  • 分量加法 :\((a_1, \ldots, a_n) + (b_1, \ldots, b_n) = (a_1+b_1, \ldots, a_n+b_n)\)
  • 分量乘法 :\((a_1, \ldots, a_n) \odot (b_1, \ldots, b_n) = (a_1 b_1, \ldots, a_n b_n)\)

核心构造

4.1 密钥生成

4.1.1 密钥生成算法

符号说明

  • \(\lambda\):安全参数(如 128-bit、256-bit 安全级别)
  • \(\chi_{\text{key}}\):密钥分布 ,通常采用 HWHM(Hamming Weight Half Minimum)分布,即从 \(\{0, \pm 1\}^N\) 中选取固定汉明重量(非零元数量)的稀疏多项式
  • \(Q = q_L \cdot q_{L-1} \cdots q_0\):顶层模数(所有层级模数的乘积)

CKKS.KeyGen (\(1^\lambda\)):

  1. 私钥(Secret Key)

    \[sk = s \leftarrow \chi_{\text{key}} \]

    \(s\) 是小系数多项式(稀疏且系数在 \(\{-1, 0, 1\}\)),只有持有 \(s\) 才能正确解密。

  2. 公共密钥(Public Key)

    \[a \leftarrow R_Q \text{ (均匀随机)} \]

    \[e \leftarrow \chi_{\text{err}} \text{ (误差分布,小系数)} \]

    \[b = -a \cdot s + e \in R_Q, \quad pk = (b, a) \in R_Q^2 \]

    设计原理 :这实际上是 RLWE 样本 \((a, b)\),其中 \(b = -a \cdot s + e\)。这种构造使得:

    \[b + a \cdot s = e \]

    右侧是小误差(不是精确为 0,但很小),这是解密的关键等式。

4.1.2 密钥性质

4.2 编码(Encoding)

编码是将复数向量转换为多项式的过程。

4.2.1 编码算法

输入 :复数向量 \(\mathbf{z} = (z_0, z_1, \ldots, z_{N/2-1}) \in \mathbb{C}^{N/2}\)

输出 :多项式 \(m(X) \in R\)

算法步骤

  1. 扩展为完整向量:由于共轭对称性,构造

    \[\mathbf{z}{\text{full}} = (z_0, z_1, \ldots, z{N/2-1}, \overline{z_{N/2-1}}, \ldots, \overline{z_1}, \overline{z_0}) \in \mathbb{C}^N \]

  2. 缩放 :乘以缩放因子 \(\Delta\)(通常为 \(2^p\),如 \(\Delta = 2^{30}\))

    \[\mathbf{v} = \Delta \cdot \mathbf{z}_{\text{full}} \]

    为什么需要缩放? 后续要进行舍入,缩放可以减小舍入带来的精度损失。\(\Delta\) 越大,精度越高,但可计算的乘法深度越小。

  3. 逆规范嵌入(插值) :求解多项式 \(m'(X) \in \mathbb{C}[X]\) 使得

    \[m'(\zeta^{2j+1}) = v_j, \quad j = 0, 1, \ldots, N-1 \]

    这等价于计算 \(m'(X) = \sigma^{-1}(\mathbf{v})\),其中 \(\sigma^{-1}\) 是规范嵌入的逆映射(可通过 Lagrange 插值实现)。

  4. 舍入到整数系数 :由于明文空间是 \(R = \mathbb{Z}[X]/(X^N+1)\)(整数系数多项式),需要将 \(m'(X)\) 的系数舍入到最近整数:

    \[m(X) = \left\lfloor m'(X) \right\rceil = \left\lfloor \sigma^{-1}(\Delta \cdot \mathbf{z}_{\text{full}}) \right\rceil \in R \]

4.2.2 编码的数学表示

定理 4.1 (编码的正确性):设 \(\mathbf{z} \in \mathbb{C}^{N/2}\),\(m = \text{Encode}(\mathbf{z})\) 是编码得到的多项式。对 \(m\) 进行解码(规范嵌入并除以 \(\Delta\))得到:

\[\frac{\sigma(m)}{\Delta} = \mathbf{z}{\text{full}} + \frac{\mathbf{\epsilon}{\text{round}}}{\Delta} \]

其中舍入误差满足 \(\|\mathbf{\epsilon}{\text{round}}\|\infty \leq \frac{1}{2}\)。因此解码后的相对误差不超过 \(\frac{1}{2\Delta}\)。

证明 :由编码算法,\(m(X) = \lfloor \sigma^{-1}(\Delta \cdot \mathbf{z}{\text{full}}) \rceil\)。设 \(m'(X) = \sigma^{-1}(\Delta \cdot \mathbf{z}{\text{full}})\),则 \(m = m' + \epsilon_{\text{round}}\),其中 \(\|\epsilon_{\text{round}}\|\infty \leq \frac{1}{2}\)。因此 \(\sigma(m) = \Delta \cdot \mathbf{z}{\text{full}} + \sigma(\epsilon_{\text{round}})\),除以 \(\Delta\) 即得结论。

\(\square\)

4.2.3 编码示例

设 \(N = 4\)(即 2 个复数槽),要编码 \(\mathbf{z} = (1+2i, 3-4i)\):

  1. 计算单位根:\(\zeta = e^{\pi i/4}\)
  2. 扩展向量:\(\mathbf{z}_{\text{full}} = (1+2i, 3-4i, 3+4i, 1-2i)\)
  3. 求解插值多项式(设 \(\Delta = 100\))
  4. 得到 \(m(X) \approx 100 \cdot \sigma^{-1}(\mathbf{z}_{\text{full}})\)

4.3 解码(Decoding)

解码是编码的逆过程,从多项式还原为复数向量。

算法

  1. 规范嵌入(求值) :计算多项式 \(m(X)\) 在所有 \(N\) 个根处的取值

    \[\mathbf{w} = \sigma(m) = (m(\zeta), m(\zeta^3), \ldots, m(\zeta^{2N-1})) \in \mathbb{C}^N \]

  2. 去除缩放 :除以缩放因子 \(\Delta\)

    \[\mathbf{w}' = \mathbf{w} / \Delta \]

    此时 \(\mathbf{w}' \approx \mathbf{z}_{\text{full}}\),即编码时构造的完整向量(含共轭对称部分)。

  3. 提取有效分量 :由于共轭对称性 \(w'_{N-1-j} = \overline{w'_j}\),只需取前 \(N/2\) 个分量:

    \[\mathbf{z} = (w'_0, w'1, \ldots, w'{N/2-1}) \in \mathbb{C}^{N/2} \]

误差分析

解码结果包含两部分误差:

  • 舍入误差 \(\mathbf{\epsilon}_{\text{round}}\):编码时系数舍入引入(与 \(\Delta\) 成反比)
  • 加密噪声 \(\mathbf{\epsilon}_{\text{noise}}\):同态加密和解密过程中的噪声累积

\[\mathbf{z}{\text{decoded}} = \mathbf{z}{\text{original}} + \underbrace{\frac{\mathbf{\epsilon}{\text{round}}}{\Delta}}{\text{编码误差}} + \underbrace{\frac{\mathbf{\epsilon}{\text{noise}}}{\Delta}}{\text{加密噪声}} \]

选择足够大的 \(\Delta\) 可使两项误差都任意小。

4.4 加密

4.4.1 加密算法

设计目标 :构造密文 \((c_0, c_1)\) 使得 \(c_0 + c_1 \cdot s \approx m \pmod{Q}\),即解密时能得到明文加上小噪声。

CKKS.Encrypt (\(pk = (b, a)\), \(m \in R\)):

  1. 采样随机掩码

    • \(v \leftarrow \chi_{\text{enc}}\):加密随机数(类似一次性密钥)
    • \(e_0, e_1 \leftarrow \chi_{\text{err}}\):加密噪声(小系数多项式)
  2. 构造密文:利用公钥 "包装" 明文

    \[c_0 = b \cdot v + e_0 + m \pmod{Q} \]

    \[c_1 = a \cdot v + e_1 \pmod{Q} \]

  3. 输出 :\(ct = (c_0, c_1) \in R_Q^2\)

密文本质上是 RLWE 样本的"变形"。\(v\) 是"盲化因子",确保同一明文每次加密结果不同(语义安全);\(e_0, e_1\) 是新加入的加密噪声。

4.4.2 安全性基础

加密的安全性基于 RLWE 假设 (定义 2.3):区分 \((a, a \cdot s + e)\) 与 \((a, u)\)(\(u\) 均匀随机)是困难的。

密文的安全性分析

密文 \((c_0, c_1)\) 的第二分量 \(c_1 = a \cdot v + e_1\) 具有 RLWE 样本的形式(其中 \(v\) 作为"临时密钥")。由 RLWE 假设,\(c_1\) 与均匀随机不可区分。

第一分量 \(c_0 = b \cdot v + e_0 + m = (-a \cdot s + e) \cdot v + e_0 + m\)。在 \(v\) 的随机性掩盖下,\(c_0\) 也与随机元素不可区分(即使给定 \(c_1\))。

因此密文 \((c_0, c_1)\) 与均匀随机对不可区分,满足 IND-CPA 安全

4.5 解密

4.5.1 解密算法

CKKS.Decrypt (\(sk = s\), \(ct = (c_0, c_1)\)):

\[\tilde{m} = c_0 + c_1 \cdot s \pmod{q} \]

其中 \(q\) 是当前层级的模数(初始时 \(q = Q\),经过重缩放后 \(q\) 会减小)。

为什么是近似?

\[c_0 + c_1 \cdot s = m + e_{\text{total}} \]

结果不是精确的 \(m\),而是 \(m\) 加上噪声。CKKS 是近似加密,解密结果是近似的。

4.5.2 解密原理

核心等式 :对于合法生成的公钥 \((b, a)\) 和私钥 \(s\),密钥生成保证了:

\[b + a \cdot s = e \pmod{Q} \]

其中 \(e\) 是小噪声(系数绝对值通常 \(< 6\sigma\))。这个等式是解密的基础。

为什么加密构造能解密? 对密文 \(ct = (c_0, c_1)\) 计算 \(c_0 + c_1 \cdot s\):

\[\begin{aligned} c_0 + c_1 \cdot s &= (b \cdot v + e_0 + m) + (a \cdot v + e_1) \cdot s \\ &= m + (b + a \cdot s) \cdot v + e_0 + e_1 \cdot s \\ &= m + e \cdot v + e_0 + e_1 \cdot s \quad \text{(利用 } b + a \cdot s = e \text{)} \\ &= m + e_{\text{enc}} \end{aligned} \]

解密误差

\[e_{\text{enc}} = e \cdot v + e_0 + e_1 \cdot s \]

虽然看起来复杂,但 \(e, v, e_0, e_1, s\) 都是小系数多项式 ,乘积和求和后仍保持较小(相对于模数 \(Q\))。

4.5.3 解密分析与误差来源

定理 4.2 (解密近似性):设 \(ct\) 加密明文 \(m\) 且当前层级模数为 \(q\),则:

\[\text{Decrypt}(sk, ct) = m + e_{\text{total}} \pmod{q} \]

总误差 \(e_{\text{total}}\) 包含三部分:

\[\begin{array}{c|c|c} \text{误差来源} & \text{产生时机} & \text{特点} \\ \hline \text{初始加密误差 } e_{\text{enc}} & \text{加密时} & e \cdot v + e_0 + e_1 \cdot s\text{,初始较小} \\ \text{同态运算累积误差} & \text{加法/乘法时} & \text{加法线性增长,乘法平方增长} \\ \text{模数切换误差} & \text{重缩放时} & \text{除以 } q^* \text{ 引入的舍入误差,通常很小} \end{array} \]

只要 \(\|e_{\text{total}}\|_\infty < q/(2\Delta)\),解码后就能得到正确的明文(因为 \(\sigma^{-1}\) 涉及除以 \(\Delta\))。这就是 CKKS 需要重缩放的原因:控制噪声增长,保持噪声在可接受范围内。


同态运算

5.1 同态加法

5.1.1 加法算法

CKKS.Add (\(ct_1\), \(ct_2\)) ------ 同态加法算法

给定加密 \(m_1\) 的密文 \(ct_1 = (c_0^{(1)}, c_1^{(1)})\) 和加密 \(m_2\) 的密文 \(ct_2 = (c_0^{(2)}, c_1^{(2)})\),计算加密 \(m_1 + m_2\) 的新密文。

输出 :\(ct_{\text{add}} = (c_0^{\text{add}}, c_1^{\text{add}})\)

运算:对应分量相加

\[c_0^{\text{add}} = c_0^{(1)} + c_0^{(2)} \pmod{q} \]

\[c_1^{\text{add}} = c_1^{(1)} + c_1^{(2)} \pmod{q} \]

5.1.2 正确性

定理 5.1 (加法正确性):若 \(ct_1\) 加密 \(m_1\),\(ct_2\) 加密 \(m_2\),则 \(ct_{\text{add}}\) 加密 \(m_1 + m_2\)。

证明 :设 \(ct_i\) 解密得到 \(\tilde{m}_i = c_0^{(i)} + c_1^{(i)} \cdot s = m_i + e_i\)(\(i=1,2\)),其中 \(m_i\) 是明文多项式,\(e_i\) 是噪声。

计算 \(ct_{\text{add}}\) 的解密:

\[\begin{aligned} c_0^{\text{add}} + c_1^{\text{add}} \cdot s &= (c_0^{(1)} + c_0^{(2)}) + (c_1^{(1)} + c_1^{(2)}) \cdot s \\ &= (c_0^{(1)} + c_1^{(1)} \cdot s) + (c_0^{(2)} + c_1^{(2)} \cdot s) \\ &= \tilde{m}_1 + \tilde{m}_2 \\ &= (m_1 + e_1) + (m_2 + e_2) \\ &= (m_1 + m_2) + (e_1 + e_2) \end{aligned} \]

因此 \(ct_{\text{add}}\) 解密后得到 \((m_1 + m_2) + (e_1 + e_2)\),即明文和 \(m_1 + m_2\) 加上累积噪声。

\(\square\)

5.1.3 误差增长

\[\|e_{\text{add}}\| \leq \|e_1\| + \|e_2\| \]

加法使误差线性增长。

5.2 同态乘法

5.2.1 朴素乘法

对于密文 \(ct_1 = (c_0^{(1)}, c_1^{(1)})\) 和 \(ct_2 = (c_0^{(2)}, c_1^{(2)})\),计算:

\[d_0 = c_0^{(1)} \cdot c_0^{(2)} \]

\[d_1 = c_0^{(1)} \cdot c_1^{(2)} + c_1^{(1)} \cdot c_0^{(2)} \]

\[d_2 = c_1^{(1)} \cdot c_1^{(2)} \]

则有:

\[(c_0^{(1)} + c_1^{(1)} s)(c_0^{(2)} + c_1^{(2)} s) = d_0 + d_1 s + d_2 s^2 \]

5.2.2 重线性化(Relinearization)

问题 :乘法后密文变为三元组 \((d_0, d_1, d_2)\),解密需要 \(s^2\):

\[d_0 + d_1 \cdot s + d_2 \cdot s^2 \]

这会导致密文维度持续增长,需要转换回标准形式 \((c_0', c_1')\)。

核心思想

乘法后解密需要 \(s^2\),但我们希望保持只用 \(s\) 就能解密(否则密钥会越来越大)。

\(evk\) 的作用就是**"代替" \(s^2\) 的工作** ------它里面偷偷包含了 \(s^2\) 的信息,通过数学技巧可以把 \(d_2 \cdot s^2\) 转换成只需要 \(s\) 的形式。

评估密钥 \(evk\) 的组成

\(evk = (b', a')\) 是在密钥生成阶段生成的辅助密钥,其中:

  • \(a' \leftarrow R_{Q^2}\):均匀随机选取的多项式
  • \(e' \leftarrow \chi_{\text{err}}\):小噪声
  • \(b' = -a' \cdot s + e' + Q \cdot s^2 \in R_{Q^2}\)

计算 \(b' + a' \cdot s\):

\[b' + a' \cdot s = e' + Q \cdot s^2 \approx Q \cdot s^2 \]

右边约等于 \(Q \cdot s^2\)(\(e'\) 很小可忽略)。这意味着 \(evk\) 把 \(s^2\) "放大"了 \(Q\) 倍存储,后续可以通过除以 \(Q\) 把 \(s^2\) 提取出来。

CKKS.Relinearize (\((d_0, d_1, d_2)\), \(evk = (b', a')\)):

  1. 将 \(d_2\) 从模 \(q\) 提升到模 \(Q^2\)(零填充或适当扩展)

  2. 计算(在模 \(Q^2\) 下进行,然后舍入回模 \(q\)):

    \[c_0' = d_0 + \left\lfloor \frac{d_2 \cdot b'}{Q} \right\rceil \pmod{q} \]

    \[c_1' = d_1 + \left\lfloor \frac{d_2 \cdot a'}{Q} \right\rceil \pmod{q} \]

正确性验证

\[\begin{aligned} c_0' + c_1' \cdot s &\approx d_0 + \frac{d_2 \cdot b'}{Q} + \left(d_1 + \frac{d_2 \cdot a'}{Q}\right) \cdot s \\ &= d_0 + d_1 \cdot s + \frac{d_2 \cdot (b' + a' \cdot s)}{Q} \\ &\approx d_0 + d_1 \cdot s + \frac{d_2 \cdot Q \cdot s^2}{Q} \\ &= d_0 + d_1 \cdot s + d_2 \cdot s^2 \end{aligned} \]

完美!新的 \((c_0', c_1')\) 解密后得到与原三元组相同的结果,但只需要 \(s\)(不需要 \(s^2\))。

为什么需要 \(Q \cdot s^2\) 和模 \(Q^2\)?

\[\begin{array}{c|c} \text{设计} & \text{作用} \\ \hline \text{模数 } Q^2 & \text{提供足够空间,使得 } Q \cdot s^2 \text{ 不会溢出} \\ Q \cdot s^2 \text{ 项} & \text{让 } b' + a's \approx Qs^2\text{,除以 } Q \text{ 后恰好得到 } s^2 \\ \text{除以 } Q \text{ 并舍入} & \text{将结果从模 } Q^2 \text{ 映射回模 } Q\text{,同时提取 } s^2 \end{array} \]

这种构造叫做 "密钥切换"(Key Switching) 技术。

重线性化的误差分析

上述推导中使用了近似 \(b' + a' \cdot s \approx Q \cdot s^2\),实际等式为 \(b' + a' \cdot s = Q \cdot s^2 + e'\)(其中 \(e'\) 是 \(evk\) 的生成噪声)。

详细推导

计算重线性化后的第一分量 \(c_0'\) 对解密的贡献:

\[\begin{aligned} \frac{d_2 \cdot b'}{Q} &= \frac{d_2 \cdot (-a' \cdot s + e' + Q \cdot s^2)}{Q} \\ &= \frac{-d_2 \cdot a' \cdot s}{Q} + \frac{d_2 \cdot e'}{Q} + d_2 \cdot s^2 \end{aligned} \]

类似地,第二分量 \(c_1'\) 对解密的贡献(乘以 \(s\) 后):

\[\frac{d_2 \cdot a'}{Q} \cdot s = \frac{d_2 \cdot a' \cdot s}{Q} \]

两者相加时,\(\frac{-d_2 \cdot a' \cdot s}{Q}\) 和 \(\frac{d_2 \cdot a' \cdot s}{Q}\) 相互抵消,剩下:

\[d_2 \cdot s^2 + \frac{d_2 \cdot e'}{Q} \]

因此重线性化引入的误差为

\[e_{\text{rk}} = \left\lfloor \frac{d_2 \cdot e'}{Q} \right\rceil \]

(加上舍入符号表示实际计算中的整数舍入)。由于除以了 \(Q\),\(e_{\text{rk}}\) 通常比 \(e'\) 小得多,但会贡献到总误差中。

5.2.3 乘法算法

CKKS.Mult (\(ct_1\), \(ct_2\), \(evk\)):

  1. 计算 \((d_0, d_1, d_2)\) 如上
  2. \(ct_{\text{mult}} = \text{Relinearize}((d_0, d_1, d_2), evk)\)
  3. 返回 \(ct_{\text{mult}}\)

5.2.4 正确性与误差分析

定理 5.2 (乘法正确性):若 \(ct_1\) 解密为 \(\tilde{m}1 = m_1 + e_1\),\(ct_2\) 解密为 \(\tilde{m}2 = m_2 + e_2\),则 \(ct{\text{mult}}\) 解密为 \(m_1 \cdot m_2 + e{\text{mult}}\)。

证明 :由解密定义,\(c_0^{(i)} + c_1^{(i)} \cdot s = \tilde{m}_i = m_i + e_i\)(\(i=1,2\))。朴素乘法后的三元组满足:

\[d_0 + d_1 s + d_2 s^2 = (c_0^{(1)} + c_1^{(1)} s)(c_0^{(2)} + c_1^{(2)} s) = \tilde{m}_1 \cdot \tilde{m}_2 = (m_1 + e_1)(m_2 + e_2) \]

展开得:

\[m_1 m_2 + \underbrace{m_1 e_2 + m_2 e_1 + e_1 e_2}_{\text{乘法噪声}} \]

重线性化将三元组转换为二元组 \((c_0', c_1')\),保持解密值近似不变(引入额外小的重线性化误差 \(e_{\text{rk}}\))。因此:

\[c_0' + c_1' \cdot s \approx m_1 m_2 + e_{\text{mult}} \]

其中 \(e_{\text{mult}} = m_1 e_2 + m_2 e_1 + e_1 e_2 + e_{\text{rk}}\)。

\(\square\)

误差增长

\[\|e_{\text{mult}}\| \approx N \cdot \|e_1\| \cdot \|e_2\| \]

(系数 \(N\) 来自多项式乘法的范数增长)。误差呈平方级增长,这是限制乘法深度的主要原因。

5.3 明文-密文运算

当其中一个操作数是明文(未加密的多项式)时,运算更高效:

明文-密文乘法

\[\text{Mult}_{\text{plain}}(ct, m) = (c_0 \cdot m, c_1 \cdot m) \]

正确性验证

\[(c_0 \cdot m) + (c_1 \cdot m) \cdot s = (c_0 + c_1 \cdot s) \cdot m = \tilde{m}_{\text{ct}} \cdot m \]

解密后得到明文乘积,且噪声只被乘了 \(m\)(线性增长,而非密文乘法的平方增长)。

明文-密文加法

\[\text{Add}_{\text{plain}}(ct, m) = (c_0 + m, c_1) \]

正确性验证

\[(c_0 + m) + c_1 \cdot s = (c_0 + c_1 \cdot s) + m = \tilde{m}_{\text{ct}} + m \]

解密后得到明文和,噪声不增加(仍是原密文的噪声)。

5.4 旋转(Rotation)

注意 :旋转是可选的高级操作,不在基础加解密流程中。它用于在 SIMD 槽位之间移动数据,实现如向量内积、矩阵运算等复杂操作。

5.4.1 动机与基本概念

CKKS 使用 SIMD 技术,单次加密可处理 \(N/2\) 个复数。考虑计算两个加密向量的内积 \(\langle \mathbf{a}, \mathbf{b} \rangle = \sum_{i=0}^{n-1} a_i b_i\):分量乘法可计算 \((a_0 b_0, a_1 b_1, \ldots, a_{n-1} b_{n-1})\),但如何将所有分量求和?

解决方案 :通过旋转实现"循环累加"。设 \(ct_{ab}\) 加密分量乘积 \((a_0 b_0, a_1 b_1, a_2 b_2, a_3 b_3)\):

复制代码
第0步: ct_ab = (a0b0, a1b1, a2b2, a3b3)
第1步: 旋转后相加 → (a0b0+a1b1, a1b1+a2b2, a2b2+a3b3, a3b3+a0b0)
第2步: 再旋转后相加 → (a0b0+a1b1+a2b2+a3b3, ...) ← 每个槽位都是内积!

旋转的核心价值在于:在密文上实现数据重排,从而完成复杂的向量运算

5.4.2 自同构映射与旋转密钥

自同构映射

定义 5.1 (自同构映射):对于奇数 \(k \in \mathbb{Z}_{2N}^*\)(即 \(k\) 与 \(2N\) 互素),定义映射:

\[\tau_k: R \to R, \quad a(X) \mapsto a(X^k) \pmod{X^N + 1} \]

引理 5.1 (自同构的性质):\(\tau_k\) 是环自同构,即对任意 \(a, b \in R\):

  • \(\tau_k(a + b) = \tau_k(a) + \tau_k(b)\)
  • \(\tau_k(a \cdot b) = \tau_k(a) \cdot \tau_k(b)\)

证明 :由多项式运算的线性性和乘法对 \(X^k\) 替换的保持性直接得出。

\(\square\)

命题 5.1 (自同构实现槽位置换):设 \(m(X)\) 是明文多项式,定义槽位索引 \(i \in \{0, 1, \ldots, N-1\}\) 对应根 \(\zeta^{2i+1}\),即第 \(i\) 个槽位存储 \(m(\zeta^{2i+1})\)。则自同构 \(\tau_k\) 作用后,槽位 \(i\) 的值移动到槽位 \(j\),其中 \(j\) 满足:

\[(2i+1)k \equiv 2j+1 \pmod{2N} \]

证明 :计算 \(\tau_k(m)(\zeta^{2i+1}) = m(\zeta^{(2i+1)k \mod 2N})\)。由于 \(k\) 是奇数,\((2i+1)k\) 仍是奇数,故存在 \(j\) 使得 \((2i+1)k \equiv 2j+1 \pmod{2N}\)。

\(\square\)


为什么 \(k\) 必须满足特定条件?

\[\begin{array}{c|c} \text{条件} & \text{原因} \\ \hline k \text{ 为奇数} & \text{根的指数都是奇数 } (1, 3, 5, \ldots, 2N-1)\text{,} k \text{ 为奇数保证 } (2i+1)k \mod 2N \text{ 仍是奇数} \\ k \text{ 与 } 2N \text{ 互素} & \text{保证映射 } j \mapsto jk \pmod{2N} \text{ 是双射(置换),即可逆} \end{array} \]

例 5.1 :设 \(N=4\),取 \(k=3\)。计算 \((2i+1) \cdot 3 \mod 8\):

  • \(i=0\): \(1 \times 3 = 3 \to j=1\)
  • \(i=1\): \(3 \times 3 = 9 \equiv 1 \to j=0\)
  • \(i=2\): \(5 \times 3 = 15 \equiv 7 \to j=3\)
  • \(i=3\): \(7 \times 3 = 21 \equiv 5 \to j=2\)

因此 \(\tau_3\) 实现置换:槽位 \((z_0, z_1, z_2, z_3) \to (z_1, z_0, z_3, z_2)\)。

旋转密钥与算法

问题 :直接对密文应用 \(\tau_k\) 得到 \((\tau_k(c_0), \tau_k(c_1))\),但解密需要 \(\tau_k(s)\) 而非 \(s\):

\[\tau_k(c_0) + \tau_k(c_1) \cdot s \neq \tau_k(c_0 + c_1 \cdot s) = \tau_k(m + e) \]

解决方案:通过旋转密钥实现密钥切换。

定义 5.2 (旋转密钥):对于自同构参数 \(k\),旋转密钥 \(rk_k = (b_k, a_k)\) 定义为:

\[b_k = -a_k \cdot s + e_k + P \cdot \tau_k(s) \in R_{PQ} \]

其中 \(a_k \leftarrow R_{PQ}\) 均匀随机,\(e_k \leftarrow \chi_{\text{err}}\),\(P\) 是特殊模数。

性质 :\(b_k + a_k \cdot s = e_k + P \cdot \tau_k(s) \approx P \cdot \tau_k(s)\)。即 \(rk_k\) 将 \(\tau_k(s)\) "放大" \(P\) 倍存储。

安全性 :旋转密钥可公开,安全性基于 RLWE 假设。\((b_k, a_k)\) 与均匀随机对不可区分。

算法 5.1(旋转):

输入 :密文 \(ct = (c_0, c_1) \in R_q^2\),自同构参数 \(k\),旋转密钥 \(rk_k = (b_k, a_k)\)

输出 :旋转后的密文 \(ct' = (c_0', c_1')\)

  1. 计算自同构:\(\tilde{c}_0 = \tau_k(c_0)\),\(\tilde{c}_1 = \tau_k(c_1)\)

  2. 模数提升:将 \(\tilde{c}_1\) 从模 \(q\) 零扩展到模 \(PQ\)

  3. 密钥切换:

    \[c_0' = \tilde{c}_0 + \left\lfloor \frac{\tilde{c}_1 \cdot b_k}{P} \right\rceil \pmod{q}, \quad c_1' = \left\lfloor \frac{\tilde{c}_1 \cdot a_k}{P} \right\rceil \pmod{q} \]

  4. 返回 \((c_0', c_1')\)

定理 5.3 (旋转正确性):设 \(ct\) 加密明文 \(m\)(带噪声 \(e\)),则旋转后的密文 \(ct'\) 解密得到 \(\tau_k(m) + \tau_k(e) + e_{\text{rot}}\),其中旋转噪声 \(e_{\text{rot}} = \lfloor \tilde{c}_1 \cdot e_k / P \rceil\)。

证明

\[\begin{aligned} c_0' + c_1' \cdot s &= \tilde{c}0 + \frac{\tilde{c}1 \cdot (b_k + a_k \cdot s)}{P} + e{\text{round}} \\ &= \tilde{c}0 + \frac{\tilde{c}1 \cdot (P \cdot \tau_k(s) + e_k)}{P} + e{\text{round}} \\ &= \tau_k(c_0) + \tau_k(c_1) \cdot \tau_k(s) + \underbrace{\frac{\tilde{c}1 \cdot e_k}{P}}{e{\text{rot}}} + e{\text{round}} \\ &= \tau_k(c_0 + c_1 \cdot s) + e_{\text{rot}} + e_{\text{round}} \\ &= \tau_k(m + e) + e_{\text{rot}} + e_{\text{round}} \end{aligned} \]

其中 \(e_{\text{round}}\) 是舍入误差,可忽略。

\(\square\)

旋转步长与自同构参数的映射

定义 5.3 (旋转步长):旋转步长 \(r\) 指槽位向右移动的位数,即 \(r=1\) 表示 \((z_0, z_1, \ldots) \to (z_{n-1}, z_0, \ldots)\)。

命题 5.2 (旋转步长与自同构参数):旋转步长 \(r\) 对应的自同构参数 \(k\) 满足:

\[k \equiv 5^r \pmod{2N} \]

映射表 (\(N=16\),\(n=8\)):

\[\begin{array}{c|c|c} \text{旋转步长 } r & \text{自同构参数 } k & \text{效果} \\ \hline 1 & 5 & \text{右移 1 位} \\ 2 & 9 & \text{右移 2 位} \\ 3 & 13 & \text{右移 3 位} \end{array} \]

:由于循环性质,只需 \(n-1\) 个不同的旋转密钥。

5.4.3 旋转算法与应用

向量内积算法

算法 5.2(向量内积 - 对数算法):

输入 :加密向量 \(ct_a\),\(ct_b\)

输出 :加密 \(\langle \mathbf{a}, \mathbf{b} \rangle\) 的密文(每个槽位都包含结果)

  1. \(ct \leftarrow ct_a \cdot ct_b\)
  2. 对于 \(j = 0, 1, \ldots, \log_2(n) - 1\):
    • \(ct_{\text{rot}} \leftarrow \text{Rotate}(ct, 2^j)\)
    • \(ct \leftarrow ct + ct_{\text{rot}}\)
  3. 返回 \(ct\)

原理 :二分归约思想。每轮将相邻的 \(2^j\) 个元素配对相加,经过 \(\log_2(n)\) 轮后每个槽位都包含总和。

例 5.2 (\(n=8\)):

复制代码
初始:     (p0, p1, p2, p3, p4, p5, p6, p7)
旋转1步:  (p7, p0, p1, p2, p3, p4, p5, p6)
相加:     (p0+p7, p1+p0, p2+p1, p3+p2, p4+p3, p5+p4, p6+p5, p7+p6)
旋转2步:  (p6+p5, p7+p6, p0+p7, p1+p0, ...)
相加:     (p0+p1+p6+p7, ...)
旋转4步:  (p4+p5+p6+p7, ...)
相加:     (p0+p1+...+p7, ...) ← 每个槽位都是总和

复杂度 :朴素算法需 \(n-1\) 次旋转,对数算法仅需 \(\log_2(n)\) 次。对于 \(n=1024\),从 1023 次降至 10 次。

复杂度分析与优化

复杂度

\[\begin{array}{c|c|c} \text{操作} & \text{时间复杂度} & \text{相对耗时} \\ \hline \text{加法} & O(N) & 1x \\ \text{明文乘法} & O(N \log N) & \sim 10x \\ \text{密文乘法} & O(N \log N) & \sim 100x \\ \text{旋转} & O(N \log N) & \sim 50x \end{array} \]

优化技巧

  1. Baby-Step Giant-Step :用 \(O(\sqrt{n})\) 个密钥支持所有旋转。设 \(m = \lceil \sqrt{n} \rceil\),预生成 \(m\) 个小步密钥(旋转 \(1, 2, 4, \ldots\) 步)和 \(m\) 个大步密钥(旋转 \(m, 2m, \ldots\) 步),任意旋转 \(r = q \cdot m + rem\) 可分解为小步+大步。

  2. 惰性旋转 :连续旋转 \(r_1\) 步和 \(r_2\) 步可合并为一次旋转 \((r_1 + r_2) \mod n\) 步,减少噪声累积。


与重线性化的统一视角

\[\begin{array}{c|c|c} \text{操作} & \text{问题} & \text{解决方案} \\ \hline \text{重线性化} & \text{解密需要 } s^2 & \text{用 } evk \text{ 把 } d_2 \cdot s^2 \text{ 转换为只需要 } s \\ \text{旋转} & \text{解密需要 } \tau_k(s) & \text{用 } rk_k \text{ 把 } \tilde{c}_1 \cdot \tau_k(s) \text{ 转换为只需要 } s \end{array} \]

两者都是密钥切换技术的应用:通过预先生成的辅助密钥,把需要"新密钥"的项转换为只需要"原密钥"的形式。


重缩放与模数切换

6.1 重缩放(Rescaling)

6.1.1 问题背景

回顾 [4.2 编码](#4.2 编码) 中引入的缩放因子 \(\Delta\):编码时将明文乘以 \(\Delta\) 以控制精度。因此,加密的明文实际上是 \(\Delta \cdot m\)。

乘法后,缩放因子平方:

\[\text{Mult}(\Delta \cdot m_1, \Delta \cdot m_2) \approx \Delta^2 \cdot m_1 m_2 \]

6.1.2 重缩放操作

CKKS.Rescale (\(ct\), \(\ell\)):

输入:层级 \(\ell\) 的密文 \(ct \in R_{q_\ell}^2\)

输出:层级 \(\ell-1\) 的密文 \(ct' \in R_{q_{\ell-1}}^2\)

  1. 计算 \(ct' = \left\lfloor \frac{q_{\ell-1}}{q_\ell} \cdot ct \right\rceil \pmod{q_{\ell-1}}\)
  2. 输出 \(ct'\)

6.1.3 重缩放的数学原理

设 \(q_\ell = q_{\ell-1} \cdot q^*\),则:

\[\text{Rescale}(ct) = \frac{1}{q^*} ct + \epsilon \]

若 \(ct\) 加密 \(\Delta^2 \cdot m\),重缩放后:

\[\approx \frac{\Delta^2}{q^*} \cdot m = \Delta \cdot m \quad \text{(当 } q^* \approx \Delta\text{)} \]

定理 6.1 (重缩放正确性):若 \(q^* \approx \Delta\),重缩放恢复正确的缩放因子。

证明 :设 \(ct\) 加密 \(\Delta^2 \cdot m\),即 \(c_0 + c_1 \cdot s = \Delta^2 \cdot m + e\)。重缩放操作计算 \(ct' = \lfloor ct / q^* \rceil\),因此:

\[c_0' + c_1' \cdot s \approx \frac{\Delta^2}{q^*} \cdot m + \frac{e}{q^*} \approx \Delta \cdot m + e' \]

其中 \(e' = e / q^*\) 是新的噪声。由于 \(q^* \approx \Delta\),缩放因子恢复为 \(\Delta\)。

\(\square\)

6.2 模数链设计

6.2.1 层级结构

设总共有 \(L+1\) 个层级,模数链为:

\[Q_L \to Q_{L-1} \to \cdots \to Q_0 \]

其中:

\[Q_\ell = q_\ell \cdot q_{\ell-1} \cdots q_0 = \prod_{i=0}^{\ell} q_i \]

通常选择 \(q_i \approx \Delta\)(如 \(\Delta = 2^{30}\),\(q_i = 2^{30}\))。

6.2.2 层级变化

\[\begin{array}{c|c|c} \text{操作} & \text{层级变化} & \text{缩放因子变化} \\ \hline \text{加密} & \ell & \Delta \\ \text{加法} & \ell \to \ell & \Delta \to \Delta \\ \text{乘法} & \ell \to \ell & \Delta \to \Delta^2 \\ \text{重缩放} & \ell \to \ell-1 & \Delta^2 \to \Delta \end{array} \]

6.2.3 模数消耗与乘法深度

定义 6.1 (乘法深度):设 \(f\) 是一个算术电路。\(f\) 的乘法深度 定义为从输入到输出的任意有向路径上乘法门的最大数量,记为 \(\text{depth}(f)\)。

例 6.1(乘法深度):

  • \(f(x,y) = x \cdot y\):\(\text{depth}(f) = 1\)
  • \(f(x,y,z) = x \cdot y \cdot z\):分解为 \(t = x \cdot y\),\(f = t \cdot z\),故 \(\text{depth}(f) = 2\)
  • \(f(x) = a_0 + a_1 x + a_2 x^2\)(Horner 形式 \(a_0 + x(a_1 + a_2 x)\)):\(\text{depth}(f) = 2\)

引理 6.1 (模数消耗):设密文初始层级为 \(\ell\),乘法深度为 \(d\)。若 \(d > \ell\),则计算无法完成。

证明 :设密文 \(ct\) 在层级 \(\ell\),缩放因子为 \(\Delta\)。

乘法操作:\(ct_1 \cdot ct_2 \to ct_{\text{new}}\),缩放因子变为 \(\Delta^2\)。

重缩放操作:\(\text{Rescale}(ct_{\text{new}}) = \lfloor ct_{\text{new}} / q_\ell \rceil\),缩放因子恢复为 \(\Delta\),层级降为 \(\ell - 1\)。

因此,每次乘法+重缩放消耗一个模数因子。\(d\) 次乘法需要 \(d\) 个模数因子。若 \(d > \ell\),模数耗尽,计算失败。

\(\square\)

推论 6.1 (模数链长度要求):计算乘法深度为 \(d\) 的电路,需要模数链长度 \(L \geq d\)。


6.3 自举(Bootstrapping)

6.3.1 自举原理

问题陈述

设定 :设模数链为 \(Q_L > Q_{L-1} > \cdots > Q_0\),其中 \(Q_\ell = \prod_{i=0}^{\ell} q_i\)。

问题 :给定层级 0 的密文 \(ct \in R_{Q_0}^2\),如何恢复到更高层级以继续计算?

定义 6.2 (自举):自举的作用是把层级 0 的密文"刷新"成顶层 \(L\) 的密文,明文内容不变,但噪声被重置,模数链恢复,可以继续计算。

6.3.2 CKKS 自举构造

输入 :\(ct = (c_0, c_1) \in R_{Q_0}^2\),满足 \(c_0 + c_1 \cdot s = m + e \pmod{Q_0}\)

输出 :\(ct' = (c_0', c_1') \in R_{Q_L}^2\),满足 \(c_0' + c_1' \cdot s' = m + e' \pmod{Q_L}\)


第一步:模数提升

将密文从模 \(Q_0\) 提升到模 \(Q_L\)。系数不变,只是模数扩大:

\[ct^{(1)} = (c_0 \bmod Q_L,\; c_1 \bmod Q_L) \in R_{Q_L}^2 \]

此时 \(ct^{(1)}\) 满足:

\[c_0 + c_1 \cdot s = m + e \pmod{Q_0} \]

但模数已变为 \(Q_L\),为后续计算提供了空间。


第二步:同态解密

模数提升后,密文 \(ct^{(1)} = (c_0, c_1)\) 满足:

\[c_0 + c_1 \cdot s = m + e \pmod{Q_0} \]

目标是计算 \(m + e\) 然后用新公钥重新加密。但服务器没有私钥 \(s\),无法直接计算 \(c_0 + c_1 \cdot s\)。

解决方法 :客户端生成新的密钥对 \((s', pk')\),其中 \(s'\) 是新私钥,\(pk'\) 是新公钥。然后构造自举密钥 \(bsk = \text{Enc}_{pk'}(s)\),即用新公钥加密原私钥。服务器利用CKKS的同态性质,在密文上"模拟"解密过程。

解密函数 \(\text{Dec}_s(ct) = c_0 + c_1 \cdot s\) 是关于 \(s\) 的一次多项式。服务器有:

  • 密文分量 \(c_0, c_1\)(这些是模 \(Q_L\) 下的多项式系数,可视为明文)
  • 加密的私钥 \(bsk = \text{Enc}_{pk'}(s)\)

利用同态数乘(明文乘密文)和同态加法:

\[\text{Enc}{pk'}(c_0) + c_1 \cdot bsk = \text{Enc}{pk'}(c_0) + \text{Enc}{pk'}(c_1 \cdot s) = \text{Enc}{pk'}(c_0 + c_1 \cdot s) \]

这里 \(c_0, c_1\) 作为明文系数与密文进行运算。


第三步:多项式近似

上述计算得到 \(\text{Enc}_{pk'}(c_0 + c_1 \cdot s)\),但 \(c_0 + c_1 \cdot s\) 可能很大(因为模数提升到了 \(Q_L\)),我们需要的是 \((c_0 + c_1 \cdot s) \bmod Q_0 = m + e\)。

模约简函数 \(f(x) = x \bmod Q_0\) 包含取整操作,不是多项式,无法直接同态计算。因此需要找一个多项式 \(P(x)\) 来近似 \(f(x)\)。

多项式近似方法

模约简函数 \(f(x) = x - Q_0 \cdot \lfloor x/Q_0 \rceil\) 是周期为 \(Q_0\) 的锯齿波。可以用以下方法近似:

  1. 正弦函数近似 :\(f(x) \approx \frac{Q_0}{2\pi} \sin(\frac{2\pi x}{Q_0})\),然后用 Taylor 展开得到多项式
  2. Chebyshev 多项式 :在区间 \([-Q_L/2, Q_L/2]\) 上最小化最大误差

设 \(P(x) = \sum_{i=0}^{d} a_i x^i\) 是 \(d\) 次近似多项式,满足 \(|P(x) - (x \bmod Q_0)| \leq \epsilon_P\)。

同态求值 :由于 \(P\) 是多项式,可以用同态加法和同态乘法计算:

\[P(\text{Enc}{pk'}(c_0 + c_1 \cdot s)) = \sum{i=0}^{d} a_i \cdot (\text{Enc}{pk'}(c_0 + c_1 \cdot s))^i = \text{Enc}{pk'}(P(c_0 + c_1 \cdot s)) \]

其中 \((\cdot)^i\) 通过 \(i\) 次同态乘法实现。最终:

\[ct' = \text{Enc}_{pk'}((m + e) + \epsilon) \]

近似误差 \(|\epsilon| \leq \epsilon_P\)。结果 \(ct'\) 是新公钥 \(pk'\) 下的密文,对应私钥 \(s'\),模数链恢复到顶层 \(L\)。


自举正确性

定理 6.3 (CKKS 自举正确性):设输入密文 \(ct\) 满足 \(c_0 + c_1 \cdot s = m + e \pmod{Q_0}\),多项式近似误差为 \(\epsilon_P\)。则自举输出密文 \(ct'\) 满足:

\[\text{Dec}_{s'}(ct') = m + e' \]

其中噪声 \(e'\) 满足 \(\|e'\|\infty \leq \|e\|\infty + \epsilon_P + e_{\text{eval}}\),\(e_{\text{eval}}\) 是同态求值引入的噪声。

证明 :设 \(x = c_0 + c_1 \cdot s\)。模数提升后,\(c_0, c_1\) 在模 \(Q_L\) 下,\(s\) 是小系数私钥,因此 \(x\) 的系数大小约为 \(O(Q_L)\)。多项式 \(P\) 在区间 \([-Q_L, Q_L]\) 上近似模约简函数 \(t \mapsto t \bmod Q_0\)。同态计算 \(P(x)\) 得到:

\[P(x) = (x \bmod Q_0) + \epsilon = m + e + \epsilon \]

其中 \(\epsilon\) 是近似误差,\(\|\epsilon\|\infty \leq \epsilon_P\)。加上同态求值噪声 \(e{\text{eval}}\),最终得到 \(m + e'\)。\(\square\)


6.3.3 复杂度与优化

自举复杂度

定理 6.4 (自举复杂度):设多项式 \(P\) 的次数为 \(d\),则 CKKS 自举需要:

\[\begin{array}{c|c} \text{资源} & \text{复杂度} \\ \hline \text{同态乘法次数} & O(d) \\ \text{同态加法次数} & O(d) \\ \text{乘法深度} & O(\log d) \text{(使用平方-乘法)} \\ \text{时间} & O(d \cdot N \log N) \end{array} \]

证明 :多项式 \(P(x) = \sum_{i=0}^{d} a_i x^i\) 的同态求值需要计算 \(x^i\)(\(i=0,1,\ldots,d\))。使用平方-乘法算法,计算 \(x^d\) 需要 \(O(\log d)\) 次乘法。所有单项式 \(x^i\) 可在 \(O(d)\) 次乘法内完成。每次乘法的时间复杂度为 \(O(N \log N)\)(使用 NTT),总时间为 \(O(d \cdot N \log N)\)。

多项式求值需要 \(O(\log d)\) 的乘法深度。这意味着模数链必须有足够的层级来支持这些乘法。CKKS自举要求 \(L \geq O(\log d)\),即顶层模数 \(Q_L\) 必须足够大以容纳自举过程中的所有乘法运算。

\(\square\)


附录:数学符号速查表

模数符号

\[\begin{array}{c|c} \text{符号} & \text{含义} \\ \hline Q & \text{总模数(顶层模数链的乘积)} \\ q_\ell & \text{第 } \ell \text{ 层的单个模数因子} \\ Q_\ell = \prod_{i=0}^{\ell} q_i & \text{第 } \ell \text{ 层的累积模数} \\ P & \text{特殊模数(用于密钥切换)} \\ P \cdot Q & \text{扩展模数(用于旋转密钥生成)} \\ q^* & \text{重缩放时除去的模数因子} \end{array} \]

误差符号

\[\begin{array}{c|c} \text{符号} & \text{含义} \\ \hline e & \text{基础误差(RLWE 误差)} \\ e_{\text{enc}} & \text{加密引入的误差} \\ e_{\text{mult}} & \text{乘法引入的误差} \\ e_{\text{add}} & \text{加法引入的误差} \\ e_{\text{rk}} & \text{重线性化引入的误差} \\ e_{\text{rot}} & \text{旋转引入的误差} \\ e_{\text{boot}} & \text{自举引入的误差} \\ \epsilon & \text{近似误差(如多项式近似误差、舍入误差)} \end{array} \]

其他符号

\[\begin{array}{c|c} \text{符号} & \text{含义} \\ \hline N & \text{分圆多项式次数(2 的幂)} \\ R = \mathbb{Z}[X]/(X^N+1) & \text{分圆多项式环(次数 } < N \text{ 的整系数多项式,满足 } X^N = -1 \text{)} \\ R_q = \mathbb{Z}q[X]/(X^N+1) & \text{模 } q \text{ 分圆多项式环(系数 } \in \mathbb{Z}q\text{,次数 } < N\text{,满足 } X^N = -1 \text{)} \\ \chi & \text{通用分布} \\ \chi{\text{key}} & \text{密钥分布(通常为 HWHM 分布)} \\ \chi{\text{err}} & \text{误差分布(通常为离散高斯分布)} \\ \Delta & \text{缩放因子} \\ \tilde{m} & \text{带噪声的明文} \\ ct & \text{密文(用下标区分,如 } ct_1, ct_{\text{add}} \text{)} \\ \sigma & \text{规范嵌入映射} \\ \zeta & 2N \text{ 次本原单位根} \\ \mathbb{Z}_{2N}^* & \text{模 } 2N \text{ 的乘法群(与 } 2N \text{ 互素的剩余类,即所有奇数)} \\ \tau_k & \text{自同构映射} \\ \odot & \text{分量乘法(Hadamard 积)} \end{array} \]

相关推荐
Eloudy3 天前
从信息熵到相对熵的发展过程
数学·信息论
闻缺陷则喜何志丹3 天前
【计算几何】和差化积及积化和差
c++·数学·计算几何
Luhui Dev4 天前
如何画三角形的外接圆(附几何画板教程)
数学
彭道意4 天前
《数论探微:进阶版》(Arithmetic Tales: Advanced Edition)
数学·数论·number theory·译作
sxtyjty6 天前
AtCoder Beginner Contest 450 G题题解
数学·算法·期望
向往着的青绿色7 天前
完全平方数【Letcode279题解】
开发语言·c++·数学·算法·面试·性能优化·动态规划
Sakuraba Ema8 天前
从零理解 MoE(Mixture of Experts)混合专家:原理、数学、稀疏性、专家数量影响与手写 PyTorch 实现
人工智能·pytorch·python·深度学习·数学·llm·latex
Sunsets_Red9 天前
乘法逆元的 exgcd 求法
c++·学习·数学·算法·c#·密码学·信息学竞赛
闻缺陷则喜何志丹9 天前
【高等数学】四,不定积分
数学·不定积分·高等数学·分部积分法·第一类积分换元法·第二类积分换元法·有理函数的积分