1. CKKS同态加密方案概述
CKKS(Cheon-Kim-Kim-Song)是同态加密领域的重要方案,由Jung Hee Cheon、Andrey Kim、Mirim Kim和Yongsoo Song四位学者在2017年提出。与传统的FHE(全同态加密)方案相比,CKKS最大的特点是支持浮点数的近似计算,这使得它在机器学习、隐私保护数据分析等场景中具有独特优势。
注意:CKKS方案虽然支持浮点运算,但本质上仍是一种近似计算方案,计算结果会存在微小误差,这与精确计算的BGV、BFV等方案形成鲜明对比。
1.1 同态加密的基本概念
同态加密允许在加密数据上直接进行计算,而无需事先解密。用数学语言描述,对于加密函数E和明文m₁、m₂,若满足:
code复制E(m₁) ⊙ E(m₂) = E(m₁ ⊕ m₂)
其中⊙表示密文空间的操作,⊕表示明文空间的操作,则称该加密方案具有同态性。根据支持的操作类型,可分为:
- 加法同态(如Paillier):仅支持加法
- 乘法同态(如RSA):仅支持乘法
- 全同态(如BGV、BFV、CKKS):同时支持加法和乘法
1.2 CKKS的核心特点
CKKS方案在设计上有几个关键创新点:
- 近似算术:通过引入缩放因子(scale factor)和重缩放(rescaling)操作,实现对浮点数的近似计算
- 打包加密:利用RLWE(环学习带错误)问题的特性,将多个数值打包到一个多项式中进行加密(SIMD风格)
- 模数切换:通过模数降低技术控制噪声增长,延长计算深度
在实际应用中,CKKS的典型误差范围在10⁻⁹到10⁻¹⁵之间,这对于大多数机器学习应用已经足够精确。下面是一个直观的对比表:
| 特性 | CKKS | BGV/BFV | Paillier |
|---|---|---|---|
| 计算类型 | 近似计算 | 精确计算 | 精确计算 |
| 支持操作 | 加减乘 | 加减乘 | 仅加法 |
| 计算效率 | 较高 | 较低 | 高 |
| 适用场景 | 机器学习 | 金融计算 | 统计求和 |
2. CKKS的数学基础
2.1 环与多项式表示
CKKS方案建立在多项式环R = ℤ[X]/(Xᴺ + 1)上,其中N是2的幂次。选择这个特殊的多项式模是因为:
- Xᴺ ≡ -1的性质可以简化多项式乘法
- 支持快速的数论变换(NTT)实现
- 具有良好的代数结构,便于噪声控制
一个典型的密文在CKKS中由两个多项式组成:
code复制ct = (c₀, c₁) ∈ R_q × R_q
其中R_q表示系数模q的多项式环。
2.2 编码与解码过程
CKKS的核心创新之一是其巧妙的编码方案,实现了实数向量→多项式→实数向量的转换:
-
编码(Encode):
- 将复数向量z ∈ ℂ^{N/2}通过共轭扩展为ℂᴺ
- 应用逆离散傅里叶变换(DFT⁻¹)得到多项式m(X) ∈ R
- 乘以缩放因子Δ后取整:⌊Δ·m(X)⌉ ∈ R
-
解码(Decode):
- 将解密后的多项式除以Δ
- 应用DFT变换得到近似原始值的复数向量
数学表达式为:
code复制Encode(z) = ⌊Δ·DFT⁻¹(z)⌉
Decode(m) = DFT(m/Δ)
2.3 噪声与安全性基础
CKKS的安全性基于RLWE问题的困难性。简单来说,RLWE问题要求区分以下两种分布:
- (a, b = a·s + e) mod q
- (a, u) mod q (u是均匀随机的)
其中:
- a ∈ R_q是均匀随机的多项式
- s ∈ R是秘密密钥
- e ∈ R是小噪声多项式
在CKKS中,每个密文操作都会引入额外的噪声。当噪声超过一定阈值时,解密将失败。因此需要精心设计噪声管理策略。
3. CKKS的关键操作推导
3.1 同态加法
同态加法是最简单的操作。给定两个密文ct₁ = (c₀₁, c₁₁)和ct₂ = (c₀₂, c₁₂),加法定义为:
code复制ct_add = (c₀₁ + c₀₂, c₁₁ + c₁₂) mod q
这个操作不增加噪声水平(假设两个密文的缩放因子Δ相同),只是简单地对相应多项式系数相加。
3.2 同态乘法
同态乘法更为复杂,涉及三个步骤:
-
张量积计算:
对于ct₁ = (c₀₁, c₁₁)和ct₂ = (c₀₂, c₁₂),首先计算:code复制d₀ = c₀₁·c₀₂ d₁ = c₀₁·c₁₂ + c₁₁·c₀₂ d₂ = c₁₁·c₁₂这会得到一个三级密文(d₀, d₁, d₂)。
-
重线性化:
使用重线性密钥rlk=(rlk₀, rlk₁)将d₂项转换回二级密文:code复制c₀' = d₀ + d₂·rlk₀ c₁' = d₁ + d₂·rlk₁得到标准形式的密文(c₀', c₁')。
-
重缩放:
为了控制噪声增长和保持缩放因子一致,需要执行:code复制ct_mult = (⌊c₀'/p⌉, ⌊c₁'/p⌉) q' = q/p其中p是预定义的模数切换因子。
同态乘法会使噪声水平显著增加,因此是计算深度的主要限制因素。
3.3 旋转操作
CKKS支持高效的密文旋转(循环移位),这是通过Galois密钥实现的。对于旋转r位:
code复制Rotate(ct, r) = (c₀(X⁵ʳ), c₁(X⁵ʳ)) mod Φₘ(X)
其中5ʳ是模2N下的乘法逆元。这个操作在实现矩阵转置、卷积等操作时非常有用。
4. CKKS的参数选择
4.1 安全参数λ
根据NIST建议,通常选择:
- λ=128:多项式次数N=2¹⁵=32768
- λ=192:N=2¹⁶=65536
- λ=256:N=2¹⁷=131072
4.2 模数链设计
CKKS使用模数链q₀ > q₁ > ... > q_L来控制噪声。典型设计是等比数列:
code复制q_l = q₀·p^{-l}
其中p是重缩放因子(通常取2²⁰到2⁴⁰之间)。模数链长度L决定了最大计算深度。
4.3 缩放因子Δ
Δ的选择需要在精度和噪声控制之间权衡:
- 较大的Δ:提高精度但减少计算深度
- 较小的Δ:降低精度但允许更多操作
经验公式:
code复制Δ ≈ √q / (2·σ·N)
其中σ是噪声标准差。
5. CKKS的实际应用考量
5.1 精度控制技巧
- 初始缩放因子:对于32位浮点数,Δ=2³⁰是常见选择
- 乘法策略:连续乘法前可适当提高Δ
- 操作顺序:先做加法后做乘法有利于精度保持
5.2 性能优化
- NTT加速:所有多项式乘法都应使用数论变换实现
- 懒重缩放:在可能的情况下合并多个重缩放操作
- 并行计算:SIMD特性天然适合并行处理
5.3 典型误差来源
- 编码误差:来自缩放和取整操作
- 噪声误差:同态操作引入的随机噪声
- 模数误差:重缩放导致的精度损失
在实现CKKS时,我发现在处理大规模矩阵乘法时,采用对角线编码(diagonal encoding)可以显著减少旋转操作次数。具体做法是将矩阵按对角线分组,这样只需要logN次旋转就能完成矩阵乘法的所有内积计算。这个技巧在我们的隐私保护机器学习系统中将计算速度提升了约3倍。
