1. CKKS同态加密方案概述
Cheon-Kim-Kim-Song(CKKS)方案是2017年提出的支持近似算术运算的同态加密方案,与传统的全同态加密(FHE)方案相比,CKKS最大的特点是允许在加密数据上执行浮点数运算时引入可控的误差。这种特性使其特别适合机器学习、隐私保护数据分析等需要处理实数的应用场景。
在数学构造上,CKKS基于多项式环上的容错学习(RLWE)问题,采用复数域上的编码技术将实数向量映射到多项式环上。方案的核心数学工具包括:
- 分圆环(Cyclotomic Ring)上的多项式运算
- 规范嵌入(Canonical Embedding)技术
- 模数切换(Modulus Switching)技术
- 重线性化(Relinearization)技术
提示:理解CKKS需要掌握基本的环论知识,特别是多项式环Z[X]/(Φ_m(X))的性质,其中Φ_m(X)是第m个分圆多项式。
2. 数学预备知识
2.1 分圆环与规范嵌入
设m是2的幂次(m=2^k),第m个分圆多项式为Φ_m(X)=X^{m/2}+1。我们工作在分圆环R=Z[X]/(Φ_m(X))上,其商环R_q = R/qR表示系数模q的多项式环。
规范嵌入σ:R → C^{m/2}是将多项式a(X) ∈ R映射到其在单位根ζ_j = e^{2πij/m}(j ∈ Z_m^)处取值的向量:
σ(a) = (a(ζ_j))_{j ∈ Z_m^}
这个嵌入具有以下关键性质:
- 它是环同态,即σ(a+b) = σ(a)+σ(b),σ(a·b) = σ(a)◦σ(b)
- 存在逆映射σ^{-1},可通过离散傅里叶变换实现
2.2 容错学习问题(RLWE)
RLWE问题的定义如下:给定环R_q和误差分布χ,区分以下两种分布:
- (a_i, b_i = a_i·s + e_i),其中a_i ← R_q,s ← R_q,e_i ← χ
- (a_i, u_i),其中a_i, u_i ← R_q
CKKS的安全性基于RLWE问题的困难性假设。
3. CKKS的编码与解码机制
3.1 实数向量的编码
要将实数向量z ∈ C^{N/2}(N=m/2)编码到多项式m(X) ∈ R中,CKKS采用以下步骤:
- 缩放:将z乘以缩放因子Δ得到z' = Δ·z
- 舍入:计算z'' = ⌊z'⌉ ∈ Z^
- 规范嵌入逆:计算m(X) = σ^{-1}(z'')
编码过程引入的误差为‖Δ·z - z''‖ ≤ √(N/2)/2
3.2 解码过程
给定多项式m(X) ∈ R,解码过程为:
- 计算规范嵌入:z' = σ(m) ∈ C^
- 缩放恢复:z = z'/Δ
4. CKKS的基本操作构造
4.1 密钥生成
- 私钥生成:s ← χ_key(通常取二元分布)
- 公钥生成:a ← R_q,e ← χ_err,计算b = -a·s + e (mod q)
公钥为pk = (b, a) ∈ R_q^2 - 重线性化密钥:用于密文乘法后的维度缩减
- 旋转密钥:支持密文向量的循环移位操作
4.2 加密与解密
加密算法Enc(m, pk):
- 采样v ← χ_enc,e_0, e_1 ← χ_err
- 计算c_0 = v·b + e_0 + m (mod q)
- 计算c_1 = v·a + e_1 (mod q)
输出密文ct = (c_0, c_1)
解密算法Dec(ct, s):
计算m' = c_0 + c_1·s (mod q) ≈ m
4.3 同态加法
给定两个密文ct_1 = (c_{1,0}, c_{1,1})和ct_2 = (c_{2,0}, c_{2,1}),同态加法为:
ct_add = (c_{1,0}+c_{2,0}, c_{1,1}+c_{2,1}) (mod q)
4.4 同态乘法
同态乘法更复杂,需要以下步骤:
- 张量积:ct_mult = (c_{1,0}c_{2,0}, c_{1,0}c_{2,1}+c_{1,1}c_{2,0}, c_{1,1}c_{2,1})
- 重线性化:使用重线性化密钥将3元组密文转换回2元组形式
- 缩放:应用模数切换控制噪声增长
5. 噪声管理与模数切换
5.1 噪声来源分析
CKKS中的噪声主要来自:
- 加密时引入的随机噪声
- 同态运算累积的噪声
- 编码/解码过程中的近似误差
噪声增长规律:
- 加法:噪声线性增长
- 乘法:噪声乘积性增长
5.2 模数切换技术
模数切换(Modulus Switching)通过降低模数q来缩放密文,从而控制噪声。具体步骤:
- 给定密文ct = (c_0, c_1) mod q
- 计算ct' = (⌊(p/q)·c_0⌉, ⌊(p/q)·c_1⌉) mod p
其中p < q,噪声从B降至(p/q)B + O(B_{scale})
6. CKKS方案的实际应用
6.1 参数选择考量
实际部署CKKS时需要考虑:
- 安全参数λ:决定环维度N和模数q的大小
- 计算深度L:决定初始模数q的比特长度
- 精度要求:决定缩放因子Δ的大小
- 性能权衡:更大的N和q提供更高安全性但降低效率
典型参数设置示例:
- N = 2^15
- log(q) = 600(初始模数)
- Δ = 2^40
6.2 实现优化技术
现代CKKS实现采用多种优化:
- 数论变换(NTT)加速多项式乘法
- 懒惰重缩放(Lazy Rescaling)
- 批处理(Batching)技术
- 混合密钥切换策略
7. 数学推导实例
7.1 同态乘法的噪声分析
设两个密文ct_1, ct_2的噪声为e_1, e_2,解密关系为:
ct_i = (b_i, a_i) ≈ (m_i - a_i·s, a_i)
乘法密文ct_mult = (b_1b_2, b_1a_2 + a_1b_2, a_1a_2)满足:
b_1b_2 + (b_1a_2 + a_1b_2)s + a_1a_2s^2 ≈ m_1m_2
通过重线性化将s^2项转换为s的线性项,引入额外噪声e_relin:
ct_mult' ≈ (m_1m_2 - a's, a') + e_relin
7.2 旋转操作的构造
要实现密文向量的循环移位,需要:
- 选择旋转步长k
- 构造对应的自同构映射κ_k : X ↦ X^k
- 使用旋转密钥rk_k处理密文
旋转密钥rk_k包含对s(X^k)的加密,使得可以计算:
ct' = (c_0(X^k), c_1(X^k)) + rk_k ≈ Enc(m(X^k))
8. CKKS的误差控制策略
8.1 动态缩放技术
CKKS采用动态缩放因子Δ,在每次乘法后:
- 执行模数切换将Δ^2缩放到Δ
- 保持相对误差界不变
8.2 精度损失分析
总误差来源包括:
- 初始编码误差:O(√N/Δ)
- 计算累积误差:O(L√N/Δ)(L为计算深度)
- 解密噪声:O(B_{noise}/Δ)
要达到ε精度,需要选择Δ ≈ L√N/ε
9. 安全证明要点
CKKS的安全性归约到RLWE问题,核心论证:
- 公钥(b, a) = (-a·s+e, a)与随机元不可区分
- 密文(c_0, c_1) = (v·b+e_0+m, v·a+e_1)可重写为:
(c_0, c_1) = (-v·a·s + v·e + e_0 + m, v·a + e_1)
这与RLWE样本形式一致
10. 实现中的数值稳定性
在实际实现中需注意:
- 复数FFT的数值精度问题
- 模数切换中的舍入误差累积
- 缩放因子Δ的幂次管理
- 密钥切换中的噪声控制
一个实用的技巧是使用高精度浮点库(如FP128)处理编码/解码阶段的计算,而在同态运算中使用整数算术。
