第1章 同态加密概述:定义、历史、分类

大家好,我是这门课的主讲。今天我们聊一个挺酷的话题——同态加密。说白了,它让你能在密文上直接做计算,结果解密后和明文上算的一样。听起来像魔术?嗯,我刚开始接触时也这么觉得。

1.1 什么是同态加密

同态加密(Homomorphic Encryption,HE)是一种加密方案。它允许你拿别人的加密数据(比如用户上传的体检报告),直接在密文上做加法、乘法这类运算,然后算出来的结果还是加密的。只有用私钥解密,才会看到正确的运算结果。

举个通俗例子:你把一个数字锁进保险箱(加密),别人无法打开,但他能隔着保险箱在数字上做加减法(同态运算),最后你打开保险箱,数字已经被改好了。整个过程别人看不到原始数字。

我记得2015年带一个金融风控项目时,甲方说“我们要用加密数据算信用评分,但又不能把解密密钥给云计算平台”。当时我们试了好几个HE库,踩了不少坑。你想想看,如果当时没有HE,要么牺牲隐私,要么自建机房,成本高得吓人。

同态加密的核心门槛在于:它能支持什么样的运算,以及运算的深度。

1.2 发展历程

同态加密的诞生不是一蹴而就的。我习惯把它的历史分三个阶段:

阶段时间标志性工作特点
萌芽期1978 – 2009RSA、ElGamal等部分同态方案只能做加法或乘法中的一种,应用受限
突破期2009 – 2011Gentry 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。它们已经封装好了参数选择、噪声管理,别自己造轮子——轮子损耗比想象的严重。

下面这张图帮你看清同态加密的家族关系:

同态加密分类体系 同态加密 (HE) 部分同态 (PHE) 浅同态 (SHE) 全同态 (FHE) 加法:Paillier 乘法:RSA BGV / BFV(深度可配) Gentry / CKKS 说明 PHE 适合单一运算场景;SHE 在深度已知时可替代 FHE;FHE 虽理论最强,但性能开销仍较高。 工程选型建议:优先考虑 SHE 或 Leveled 方案,除非运算深度不可控。

从这个分类树你能看到:PHE是最早的,但很不灵活;SHE是当前工程落地的甜蜜点;FHE仍然是研究热点,也许再过三五年会有实用化的突破。我去年参加过HE领域的研讨会,有团队在硬件加速上做了不少工作,尤其FPGA上的自举电路,速度提升很可观。

关于分类,还有一点需要提醒:不要把“层次型HE”和“全同态”搞混。层次型HE其实属于浅同态,只是参数调大后可以处理多层电路而已,它并没有自举,所以严格来说不是全同态。

重要警告:选择同态加密方案时,除了看运算类型和深度,还必须考虑密文膨胀率和密钥大小。比如Paillier的密文大约是明文的2倍(公钥加密),而BGV的密文膨胀可能达到几十倍。不要等到上线才发现网络传输拥塞。

好了,这一章把同态加密的来龙去脉、分类框架理清楚了。接下来的章节我们会深入每个方案的数学原理和查询优化技术,那时你会觉得这些基础知识值得花时间搞透。