第1章 同态加密概述:定义、历史、分类
大家好,我是这门课的主讲。今天我们聊一个挺酷的话题——同态加密。说白了,它让你能在密文上直接做计算,结果解密后和明文上算的一样。听起来像魔术?嗯,我刚开始接触时也这么觉得。
1.1 什么是同态加密
同态加密(Homomorphic Encryption,HE)是一种加密方案。它允许你拿别人的加密数据(比如用户上传的体检报告),直接在密文上做加法、乘法这类运算,然后算出来的结果还是加密的。只有用私钥解密,才会看到正确的运算结果。
举个通俗例子:你把一个数字锁进保险箱(加密),别人无法打开,但他能隔着保险箱在数字上做加减法(同态运算),最后你打开保险箱,数字已经被改好了。整个过程别人看不到原始数字。
我记得2015年带一个金融风控项目时,甲方说“我们要用加密数据算信用评分,但又不能把解密密钥给云计算平台”。当时我们试了好几个HE库,踩了不少坑。你想想看,如果当时没有HE,要么牺牲隐私,要么自建机房,成本高得吓人。
同态加密的核心门槛在于:它能支持什么样的运算,以及运算的深度。
1.2 发展历程
同态加密的诞生不是一蹴而就的。我习惯把它的历史分三个阶段:
| 阶段 | 时间 | 标志性工作 | 特点 |
|---|---|---|---|
| 萌芽期 | 1978 – 2009 | RSA、ElGamal等部分同态方案 | 只能做加法或乘法中的一种,应用受限 |
| 突破期 | 2009 – 2011 | Gentry 2009 全同态方案 | 首次理论上实现任意深度计算,但效率极低 |
| 工程化期 | 2011 至今 | BGV、BFV、CKKS 等优化方案 | 性能提升,逐步走向行业落地 |
2009年Gentry那篇我反复读了三遍。他用了“自举”(Bootstrapping)这个神来之笔——把密文噪声“刷新”掉。我当时在实验室复现他的方案,跑一个简单的比特加法要几十秒,心里直呼“这怎么用?” 但后来BGV、CKKS把效率拉高了几个数量级,我才真正觉得这东西有戏。
避坑经验:我曾经接过一个项目,团队选了全同态加密处理全部计算。结果仅一个乘法运算就超时。后来改成部分同态+预处理交互,才跑起来。选型一定要先看业务运算深度,别盲目上全同态。
1.3 分类体系
同态加密按支持的计算能力分三类。我习惯用这个表格记忆:
| 分类 | 缩写 | 支持运算 | 典型方案 |
|---|---|---|---|
| 部分同态加密 | PHE | 加法 或 乘法(单一运算) | Paillier(加法)、RSA(乘法) |
| 浅同态加密 | SHE | 加法和乘法,但深度有限 | BGV(参数限制)、BFV |
| 全同态加密 | FHE | 任意深度加法和乘法 | Gentry、CKKS(浮点近似) |
你可能会问:为什么不全用FHE?效率啊。FHE噪声积累快,需要频繁自举,开销巨大。PHE虽然简单,但只支持一种运算,现实中很难单独用。SHE是个折中——深度可控时性能可接受。我在做医疗数据聚合时就用过SHE,效果不错。
另外还有个容易混淆的概念:层段同态加密(Leveled HE)。它其实是SHE的一种变种,通过设置乘法次数上限来避免自举。我个人觉得它更适合工程落地,因为你可以提前算好运算深度,配置参数即可。
1.4 一个简单示例:加法同态
为了帮你直观理解,我用Paillier加法的伪代码示意:
# 密钥生成(简化)
(pk, sk) = Paillier.KeyGen()
# 加密两个整数
ct1 = Paillier.Encrypt(pk, 5)
ct2 = Paillier.Encrypt(pk, 10)
# 在密文上直接相加(同态加法)
ct_sum = ct1 * ct2 // 密文乘法对应明文加法
# 解密结果
result = Paillier.Decrypt(sk, ct_sum) // 输出 15
看到了吗?密文上做的乘法,反映到明文就是加法。这个性质在电子投票、计费系统里非常实用。我当时调研时一度想用在用户点击聚合上,后来发现Paillier的密文膨胀率太大,一个整数会变成1024位,最终换了BGV。
Tips:正式开发时建议用成熟的HE库,比如Microsoft SEAL、Palisade、HElib。它们已经封装好了参数选择、噪声管理,别自己造轮子——轮子损耗比想象的严重。
下面这张图帮你看清同态加密的家族关系:
从这个分类树你能看到:PHE是最早的,但很不灵活;SHE是当前工程落地的甜蜜点;FHE仍然是研究热点,也许再过三五年会有实用化的突破。我去年参加过HE领域的研讨会,有团队在硬件加速上做了不少工作,尤其FPGA上的自举电路,速度提升很可观。
关于分类,还有一点需要提醒:不要把“层次型HE”和“全同态”搞混。层次型HE其实属于浅同态,只是参数调大后可以处理多层电路而已,它并没有自举,所以严格来说不是全同态。
重要警告:选择同态加密方案时,除了看运算类型和深度,还必须考虑密文膨胀率和密钥大小。比如Paillier的密文大约是明文的2倍(公钥加密),而BGV的密文膨胀可能达到几十倍。不要等到上线才发现网络传输拥塞。
好了,这一章把同态加密的来龙去脉、分类框架理清楚了。接下来的章节我们会深入每个方案的数学原理和查询优化技术,那时你会觉得这些基础知识值得花时间搞透。