同态加密:BFV 与 CKKS 方案对比
同态加密(Homomorphic Encryption, HE)回答的是一个近乎科幻的问题:能不能在完全不解密的情况下,对密文直接做计算?云计算时代这个问题的价值不言而喻——把加密数据交给不可信的云端处理,云端完成计算返回加密结果,只有数据主人能用私钥解出答案。本文聚焦两大主流方案:BFV(精确整数算术)与 CKKS(近似浮点算术),讲清它们共享的格密码地基、各自的编码与噪声管理哲学,并用一段纯 Python 教学实现把『密文上加乘确实等价于明文上加乘』以及『噪声预算是有限的』这两个核心事实真正跑出来。
一、同态加密的共同地基:噪声与预算
主流 HE 方案(BFV、CKKS、BGV、TFHE)都建立在 RLWE(环上带误差学习)问题上:密钥和密文都是多项式环上的元素,加密时在明文上混入一个小的随机『噪声』。安全性来自噪声——没有密钥无法在噪声中分离出明文;而每次同态运算(尤其乘法)都会让噪声增长。这就引出了所有 HE 方案共同的核心概念:
- 噪声预算:密文能容忍的噪声总量是有限的,预算耗尽则解密失败;
- 乘法深度:一次同态乘法消耗的预算远大于加法,因此一个密文能承受的『乘法深度』是系统设计的头等约束;
- 管理手段:模切换(modulus switching)逐层降低密文模来压缩噪声;自举(bootstrapping)把噪声彻底重置——代价是数十毫秒的昂贵运算。
BFV 与 CKKS 的分歧不在安全地基,而在数据如何编码进这个带噪声的结构。
二、BFV:把明文放在高位,换精确
BFV(Brakerski-Fan-Vercauteren)的编码方式是把明文乘以一个大缩放因子 DELTA(= 密文模 Q / 明文模 t),放到密文的高位,噪声只占低位:
密文结构: c0 + c1·s ≡ DELTA·m + e (mod Q)
解密: round(v / DELTA) mod t —— 只要 |e| < DELTA/2, 四舍五入精确还原 m
乘法时两个密文做张量乘,乘积中信号变成 DELTA²·m₁·m₂,必须乘 t/q 缩放回一层;同时噪声近似成倍暴涨。由于解密是精确取整,BFV 适合做精确整数运算:计数、求和、比较、数据库谓词。局限是明文域是模 t 的整数环,表达小数要靠定点化,且深乘法电路很快被噪声预算卡住。
三、CKKS:把明文放在小数位,换浮点
CKKS(Cheon-Kim-Kim-Song)换了个哲学:主动接受近似。它把浮点数乘以一个缩放因子 SCALE 后编码,噪声与信号混在同一数量级,解密结果天然带有小误差。换来的是对浮点/实数运算的一等支持——机器学习推理、统计聚合这类本就容忍近似的负载。
代价是另一套预算管理:乘法把缩放因子平方(SCALE²),必须紧跟一次 rescale 把缩放降回 SCALE 并消耗模数链的一级——模数链的层数就是 CKKS 电路的最大乘法深度。下面实验会把两套方案的约束都真实跑出来。
四、动手实验:BFV 与 CKKS 的真实运算
下面代码实现两个教学级方案:BFV 部分用标准 delta 缩放结构做同态加乘,并通过连续平方把噪声一路推到预算耗尽;CKKS 部分演示浮点加乘的近似结果与缩放因子平方问题。为聚焦核心结构,代码做了明确标注的教学简化(标量环代替多项式环、小整数私钥模拟 RLWE 小系数秘密、重线性化用私钥折叠高次项)。零依赖,Python 3 直接运行:
# BFV 核心(教学简化版)
Q, T = 1 << 30, 1 << 6
DELTA = Q // T
def encrypt(s, m):
a = random.randint(0, Q - 1)
e = random.randint(-3, 3)
return [(-(a*s) - e + DELTA*(m % T)) % Q, a]
def decrypt(s, ct):
v, pw = 0, 1
for c in ct:
v = (v + c*pw) % Q; pw = pw*s % Q
return ((v*T + Q//2) // Q) % T
def mul(s, c1, c2):
conv = [0] * (len(c1) + len(c2) - 1)
for i, x in enumerate(c1):
for j, y in enumerate(c2):
conv[i+j] += x * y # 整数环卷积, 不取模(关键)
scaled = [(c*T + Q//2) // Q % Q for c in conv]
base = scaled[:2]
for k in range(2, len(scaled)): # 教学版重线性化: 折叠高次项
base[0] = (base[0] + scaled[k]*pow(s, k, Q)) % Q
return base
在您的服务器(Python 3,无第三方库)上的真实运行输出:
== BFV: add/mul ==
5+7=12 (expect 12) OK
5*7=35 (expect 35) OK
== BFV: noise budget via repeated squaring ==
depth 0: plain= 3 dec= 3 |noise|=2.00e+00 budget=8.4e+06 -> OK
depth 1: plain= 9 dec= 9 |noise|=7.75e+02 budget=8.4e+06 -> OK
depth 2: plain=17 dec=17 |noise|=1.13e+05 budget=8.4e+06 -> OK
depth 3: plain=33 dec=35 |noise|=3.28e+07 budget=8.4e+06 -> FAIL
== CKKS: approximate float ==
3.14+2.0=5.140001 (err 1.30e-06)
3.14*2.0=6.280002 (err 1.51e-06)
mul squares the scale (2^20 -> 2^40); real CKKS rescales back down
PASS: BFV exact w/ finite noise budget; CKKS approximate w/ scale budget
BFV noise budget exhausted at level: 3
五、结果解读
- 密文运算与明文完全一致:BFV 的 5+7=12、5×7=35,CKKS 的 5.14 与 6.28(误差百万分之一量级)——这就是同态加密『不解密也能算』的实证:运算发生在密文结构上,解密后才看到正确明文。
- 噪声预算的耗尽过程清晰可见:连续平方实验中,噪声从 2 → 775 → 11 万 → 3300 万,每乘一次近似暴涨数百倍,第 3 层突破预算上限(DELTA/2 ≈ 840 万)后解密出错(33 被解成 35)。这条曲线就是 HE 系统『乘法深度预算』的直观形态。
- CKKS 的缩放约束:一次乘法把缩放从 2^20 抬到 2^40,信号占掉了 62 位密文模的约 43 位;第二次乘法就需要 2^80,必然溢出。真实 CKKS 靠 rescale 把缩放降回 2^20,同时消耗模数链一级——链有多长,电路就能有多深。
- 一次有教学价值的调错:本文实验的初版乘法解出 0,根因是张量卷积先逐项取模,而信号项 DELTA²·m₁·m₂ 恰好是 Q 的整数倍,在模 Q 下整个湮灭。修正为『卷积在整数环完成、缩放后才取模』即恢复正确。这个错误真实反映了 HE 实现的精细:同一个代数结构,运算顺序错了,安全性不变但正确性全无。
六、BFV vs CKKS:选型对照
- 数据类型:BFV 是模 t 精确整数,CKKS 是近似复数/浮点;
- 误差模型:BFV 解密精确(噪声只要不超预算就不影响结果),CKKS 解密天然带误差且随深度累积;
- 深度预算的形态:BFV 受噪声预算约束(可加模切换延长),CKKS 受模数链层数约束(每层 rescale 消耗一级);
- 典型负载:BFV 适合精确统计、加密数据库查询、电子投票;CKKS 适合加密机器学习推理、加密信号处理;
- 工程库:Microsoft SEAL、OpenFHE、HElib 均同时支持两者;GPU 加速与硬件卸载是当前性能攻坚主线。
七、工程应用
- 隐私计算与数据协作:医疗联合统计、跨机构风控建模——各方数据加密后在密文域完成联合计算,原始数据不出域;
- 加密推理服务:用户把加密的人脸/语音特征发到云端,云端用 CKKS 在密文上跑模型推理,返回加密的预测结果;
- 私有信息检索(PIR):查询加密后发给服务器,服务器在密文上做匹配,不知道用户查了哪条;
- 性能现实的量级感:单次密文乘法比明文慢约 4~6 个数量级,自举更慢——当前实用系统的共同策略是把计算裁剪成浅乘法深度电路(低阶多项式逼近激活函数、模型蒸馏),而不是指望通用计算。
八、常见误区
- 以为 HE 已经是通用计算替代品:实用边界目前是浅深度电路;把任意程序编译成 HE 电路仍是研究前沿,性能远未到生产可用。
- 混淆 BFV 与 CKKS 的适用域:拿 BFV 跑神经网络(大量浮点)会被定点化和深度预算双重卡死;拿 CKKS 做精确计数会被近似误差污染——先想清楚数据类型再选方案。
- 忽略参数选择的连锁反应:多项式次数、密文模、明文模同时决定安全强度、深度预算与性能,参数增大一圈,密文大小和运算成本成倍上升——工程上是安全-深度-性能的三元权衡。
- 认为加密即隐私保护终点:HE 保护的是计算中的数据,不防侧信道(计算模式泄露)、不防恶意云端返回畸形密文——完整系统仍需访问控制与结果完整性校验。
- 低估自举的成本:把自举当常规操作会让延迟从毫秒跳到秒级;优先通过电路设计把深度压在预算内,自举只是兜底。
九、参考文献
- Fan, J., Vercauteren, F. Somewhat Practical Fully Homomorphic Encryption (BFV). IACR ePrint 2012/144.
- Cheon, J. H., Kim, A., Kim, M., Song, Y. Homomorphic Encryption for Arithmetic of Approximate Numbers (CKKS). ASIACRYPT 2017.
- Gentry, C. A Fully Homomorphic Encryption Scheme. PhD thesis, Stanford, 2009.(领域奠基)
- Al Badawi, A. et al. OpenFHE: Open-Source Fully Homomorphic Encryption Library. WAHC 2022.
- Microsoft. SEAL: Simple Encrypted Arithmetic Library. github.com/microsoft/SEAL.