Cheon-Kim-Kim-Song (CKKS) Scheme - 首个支持近似算术的高效同态加密方案
阅读本文需要一定的代数学基础
本文将介绍CKKS构造同态,密钥生成,加解密,加乘法同构,旋转,自举的数学原理
目录
引言
同态加密的发展
同态加密(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 年提出,其核心创新在于:
- 支持近似算术:可以加密实数/复数向量,计算结果与明文计算存在可控误差
- SIMD 风格批处理 :单次加密可处理 \(N\) 个数据,支持向量化的并行计算
- 高效的旋转操作:支持密文向量的循环移位
- 重缩放(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\} \]
双重取模:
- 系数层面 :所有系数运算都在模 \(q\) 下进行(即结果对 \(q\) 取余)
- 多项式层面 :满足 \(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\) 的条件至关重要。此时:
- \(X^N + 1\) 恰好是第 \(2N\) 个分圆多项式 \(\Phi_{2N}(X)\)
- 模 \(2N\) 的乘法群 \(\mathbb{Z}_{2N}^* = \{1, 3, 5, \ldots, 2N-1\}\) 恰好包含所有奇数
- 因此 \(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} \]
证明:
-
构造同态:定义映射
\[\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) \]
-
确定核(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\))
-
证明满射(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}\)。
-
应用同态基本定理:
\[\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) \]
证明:
-
构造同态:
\[\phi: R \to R/(f_1) \times \cdots \times R/(f_k), \quad a \mapsto (a \bmod f_1, \ldots, a \bmod f_k) \]
-
确定核:
\[\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\)。
-
证明满射(关键步骤) :需找到 \(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}\)。
-
由同态基本定理得证:
\[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\) 中按某种规则随机选取多项式。具体采样方式为:
- 对每个系数位置 \(i = 0, 1, \ldots, N-1\),独立地从一维离散高斯分布 \(D_{\mathbb{Z}, \sigma}\) 采样整数 \(e_i\)
- 组合成多项式:\(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)】
- 编码 ≠ 加密:编码是确定性的插值转换(无密钥);加密才是带噪声的同态加密
- 为什么编码? CKKS 只能加密多项式,不能直接加密复数向量
- SIMD 优势 :一次加密处理 \(N/2\) 个复数,同态运算自动并行作用于所有槽位
- 近似性 :解密后是近似值,误差可通过增大缩放因子 \(\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\)):
-
私钥(Secret Key):
\[sk = s \leftarrow \chi_{\text{key}} \]
\(s\) 是小系数多项式(稀疏且系数在 \(\{-1, 0, 1\}\)),只有持有 \(s\) 才能正确解密。
-
公共密钥(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\)
算法步骤:
-
扩展为完整向量:由于共轭对称性,构造
\[\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 \]
-
缩放 :乘以缩放因子 \(\Delta\)(通常为 \(2^p\),如 \(\Delta = 2^{30}\))
\[\mathbf{v} = \Delta \cdot \mathbf{z}_{\text{full}} \]
为什么需要缩放? 后续要进行舍入,缩放可以减小舍入带来的精度损失。\(\Delta\) 越大,精度越高,但可计算的乘法深度越小。
-
逆规范嵌入(插值) :求解多项式 \(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 插值实现)。
-
舍入到整数系数 :由于明文空间是 \(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)\):
- 计算单位根:\(\zeta = e^{\pi i/4}\)
- 扩展向量:\(\mathbf{z}_{\text{full}} = (1+2i, 3-4i, 3+4i, 1-2i)\)
- 求解插值多项式(设 \(\Delta = 100\))
- 得到 \(m(X) \approx 100 \cdot \sigma^{-1}(\mathbf{z}_{\text{full}})\)
4.3 解码(Decoding)
解码是编码的逆过程,从多项式还原为复数向量。
算法:
-
规范嵌入(求值) :计算多项式 \(m(X)\) 在所有 \(N\) 个根处的取值
\[\mathbf{w} = \sigma(m) = (m(\zeta), m(\zeta^3), \ldots, m(\zeta^{2N-1})) \in \mathbb{C}^N \]
-
去除缩放 :除以缩放因子 \(\Delta\)
\[\mathbf{w}' = \mathbf{w} / \Delta \]
此时 \(\mathbf{w}' \approx \mathbf{z}_{\text{full}}\),即编码时构造的完整向量(含共轭对称部分)。
-
提取有效分量 :由于共轭对称性 \(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\)):
-
采样随机掩码:
- \(v \leftarrow \chi_{\text{enc}}\):加密随机数(类似一次性密钥)
- \(e_0, e_1 \leftarrow \chi_{\text{err}}\):加密噪声(小系数多项式)
-
构造密文:利用公钥 "包装" 明文
\[c_0 = b \cdot v + e_0 + m \pmod{Q} \]
\[c_1 = a \cdot v + e_1 \pmod{Q} \]
-
输出 :\(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')\)):
-
将 \(d_2\) 从模 \(q\) 提升到模 \(Q^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\)):
- 计算 \((d_0, d_1, d_2)\) 如上
- \(ct_{\text{mult}} = \text{Relinearize}((d_0, d_1, d_2), evk)\)
- 返回 \(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')\)
-
计算自同构:\(\tilde{c}_0 = \tau_k(c_0)\),\(\tilde{c}_1 = \tau_k(c_1)\)
-
模数提升:将 \(\tilde{c}_1\) 从模 \(q\) 零扩展到模 \(PQ\)
-
密钥切换:
\[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} \]
-
返回 \((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\) 的密文(每个槽位都包含结果)
- \(ct \leftarrow ct_a \cdot ct_b\)
- 对于 \(j = 0, 1, \ldots, \log_2(n) - 1\):
- \(ct_{\text{rot}} \leftarrow \text{Rotate}(ct, 2^j)\)
- \(ct \leftarrow ct + ct_{\text{rot}}\)
- 返回 \(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} \]
优化技巧:
-
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\) 可分解为小步+大步。
-
惰性旋转 :连续旋转 \(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\)
- 计算 \(ct' = \left\lfloor \frac{q_{\ell-1}}{q_\ell} \cdot ct \right\rceil \pmod{q_{\ell-1}}\)
- 输出 \(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\) 的锯齿波。可以用以下方法近似:
- 正弦函数近似 :\(f(x) \approx \frac{Q_0}{2\pi} \sin(\frac{2\pi x}{Q_0})\),然后用 Taylor 展开得到多项式
- 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} \]