一句话版本
同态加密让别人不解密就能直接对密文做运算 ,而且算出来的密文解密后,恰好等于对明文做同样运算的结果。
用抽象代数的语言说:解密映射 D e c \mathrm{Dec} Dec 在"合法密文"上(近似地)是一个环同态 ,即
D e c ( c 1 + c 2 ) = D e c ( c 1 ) + D e c ( c 2 ) , D e c ( c 1 ⋅ c 2 ) = D e c ( c 1 ) ⋅ D e c ( c 2 ) . \mathrm{Dec}(c_1 + c_2) = \mathrm{Dec}(c_1) + \mathrm{Dec}(c_2),\qquad \mathrm{Dec}(c_1 \cdot c_2) = \mathrm{Dec}(c_1)\cdot \mathrm{Dec}(c_2). Dec ( c 1 + c 2 ) = Dec ( c 1 ) + Dec ( c 2 ) , Dec ( c 1 ⋅ c 2 ) = Dec ( c 1 ) ⋅ Dec ( c 2 ) .
全文分三层:
通俗理解 :不需要任何数学
实际用处 :隐私云计算、医疗与基因、银行联合风控、隐私机器学习、电子投票、私有信息检索,以及业界现状和性能代价
数学原理 :RSA、Paillier、ElGamal、环同态、LWE/RLWE、噪声、模切换、自举、BGV/BFV/CKKS,并附小数字手算例子
第一层:通俗理解
1.1 带着手套操作上锁的箱子
想象一个珠宝商,手下有个工匠,但珠宝商不信任他,怕他偷金子。于是珠宝商这样安排:
把金料放进一个上了锁的透明手套箱 ,箱子侧面伸出一副手套。
工匠把手伸进手套,可以在箱子里把金料熔化、拉丝、焊接成项链。
但工匠打不开锁 ,所以碰不到金子,也拿不走。
做完后箱子还给珠宝商,只有珠宝商有钥匙,打开就得到成品。
对应关系:
比喻
同态加密里的东西
金料
你的私密数据(明文)
上锁的手套箱
密文
工匠
云服务器 / 第三方
隔着手套干活
对密文做运算
钥匙
私钥,只有你有
成品项链
运算结果,解密后才能看到
关键在于:工匠全程都在干活,却从头到尾不知道金子长什么样 。普通加密只能做到"锁起来存放和运输",一旦要计算就必须先开锁;同态加密做到了"锁着也能加工"。
1.2 什么叫"直接对密文做运算"
用一个最简单的例子说明。你有两个数 3 3 3 和 5 5 5 ,想让云服务器帮你算 3 + 5 3+5 3 + 5 ,但又不想让服务器知道这两个数。
服务器看到的只是两串乱码,它对乱码执行某种"密文加法",得到第三串乱码。你把第三串乱码解密,得到的恰好是 8 8 8 。服务器既不知道输入是 3 3 3 和 5 5 5 ,也不知道结果是 8 8 8 。
注意,"密文加法"一般不是 把两串数字直接相加。对 Paillier 来说,它是把两个密文相乘 ;对格密码方案来说,它确实是向量或多项式的相加。具体是什么运算取决于方案,第三层会讲。
1.3 三个级别:PHE、SHE、FHE
任何计算最终都能拆成加法和乘法 (在比特上就是异或和与门),所以关键问题是:密文上能做哪些运算,能做多少次。
类型
全称
能做什么
典型例子
PHE
Partially Homomorphic Encryption,部分同态
只支持一种 运算(只能加,或只能乘),但次数不限
RSA(乘)、ElGamal(乘)、Paillier(加)
SHE
Somewhat Homomorphic Encryption,某种程度同态
加法和乘法都支持,但次数有限 ,做多了就解不开
Gentry 之前的一些格方案、不带自举的 BGV/BFV
FHE
Fully Homomorphic Encryption,全同态
加法和乘法都支持,次数不限 ,可以算任意函数
Gentry 2009 起的方案;带自举的 BGV/BFV/CKKS、TFHE
可以这样记:
PHE :手套箱里只有一把锤子,能一直敲,但只能敲。
SHE :工具齐全,但每做一步箱子里就积一点灰(数学上叫噪声 ),灰积到一定程度就看不清了,再也打不开。
FHE :在 SHE 的基础上加一个"不开锁也能除灰"的办法(自举 ,bootstrapping),于是可以无限干下去。
历史小插曲
1978 年,RSA 的发明人 Rivest、Adleman 与 Dertouzos 一起提出了"privacy homomorphism"的设想,问能不能对加密数据做任意计算。这个问题悬了 31 年 ,直到 2009 年 Craig Gentry 在博士论文里给出第一个全同态加密方案。
1.4 为什么叫"同态"
"同态"(homomorphism)是数学词,字面意思是"相同的形状"。在抽象代数里,环同态 φ : R → S \varphi: R \to S φ : R → S 是满足
φ ( a + b ) = φ ( a ) + φ ( b ) , φ ( a b ) = φ ( a ) φ ( b ) \varphi(a+b) = \varphi(a) + \varphi(b),\qquad \varphi(ab) = \varphi(a)\varphi(b) φ ( a + b ) = φ ( a ) + φ ( b ) , φ ( ab ) = φ ( a ) φ ( b )
的映射。它把 R R R 中的运算"搬运"到 S S S 中:先运算再映射,等于先映射再运算 。
同态加密说的正是这件事。只是方向通常反过来看:从密文映射到明文的解密 保持运算,即
D e c ( c 1 ⊕ c 2 ) = D e c ( c 1 ) + D e c ( c 2 ) , D e c ( c 1 ⊗ c 2 ) = D e c ( c 1 ) ⋅ D e c ( c 2 ) , \mathrm{Dec}(c_1 \oplus c_2) = \mathrm{Dec}(c_1) + \mathrm{Dec}(c_2),\qquad \mathrm{Dec}(c_1 \otimes c_2) = \mathrm{Dec}(c_1)\cdot \mathrm{Dec}(c_2), Dec ( c 1 ⊕ c 2 ) = Dec ( c 1 ) + Dec ( c 2 ) , Dec ( c 1 ⊗ c 2 ) = Dec ( c 1 ) ⋅ Dec ( c 2 ) ,
其中 ⊕ , ⊗ \oplus, \otimes ⊕ , ⊗ 是密文空间里对应的运算。换句话说,"在密文世界算"和"在明文世界算"是同一个形状,所以叫同态。
不过严格讲,现代全同态方案里的解密只是一个近似 的同态,因为每次运算都会带进一点噪声,这一点在第三层细讲。
第二层:实际用处
2.1 隐私云计算(外包计算)
这是同态加密最原始的动机。公司想用云上的算力,但数据是敏感的(财务、病历、用户行为):
传统做法:上传明文,或者在云上解密后再算,于是云厂商和入侵云的黑客都能看到数据。
同态加密:上传密文,云在密文上算完把密文结果发回来,云从头到尾只碰过密文 。
它保护的是"使用中的数据"(data in use)。传输加密(TLS)保护"传输中的数据",磁盘加密保护"静止的数据",计算的那一刻正好是这两者都管不到的空白。
2.2 医疗和基因数据分析
医院和研究机构之间的数据共享受法律严格限制(如美国 HIPAA、欧盟 GDPR)。同态加密可以让:
多家医院把加密后的病历汇总,研究者在密文上做统计(均值、回归、卡方检验);
个人把加密的基因组发给检测公司,公司在密文上比对疾病风险位点,只有本人能看到报告。
学术界从 2014 年起每年举办 iDASH 隐私保护基因组分析竞赛,同态加密一直是主要赛道之一,题目包括密文上的全基因组关联分析(GWAS)和逻辑回归训练。
2.3 银行之间的联合风控与反洗钱
洗钱者常把资金拆散在多家银行之间流转,每家银行只看到自己那一段,看不出全貌;但银行之间又不能随便共享客户数据。
同态加密的用法是:各家银行把交易特征加密后交给一个联合分析方,在密文上拼出跨行的资金流图、计算风险评分,最后只把"这个账户可疑"这一结论解密出来。类似的思路也用于联合信用评分和跨机构黑名单查询。实际系统里,同态加密常和安全多方计算 (MPC)、私有集合求交 (PSI)一起使用。
2.4 隐私机器学习推理
模型在服务器上,数据在用户手里,双方都不想把自己的东西交出去:
用户把输入(比如一张胸片、一段语音特征)加密后发给服务器;
服务器用明文模型 在密文输入 上跑推理,矩阵乘法用同态加法和乘法实现;
返回加密的预测结果,只有用户能解密。
难点在于激活函数。ReLU、sigmoid 这类非多项式函数不能直接算,常见办法是用低次多项式近似(CKKS 擅长这个),或者用 TFHE 的可编程自举(programmable bootstrapping)直接查表。Zama 的 Concrete ML 就是把 scikit-learn 和 PyTorch 模型自动编译成 FHE 电路的工具。
2.5 电子投票
投票是同态加密最早的成功应用之一,用的是加法同态 :
每张选票是 E n c ( 0 ) \mathrm{Enc}(0) Enc ( 0 ) 或 E n c ( 1 ) \mathrm{Enc}(1) Enc ( 1 ) ;
计票方把所有密文"加"起来,得到 E n c ( 总票数 ) \mathrm{Enc}(\text{总票数}) Enc ( 总票数 ) ;
只解密总数,任何单张选票都不会被解密 。
开源的 Helios 投票系统就采用指数 ElGamal(见 3.3 节)来做同态计票,并配合零知识证明,确保每张选票确实是 0 0 0 或 1 1 1 ,而不是 E n c ( 1000 ) \mathrm{Enc}(1000) Enc ( 1000 ) 这种作弊票。
2.6 私有信息检索(PIR)
你想从一个公开数据库里查一条记录,又不想让数据库知道你查的是哪一条。
用同态加密的办法:把查询编码成一个加密的"选择向量" E n c ( 0 ) , … , E n c ( 1 ) , … , E n c ( 0 ) \mathrm{Enc}(0), \dots, \mathrm{Enc}(1), \dots, \mathrm{Enc}(0) Enc ( 0 ) , … , Enc ( 1 ) , … , Enc ( 0 ) (只有第 i i i 位是 1 1 1 ),服务器计算
∑ j E n c ( e j ) ⋅ D B j = E n c ( D B i ) . \sum_j \mathrm{Enc}(e_j)\cdot \mathrm{DB}_j = \mathrm{Enc}(\mathrm{DB}_i). j ∑ Enc ( e j ) ⋅ DB j = Enc ( DB i ) .
服务器对每条记录都做了同样的操作,所以完全不知道 i i i 是多少。实际方案会把选择向量压缩、递归分层,以降低通信量。
2.7 业界现状
1978 RSA 被发现有乘法同态 Rivest 等提出 privacy homomorphism 1985 ElGamal 1999 Paillier 加法同态 2005 Regev 提出 LWE 问题 2009 Gentry 第一个全同态方案(自举) 2011-2012 BGV、BFV 2016 TFHE(快速自举) 2017 CKKS(近似实数运算) 2024 Apple 在 iOS 18 中部署(Live Caller ID Lookup) 同态加密发展简史
主要开源库
库
维护方
支持的方案
特点
Microsoft SEAL
微软研究院
BFV、BGV、CKKS
C++,文档好,入门首选
OpenFHE
社区(PALISADE 的后继,有 DARPA 资助背景)
BGV、BFV、CKKS、FHEW、TFHE 类方案
功能最全,支持多种自举与方案切换
TFHE-rs / Concrete
Zama(法国)
TFHE
Rust,布尔和整数电路,可编程自举,也用于区块链上的加密智能合约(fhEVM)
HElib
IBM
BGV、CKKS
较早的实现
Lattigo
Tune Insight / EPFL
BFV、BGV、CKKS
Go 语言,支持多方(门限)同态
swift-homomorphic-encryption
Apple
BFV
用于 Apple 自己的 PIR 部署
真实部署:Apple
Live Caller ID Lookup (iOS 18,2024):来电时,手机要向服务器查询"这个号码是谁、是不是骚扰电话"。Apple 用基于 BFV 的私有信息检索,手机发出的是加密后的号码查询 ,服务器在密文上完成查表,返回加密结果,服务器不知道你接到了谁的电话。
Enhanced Visual Search (照片里识别地标):同样用同态加密做加密的最近邻搜索,配合差分隐私和匿名网络中继。
此外,Google 开源了 FHE 编译器(HEIR 等),Intel 提供了加速库 HEXL,DARPA 的 DPRIVE 项目在资助专用的 FHE 加速芯片。标准化方面,ISO/IEC 18033-6 已经收录了 ElGamal 和 Paillier 这类部分同态方案,全同态方案的标准化(由 HomomorphicEncryption.org 社区推动)还在进行中。
2.8 性能代价
同态加密的主要问题是慢 和大 。
维度
代价(量级,随方案、参数、硬件差别很大)
计算速度
比明文计算慢大约 10 3 10^3 1 0 3 到 10 6 10^6 1 0 6 倍
密文膨胀
一个 RLWE 密文常有几百 KB 到几 MB
自举
最昂贵的操作。TFHE 单比特自举在 CPU 上是毫秒量级;CKKS 自举一次可能要几秒到几十秒,但一次处理上千个槽
编程难度
只能写成"电路":没有数据相关的分支(if x > 0 必须改写成多项式或查表),循环次数要固定
举个数量级的例子:参数 n = 2 14 n = 2^{14} n = 2 14 、log 2 q ≈ 438 \log_2 q \approx 438 log 2 q ≈ 438 时,一个密文由两个多项式组成,大小约为
2 × 2 14 × 438 bit ≈ 1.4 × 10 7 bit ≈ 1.8 MB . 2 \times 2^{14} \times 438 \ \text{bit} \approx 1.4\times 10^{7}\ \text{bit} \approx 1.8\ \text{MB}. 2 × 2 14 × 438 bit ≈ 1.4 × 1 0 7 bit ≈ 1.8 MB .
好在借助批处理 (batching,见 3.7 节),一个密文可以同时装几千个数做 SIMD 并行运算,摊下来的代价会低很多。
为什么还值得用
在"数据绝对不能离开某个范围"的场景(医疗、金融、政府、跨国数据流动),能用就比不能用好;而且很多应用(PIR、投票、简单统计、小模型推理)只需要浅层电路,开销完全可以接受。
第三层:数学原理
3.1 RSA 的乘法同态
教科书式 RSA :选两个大素数 p , q p, q p , q ,令 n = p q n = pq n = pq ,φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) = (p-1)(q-1) φ ( n ) = ( p − 1 ) ( q − 1 ) ,取 e e e 满足 gcd ( e , φ ( n ) ) = 1 \gcd(e, \varphi(n)) = 1 g cd( e , φ ( n )) = 1 ,再取 d ≡ e − 1 ( m o d φ ( n ) ) d \equiv e^{-1} \pmod{\varphi(n)} d ≡ e − 1 ( mod φ ( n )) 。
E n c ( m ) = m e m o d n , D e c ( c ) = c d m o d n . \mathrm{Enc}(m) = m^e \bmod n,\qquad \mathrm{Dec}(c) = c^d \bmod n. Enc ( m ) = m e mod n , Dec ( c ) = c d mod n .
乘法同态 几乎是显然的:
E n c ( a ) ⋅ E n c ( b ) = a e b e = ( a b ) e = E n c ( a b ) ( m o d n ) . \mathrm{Enc}(a)\cdot \mathrm{Enc}(b) = a^e b^e = (ab)^e = \mathrm{Enc}(ab) \pmod n. Enc ( a ) ⋅ Enc ( b ) = a e b e = ( ab ) e = Enc ( ab ) ( mod n ) .
用抽象代数的语言说,x ↦ x e x \mapsto x^e x ↦ x e 是乘法幺半群 ( Z n , ⋅ ) (\mathbb{Z}_n, \cdot) ( Z n , ⋅ ) 到自身的同态(限制到单位群 Z n × \mathbb{Z}_n^\times Z n × 上是群自同构)。但它不保持加法 :一般 ( a + b ) e ≠ a e + b e (a+b)^e \neq a^e + b^e ( a + b ) e = a e + b e 。所以 RSA 只是 PHE。
手算例子:RSA 乘法同态
取 p = 5 p = 5 p = 5 ,q = 11 q = 11 q = 11 ,则 n = 55 n = 55 n = 55 ,φ ( n ) = 40 \varphi(n) = 40 φ ( n ) = 40 。取 e = 3 e = 3 e = 3 ,由 3 ⋅ 27 = 81 ≡ 1 ( m o d 40 ) 3 \cdot 27 = 81 \equiv 1 \pmod{40} 3 ⋅ 27 = 81 ≡ 1 ( mod 40 ) 得 d = 27 d = 27 d = 27 。
E n c ( 2 ) = 2 3 = 8 \mathrm{Enc}(2) = 2^3 = 8 Enc ( 2 ) = 2 3 = 8
E n c ( 3 ) = 3 3 = 27 \mathrm{Enc}(3) = 3^3 = 27 Enc ( 3 ) = 3 3 = 27
密文相乘:8 ⋅ 27 = 216 ≡ 216 − 3 ⋅ 55 = 51 ( m o d 55 ) 8 \cdot 27 = 216 \equiv 216 - 3\cdot 55 = 51 \pmod{55} 8 ⋅ 27 = 216 ≡ 216 − 3 ⋅ 55 = 51 ( mod 55 )
直接加密 6 6 6 :6 3 = 216 ≡ 51 ( m o d 55 ) 6^3 = 216 \equiv 51 \pmod{55} 6 3 = 216 ≡ 51 ( mod 55 ) ,两者一致
解密:51 27 ≡ 6 ( m o d 55 ) 51^{27} \equiv 6 \pmod{55} 5 1 27 ≡ 6 ( mod 55 )
所以 E n c ( 2 ) ⋅ E n c ( 3 ) = E n c ( 6 ) \mathrm{Enc}(2)\cdot\mathrm{Enc}(3) = \mathrm{Enc}(6) Enc ( 2 ) ⋅ Enc ( 3 ) = Enc ( 6 ) ,即 E n c ( 2 ) E n c ( 3 ) = E n c ( 2 ⋅ 3 ) \mathrm{Enc}(2)\,\mathrm{Enc}(3) = \mathrm{Enc}(2\cdot 3) Enc ( 2 ) Enc ( 3 ) = Enc ( 2 ⋅ 3 ) 。(已用 Python 验算。)
为什么教科书式 RSA 不安全
确定性 :同一个 m m m 每次加密结果都一样。如果明文空间很小(比如投票只有"是/否"),攻击者把所有可能的明文都加密一遍对照就能破解。安全的公钥加密必须是随机化 的,才能达到语义安全(IND-CPA)。
可延展性 (malleability):攻击者不知道 m m m ,但可以把 c c c 换成 c ⋅ 2 e c \cdot 2^e c ⋅ 2 e ,于是对方解密得到 2 m 2m 2 m 。在"转账金额"这类场景里这是灾难。注意,同态性本身就是可延展性 ,所以任何同态加密都不可能达到最强的 IND-CCA2 安全,只能追求 IND-CPA。
小明文攻击 :若 e = 3 e = 3 e = 3 且 m 3 < n m^3 < n m 3 < n ,则 c = m 3 c = m^3 c = m 3 在整数上根本没取模,直接开立方根就得到 m m m 。
实际使用的 RSA 都会先做随机填充(如 OAEP),而填充恰好破坏了同态性 。所以 RSA 的同态性更多是教学例子,而不是实用工具。
3.2 Paillier:加法同态
Paillier(1999)是最常用的加法同态方案,基于合数剩余假设 :在 Z n 2 × \mathbb{Z}_{n^2}^\times Z n 2 × 中区分 "n n n 次幂" 与 "随机元" 是困难的。
密钥生成 :取大素数 p , q p, q p , q ,n = p q n = pq n = pq ,λ = lcm ( p − 1 , q − 1 ) \lambda = \operatorname{lcm}(p-1, q-1) λ = lcm ( p − 1 , q − 1 ) ,g = n + 1 g = n + 1 g = n + 1 。定义 L ( x ) = x − 1 n L(x) = \dfrac{x - 1}{n} L ( x ) = n x − 1 ,并令 μ = λ − 1 m o d n \mu = \lambda^{-1} \bmod n μ = λ − 1 mod n 。公钥 ( n , g ) (n, g) ( n , g ) ,私钥 ( λ , μ ) (\lambda, \mu) ( λ , μ ) 。
加密 :明文 m ∈ Z n m \in \mathbb{Z}_n m ∈ Z n ,随机选 r ∈ Z n × r \in \mathbb{Z}_n^\times r ∈ Z n × ,
E n c ( m ; r ) = g m r n m o d n 2 . \mathrm{Enc}(m; r) = g^m r^n \bmod n^2. Enc ( m ; r ) = g m r n mod n 2 .
解密 :
D e c ( c ) = L ( c λ m o d n 2 ) ⋅ μ m o d n . \mathrm{Dec}(c) = L\!\left(c^\lambda \bmod n^2\right)\cdot \mu \bmod n. Dec ( c ) = L ( c λ mod n 2 ) ⋅ μ mod n .
为什么能解密 :
二项式定理给出 ( 1 + n ) m = ∑ k ( m k ) n k ≡ 1 + m n ( m o d n 2 ) (1+n)^m = \sum_k \binom{m}{k} n^k \equiv 1 + mn \pmod{n^2} ( 1 + n ) m = ∑ k ( k m ) n k ≡ 1 + mn ( mod n 2 ) ,因为 n 2 n^2 n 2 及更高次项都消失了。
由中国剩余定理 Z n 2 × ≅ Z p 2 × × Z q 2 × \mathbb{Z}_{n^2}^\times \cong \mathbb{Z}_{p^2}^\times \times \mathbb{Z}_{q^2}^\times Z n 2 × ≅ Z p 2 × × Z q 2 × ,两个因子的阶 p ( p − 1 ) p(p-1) p ( p − 1 ) 、q ( q − 1 ) q(q-1) q ( q − 1 ) 都整除 n λ n\lambda nλ ,所以每个元素的阶都整除 n λ n\lambda nλ ,即 r n λ ≡ 1 ( m o d n 2 ) r^{n\lambda} \equiv 1 \pmod{n^2} r nλ ≡ 1 ( mod n 2 ) 。
于是 c λ = ( 1 + n ) m λ r n λ ≡ 1 + m λ n ( m o d n 2 ) c^\lambda = (1+n)^{m\lambda} r^{n\lambda} \equiv 1 + m\lambda n \pmod{n^2} c λ = ( 1 + n ) mλ r nλ ≡ 1 + mλn ( mod n 2 ) ,L ( c λ ) = m λ m o d n L(c^\lambda) = m\lambda \bmod n L ( c λ ) = mλ mod n ,再乘 μ = λ − 1 \mu = \lambda^{-1} μ = λ − 1 就得到 m m m 。
加法同态 :
E n c ( m 1 ; r 1 ) ⋅ E n c ( m 2 ; r 2 ) = g m 1 + m 2 ( r 1 r 2 ) n = E n c ( m 1 + m 2 ; r 1 r 2 ) ( m o d n 2 ) . \mathrm{Enc}(m_1; r_1)\cdot\mathrm{Enc}(m_2; r_2) = g^{m_1+m_2}(r_1 r_2)^n = \mathrm{Enc}(m_1 + m_2;\ r_1 r_2) \pmod{n^2}. Enc ( m 1 ; r 1 ) ⋅ Enc ( m 2 ; r 2 ) = g m 1 + m 2 ( r 1 r 2 ) n = Enc ( m 1 + m 2 ; r 1 r 2 ) ( mod n 2 ) .
密文乘法对应明文加法 。顺带还有数乘 :E n c ( m ) k = E n c ( k m ) \mathrm{Enc}(m)^k = \mathrm{Enc}(km) Enc ( m ) k = Enc ( k m ) 。所以 Paillier 能算"加密数据的线性组合",比如加权求和、平均值,但不能算两个密文明文的乘积。
群同态视角
映射 Z n × Z n × → Z n 2 × \mathbb{Z}_n \times \mathbb{Z}_n^\times \to \mathbb{Z}_{n^2}^\times Z n × Z n × → Z n 2 × ,( m , r ) ↦ g m r n (m, r) \mapsto g^m r^n ( m , r ) ↦ g m r n 是一个群同构 :左边的运算是 ( m 1 , r 1 ) ⋅ ( m 2 , r 2 ) = ( m 1 + m 2 , r 1 r 2 ) (m_1, r_1)\cdot(m_2, r_2) = (m_1 + m_2,\ r_1 r_2) ( m 1 , r 1 ) ⋅ ( m 2 , r 2 ) = ( m 1 + m 2 , r 1 r 2 ) ,右边是乘法。两边的阶都是 n φ ( n ) n\varphi(n) n φ ( n ) 。Paillier 的加法同态就是这个同构的直接推论。
手算例子:Paillier 加法同态
取 p = 5 p = 5 p = 5 ,q = 7 q = 7 q = 7 ,则 n = 35 n = 35 n = 35 ,n 2 = 1225 n^2 = 1225 n 2 = 1225 ,g = 36 g = 36 g = 36 ,λ = lcm ( 4 , 6 ) = 12 \lambda = \operatorname{lcm}(4, 6) = 12 λ = lcm ( 4 , 6 ) = 12 。
由于 g λ = ( 1 + n ) 12 ≡ 1 + 12 n g^\lambda = (1+n)^{12} \equiv 1 + 12n g λ = ( 1 + n ) 12 ≡ 1 + 12 n ,L ( g λ ) = 12 L(g^\lambda) = 12 L ( g λ ) = 12 ,所以 μ = 12 − 1 m o d 35 = 3 \mu = 12^{-1} \bmod 35 = 3 μ = 1 2 − 1 mod 35 = 3 (因为 12 ⋅ 3 = 36 ≡ 1 12 \cdot 3 = 36 \equiv 1 12 ⋅ 3 = 36 ≡ 1 )。
加密 m 1 = 4 m_1 = 4 m 1 = 4 ,取 r 1 = 2 r_1 = 2 r 1 = 2 :
g 4 ≡ 1 + 4 ⋅ 35 = 141 ( m o d 1225 ) g^{4} \equiv 1 + 4\cdot 35 = 141 \pmod{1225} g 4 ≡ 1 + 4 ⋅ 35 = 141 ( mod 1225 )
2 35 ≡ 18 ( m o d 1225 ) 2^{35} \equiv 18 \pmod{1225} 2 35 ≡ 18 ( mod 1225 )
c 1 = 141 ⋅ 18 = 2538 ≡ 88 ( m o d 1225 ) c_1 = 141 \cdot 18 = 2538 \equiv 88 \pmod{1225} c 1 = 141 ⋅ 18 = 2538 ≡ 88 ( mod 1225 )
加密 m 2 = 6 m_2 = 6 m 2 = 6 ,取 r 2 = 3 r_2 = 3 r 2 = 3 :
g 6 ≡ 1 + 6 ⋅ 35 = 211 ( m o d 1225 ) g^{6} \equiv 1 + 6\cdot 35 = 211 \pmod{1225} g 6 ≡ 1 + 6 ⋅ 35 = 211 ( mod 1225 )
3 35 ≡ 607 ( m o d 1225 ) 3^{35} \equiv 607 \pmod{1225} 3 35 ≡ 607 ( mod 1225 )
c 2 = 211 ⋅ 607 = 128077 ≡ 677 ( m o d 1225 ) c_2 = 211 \cdot 607 = 128077 \equiv 677 \pmod{1225} c 2 = 211 ⋅ 607 = 128077 ≡ 677 ( mod 1225 )
密文相乘 :c = c 1 c 2 = 88 ⋅ 677 = 59576 ≡ 776 ( m o d 1225 ) c = c_1 c_2 = 88 \cdot 677 = 59576 \equiv 776 \pmod{1225} c = c 1 c 2 = 88 ⋅ 677 = 59576 ≡ 776 ( mod 1225 )
解密 c c c :
776 12 ≡ 526 ( m o d 1225 ) 776^{12} \equiv 526 \pmod{1225} 77 6 12 ≡ 526 ( mod 1225 )
L ( 526 ) = 526 − 1 35 = 15 L(526) = \dfrac{526 - 1}{35} = 15 L ( 526 ) = 35 526 − 1 = 15
15 ⋅ 3 = 45 ≡ 10 ( m o d 35 ) 15 \cdot 3 = 45 \equiv 10 \pmod{35} 15 ⋅ 3 = 45 ≡ 10 ( mod 35 )
得到 10 = 4 + 6 10 = 4 + 6 10 = 4 + 6 。作为对照,单独解密 c 1 c_1 c 1 :88 12 ≡ 456 88^{12} \equiv 456 8 8 12 ≡ 456 ,L ( 456 ) = 13 L(456) = 13 L ( 456 ) = 13 ,13 ⋅ 3 = 39 ≡ 4 13\cdot 3 = 39 \equiv 4 13 ⋅ 3 = 39 ≡ 4 ,正确。
两点补充 (均已用 Python 验算):
数乘:c 1 3 ≡ 372 ( m o d 1225 ) c_1^3 \equiv 372 \pmod{1225} c 1 3 ≡ 372 ( mod 1225 ) ,解密得 12 = 3 ⋅ 4 12 = 3 \cdot 4 12 = 3 ⋅ 4 。
明文是在 Z 35 \mathbb{Z}_{35} Z 35 里加的:E n c ( 30 ) ⋅ E n c ( 10 ) \mathrm{Enc}(30)\cdot\mathrm{Enc}(10) Enc ( 30 ) ⋅ Enc ( 10 ) 解密得 40 m o d 35 = 5 40 \bmod 35 = 5 40 mod 35 = 5 ,所以实际使用时 n n n 必须远大于可能的结果。
3.3 ElGamal:乘法同态,以及"指数"版本的加法同态
设 G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ 是一个离散对数困难的循环群(如 Z p × \mathbb{Z}_p^\times Z p × 的子群或椭圆曲线群)。私钥 x x x ,公钥 h = g x h = g^x h = g x 。
E n c ( m ; k ) = ( g k , m h k ) , D e c ( c 1 , c 2 ) = c 2 ⋅ c 1 − x . \mathrm{Enc}(m; k) = (g^k,\ m h^k),\qquad \mathrm{Dec}(c_1, c_2) = c_2 \cdot c_1^{-x}. Enc ( m ; k ) = ( g k , m h k ) , Dec ( c 1 , c 2 ) = c 2 ⋅ c 1 − x .
它天然是随机化的(每次选新的 k k k ),在 DDH 假设下是 IND-CPA 安全的。分量相乘得到
( g k 1 , m 1 h k 1 ) ⋅ ( g k 2 , m 2 h k 2 ) = ( g k 1 + k 2 , m 1 m 2 h k 1 + k 2 ) = E n c ( m 1 m 2 ; k 1 + k 2 ) , (g^{k_1}, m_1 h^{k_1})\cdot (g^{k_2}, m_2 h^{k_2}) = (g^{k_1+k_2},\ m_1 m_2\, h^{k_1+k_2}) = \mathrm{Enc}(m_1 m_2;\ k_1 + k_2), ( g k 1 , m 1 h k 1 ) ⋅ ( g k 2 , m 2 h k 2 ) = ( g k 1 + k 2 , m 1 m 2 h k 1 + k 2 ) = Enc ( m 1 m 2 ; k 1 + k 2 ) ,
所以 ElGamal 是乘法同态 的。
手算例子:ElGamal
取 p = 23 p = 23 p = 23 ,g = 5 g = 5 g = 5 (Z 23 × \mathbb{Z}_{23}^\times Z 23 × 的生成元),私钥 x = 6 x = 6 x = 6 ,公钥 h = 5 6 ≡ 8 ( m o d 23 ) h = 5^6 \equiv 8 \pmod{23} h = 5 6 ≡ 8 ( mod 23 ) 。
E n c ( 3 ; k = 2 ) = ( 5 2 , 3 ⋅ 8 2 ) ≡ ( 2 , 8 ) \mathrm{Enc}(3; k=2) = (5^2,\ 3\cdot 8^2) \equiv (2,\ 8) Enc ( 3 ; k = 2 ) = ( 5 2 , 3 ⋅ 8 2 ) ≡ ( 2 , 8 )
E n c ( 4 ; k = 7 ) = ( 5 7 , 4 ⋅ 8 7 ) ≡ ( 17 , 2 ) \mathrm{Enc}(4; k=7) = (5^7,\ 4\cdot 8^7) \equiv (17,\ 2) Enc ( 4 ; k = 7 ) = ( 5 7 , 4 ⋅ 8 7 ) ≡ ( 17 , 2 )
分量相乘:( 2 ⋅ 17 , 8 ⋅ 2 ) ≡ ( 11 , 16 ) (2\cdot 17,\ 8 \cdot 2) \equiv (11,\ 16) ( 2 ⋅ 17 , 8 ⋅ 2 ) ≡ ( 11 , 16 )
解密:11 6 ≡ 9 11^6 \equiv 9 1 1 6 ≡ 9 ,9 − 1 ≡ 18 9^{-1} \equiv 18 9 − 1 ≡ 18 ,16 ⋅ 18 = 288 ≡ 12 ( m o d 23 ) 16 \cdot 18 = 288 \equiv 12 \pmod{23} 16 ⋅ 18 = 288 ≡ 12 ( mod 23 )
得到 12 = 3 ⋅ 4 12 = 3 \cdot 4 12 = 3 ⋅ 4 。(已用 Python 验算。)
指数 ElGamal :把明文放到指数上,加密 g m g^m g m 而不是 m m m :
E n c ( m ; k ) = ( g k , g m h k ) . \mathrm{Enc}(m; k) = (g^k,\ g^m h^k). Enc ( m ; k ) = ( g k , g m h k ) .
这样相乘得到 g m 1 + m 2 g^{m_1+m_2} g m 1 + m 2 ,就变成了加法同态 。代价是解密只能得到 g m g^m g m ,还要再解一个离散对数才能拿到 m m m ,所以只适合 m m m 很小的情况。投票计票正好满足这一点(总票数不超过选民人数),这就是 Helios 的做法。
PHE 的共同局限
RSA、Paillier、ElGamal 都只有一种 运算,而且安全性都基于大整数分解或离散对数,会被量子计算机上的 Shor 算法攻破 。下面的格方案同时解决了这两个问题。
3.4 环同态,以及加密为什么只是"近似环同态"
回顾定义:环 R , S R, S R , S 之间的映射 φ : R → S \varphi: R \to S φ : R → S 若满足
φ ( a + b ) = φ ( a ) + φ ( b ) , φ ( a b ) = φ ( a ) φ ( b ) , φ ( 1 ) = 1 , \varphi(a + b) = \varphi(a) + \varphi(b),\qquad \varphi(ab) = \varphi(a)\varphi(b),\qquad \varphi(1) = 1, φ ( a + b ) = φ ( a ) + φ ( b ) , φ ( ab ) = φ ( a ) φ ( b ) , φ ( 1 ) = 1 ,
就称为环同态 。
为什么想要环同态 :任何函数 f : F 2 k → F 2 f: \mathbb{F}_2^k \to \mathbb{F}_2 f : F 2 k → F 2 都可以写成 F 2 \mathbb{F}_2 F 2 上的多项式(加法 = = = 异或,乘法 = = = 与门),对 Z t \mathbb{Z}_t Z t 上的函数也类似。若解密 D e c \mathrm{Dec} Dec 是环同态,那么对任意多项式 P P P ,
D e c ( P ( c 1 , … , c k ) ) = P ( D e c ( c 1 ) , … , D e c ( c k ) ) . \mathrm{Dec}\big(P(c_1, \dots, c_k)\big) = P\big(\mathrm{Dec}(c_1), \dots, \mathrm{Dec}(c_k)\big). Dec ( P ( c 1 , … , c k ) ) = P ( Dec ( c 1 ) , … , Dec ( c k ) ) .
即"在密文上算 P P P "等于"在明文上算 P P P ",这就能算任意函数,也就是全同态。
为什么不能真的是环同态 :如果 E n c \mathrm{Enc} Enc 本身是一个确定性的环同态 φ : Z t → S \varphi: \mathbb{Z}_t \to S φ : Z t → S ,那么攻击者可以拿公开的运算做代数攻击。比如环同态必然满足 φ ( 1 ) = 1 S \varphi(1) = 1_S φ ( 1 ) = 1 S ,而 1 S 1_S 1 S 是公开的,于是攻击者能自己算出 φ ( 2 ) = 1 S + 1 S \varphi(2) = 1_S + 1_S φ ( 2 ) = 1 S + 1 S 、φ ( 3 ) = 1 S + 1 S + 1 S \varphi(3) = 1_S + 1_S + 1_S φ ( 3 ) = 1 S + 1 S + 1 S ……把所有明文的密文列成一张表,拿到任何密文一查便知,毫无安全性可言。用抽象代数的话说,由第一同构定理 im φ ≅ Z t / ker φ \operatorname{im}\varphi \cong \mathbb{Z}_t/\ker\varphi im φ ≅ Z t / ker φ ,像的结构完全由公开的代数数据决定。
解决办法:加入噪声 。现代方案中,
每个明文对应很多 个密文(加密是随机的),
解密 = = = "先做一个真正的环同态,再四舍五入 去掉小噪声"。
真正保持运算的是相位 (phase)映射,它是一个精确的同态;而"四舍五入"只在噪声足够小的时候才和运算相容。所以说加密是一个近似环同态 :只要噪声没长太大,同态性就成立。
3.5 LWE 与 RLWE
LWE 问题 (Learning With Errors,Regev 2005):取模数 q q q ,秘密向量 s ∈ Z q n s \in \mathbb{Z}_q^n s ∈ Z q n 。给你很多组
( a i , b i = ⟨ a i , s ⟩ + e i m o d q ) , (a_i,\ b_i = \langle a_i, s\rangle + e_i \bmod q), ( a i , b i = ⟨ a i , s ⟩ + e i mod q ) ,
其中 a i a_i a i 均匀随机,e i e_i e i 是很小的随机误差。要求找出 s s s (搜索版本),或者区分这些 ( a i , b i ) (a_i, b_i) ( a i , b i ) 和均匀随机的数对(判定版本)。
若没有误差 e i e_i e i ,这只是一个线性方程组,高斯消元就能解。
加了小误差以后,消元会把误差放大到不可控的程度,问题就变得很难。Regev 证明了,平均情况的 LWE 至少和格上某些最坏情况 问题(如近似 GapSVP、SIVP)一样难。
目前没有已知的量子算法 能有效解 LWE,所以格密码属于后量子密码,FHE 天然就是抗量子的。
一个最小的 LWE 加密 (对称密钥,加密一个比特 m ∈ { 0 , 1 } m \in \{0, 1\} m ∈ { 0 , 1 } ):令 Δ = ⌊ q / 2 ⌋ \Delta = \lfloor q/2 \rfloor Δ = ⌊ q /2 ⌋ ,
E n c ( m ) = ( a , b ) = ( a , ⟨ a , s ⟩ + e + Δ m ) , 相位 φ s ( a , b ) = b − ⟨ a , s ⟩ = Δ m + e . \mathrm{Enc}(m) = (a,\ b) = \big(a,\ \langle a, s\rangle + e + \Delta m\big),\qquad \text{相位 } \varphi_s(a, b) = b - \langle a, s\rangle = \Delta m + e. Enc ( m ) = ( a , b ) = ( a , ⟨ a , s ⟩ + e + Δ m ) , 相位 φ s ( a , b ) = b − ⟨ a , s ⟩ = Δ m + e .
解密时看相位离 0 0 0 近还是离 Δ \Delta Δ 近。关键观察:相位映射 φ s \varphi_s φ s 是 Z q \mathbb{Z}_q Z q -线性的 (模同态),所以两个密文相加,相位也相加:
φ s ( c 1 + c 2 ) = Δ ( m 1 + m 2 ) + ( e 1 + e 2 ) . \varphi_s(c_1 + c_2) = \Delta(m_1 + m_2) + (e_1 + e_2). φ s ( c 1 + c 2 ) = Δ ( m 1 + m 2 ) + ( e 1 + e 2 ) .
手算例子:LWE 上的同态加法(模 2 加法)
取 q = 97 q = 97 q = 97 ,Δ = 48 \Delta = 48 Δ = 48 ,秘密 s = ( 5 , 11 ) s = (5, 11) s = ( 5 , 11 ) 。
加密 m 1 = 1 m_1 = 1 m 1 = 1 ,取 a = ( 23 , 40 ) a = (23, 40) a = ( 23 , 40 ) ,e 1 = 2 e_1 = 2 e 1 = 2 :
⟨ a , s ⟩ = 115 + 440 = 555 ≡ 70 \langle a, s\rangle = 115 + 440 = 555 \equiv 70 ⟨ a , s ⟩ = 115 + 440 = 555 ≡ 70 ,b = 70 + 2 + 48 = 120 ≡ 23 b = 70 + 2 + 48 = 120 \equiv 23 b = 70 + 2 + 48 = 120 ≡ 23 ,即 c 1 = ( ( 23 , 40 ) , 23 ) c_1 = \big((23, 40),\ 23\big) c 1 = ( ( 23 , 40 ) , 23 ) 。
相位 = 23 − 70 ≡ 50 = 48 + 2 = 23 - 70 \equiv 50 = 48 + 2 = 23 − 70 ≡ 50 = 48 + 2 ,靠近 Δ \Delta Δ ,解密为 1 1 1 。
加密 m 2 = 1 m_2 = 1 m 2 = 1 ,取 a = ( 61 , 7 ) a = (61, 7) a = ( 61 , 7 ) ,e 2 = − 3 e_2 = -3 e 2 = − 3 :
⟨ a , s ⟩ = 305 + 77 = 382 ≡ 91 \langle a, s\rangle = 305 + 77 = 382 \equiv 91 ⟨ a , s ⟩ = 305 + 77 = 382 ≡ 91 ,b = 91 − 3 + 48 = 136 ≡ 39 b = 91 - 3 + 48 = 136 \equiv 39 b = 91 − 3 + 48 = 136 ≡ 39 ,即 c 2 = ( ( 61 , 7 ) , 39 ) c_2 = \big((61, 7),\ 39\big) c 2 = ( ( 61 , 7 ) , 39 ) 。
相位 = 45 = 48 − 3 = 45 = 48 - 3 = 45 = 48 − 3 ,解密为 1 1 1 。
相加 :c 1 + c 2 = ( ( 84 , 47 ) , 62 ) c_1 + c_2 = \big((84, 47),\ 62\big) c 1 + c 2 = ( ( 84 , 47 ) , 62 ) 。
⟨ ( 84 , 47 ) , s ⟩ = 420 + 517 = 937 ≡ 64 \langle (84, 47), s\rangle = 420 + 517 = 937 \equiv 64 ⟨( 84 , 47 ) , s ⟩ = 420 + 517 = 937 ≡ 64 ,相位 = 62 − 64 ≡ − 2 ≡ 95 = 62 - 64 \equiv -2 \equiv 95 = 62 − 64 ≡ − 2 ≡ 95 。
− 2 -2 − 2 离 0 0 0 近,解密为 0 0 0 ,而 1 ⊕ 1 = 0 1 \oplus 1 = 0 1 ⊕ 1 = 0 ,正确。
这里 2 Δ = 96 ≡ − 1 ( m o d 97 ) 2\Delta = 96 \equiv -1 \pmod{97} 2Δ = 96 ≡ − 1 ( mod 97 ) ,所以相位等于 − 1 + e 1 + e 2 = − 2 -1 + e_1 + e_2 = -2 − 1 + e 1 + e 2 = − 2 。噪声从 ∣ e ∣ ≤ 3 |e| \le 3 ∣ e ∣ ≤ 3 涨到了 2 2 2 再加取整误差 ,只要总噪声的绝对值不超过 q / 4 ≈ 24 q/4 \approx 24 q /4 ≈ 24 ,解密就是对的。(已用 Python 验算。)
RLWE (Ring-LWE,Lyubashevsky–Peikert–Regev 2010):把向量换成多项式环
R q = Z q [ x ] / ( x n + 1 ) , n = 2 k . R_q = \mathbb{Z}_q[x]/(x^n + 1),\qquad n = 2^k. R q = Z q [ x ] / ( x n + 1 ) , n = 2 k .
样本变成 ( a , b = a ⋅ s + e ) ∈ R q 2 (a,\ b = a\cdot s + e) \in R_q^2 ( a , b = a ⋅ s + e ) ∈ R q 2 ,其中 a , s , e a, s, e a , s , e 都是多项式,e e e 的系数很小。好处有两个:
紧凑 :一个多项式就相当于 LWE 里的 n n n 个样本,密钥和密文都小得多;
快 :多项式乘法可以用数论变换(NTT,即有限域上的 FFT)在 O ( n log n ) O(n \log n) O ( n log n ) 内完成。
为什么是 x n + 1 x^n + 1 x n + 1 :当 n n n 是 2 2 2 的幂时,x n + 1 = Φ 2 n ( x ) x^n + 1 = \Phi_{2n}(x) x n + 1 = Φ 2 n ( x ) 是第 2 n 2n 2 n 个分圆多项式,在 Q \mathbb{Q} Q 上不可约(Eisenstein 判别法作用在 x ↦ x + 1 x \mapsto x+1 x ↦ x + 1 后的多项式上)。由于 x n ≡ − 1 x^n \equiv -1 x n ≡ − 1 ,这个商环里的乘法是"负循环卷积 ",计算方便,而且它的几何性质(典范嵌入)很好,能保证噪声增长可控。这正是抽象代数里的商环 F [ x ] / ( f ) F[x]/(f) F [ x ] / ( f ) 。
3.6 噪声增长、模切换、自举
密文乘法与"代值同态"
在 RLWE 方案中,可以把一个密文 ( c 0 , c 1 ) (c_0, c_1) ( c 0 , c 1 ) 看成关于未知量 y y y 的一次多项式 c ( y ) = c 0 + c 1 y ∈ R q [ y ] c(y) = c_0 + c_1 y \in R_q[y] c ( y ) = c 0 + c 1 y ∈ R q [ y ] 。解密的第一步就是代入 y = s y = s y = s :
e v s : R q [ y ] → R q , c ( y ) ↦ c ( s ) = c 0 + c 1 s . \mathrm{ev}_s: R_q[y] \to R_q,\qquad c(y) \mapsto c(s) = c_0 + c_1 s. ev s : R q [ y ] → R q , c ( y ) ↦ c ( s ) = c 0 + c 1 s .
这正是抽象代数里的代值同态 (evaluation homomorphism),它是一个精确 的环同态。于是两个密文的乘积就定义为多项式乘积:
c ( y ) ⋅ c ′ ( y ) = c 0 c 0 ′ + ( c 0 c 1 ′ + c 1 c 0 ′ ) y + c 1 c 1 ′ y 2 , c(y)\cdot c'(y) = c_0c_0' + (c_0c_1' + c_1c_0')\,y + c_1c_1'\, y^2, c ( y ) ⋅ c ′ ( y ) = c 0 c 0 ′ + ( c 0 c 1 ′ + c 1 c 0 ′ ) y + c 1 c 1 ′ y 2 ,
它代入 s s s 后恰好等于 c ( s ) ⋅ c ′ ( s ) c(s)\cdot c'(s) c ( s ) ⋅ c ′ ( s ) 。乘完以后密文变成 y y y 的二次式(三个分量),再用重线性化 (relinearization,借助公开的 s 2 s^2 s 2 的加密,即 key-switching key)把它变回一次式。
噪声如何增长 :以 BGV 风格为例,设相位 c ( s ) = m + t e c(s) = m + t e c ( s ) = m + t e (明文在"低位",模 t t t 读出)。
运算
相位
噪声大小
加法
( m + m ′ ) + t ( e + e ′ ) (m + m') + t(e + e') ( m + m ′ ) + t ( e + e ′ )
相加:∣ e ∣ + ∣ e ′ ∣ \lvert e\rvert + \lvert e' \rvert ∣ e ∣ + ∣ e ′ ∣
乘法
m m ′ + t ( m e ′ + m ′ e + t e e ′ ) mm' + t\,(me' + m'e + t ee') m m ′ + t ( m e ′ + m ′ e + t e e ′ )
大约相乘 :∼ t ∣ e ∣ ∣ e ′ ∣ \sim t\,\lvert e\rvert \lvert e' \rvert ∼ t ∣ e ∣ ∣ e ′ ∣
加法让噪声线性增长,乘法让噪声平方级增长。连续做 L L L 层乘法,噪声大约变成 B 2 L B^{2^L} B 2 L ,指数爆炸。一旦噪声超过 q / 2 q/2 q /2 量级,取模就会"绕回",解密出错。这就是 SHE 只能做有限次乘法的原因。
模切换 (modulus switching,BGV 的核心技巧):乘完一次后,把整个密文按比例缩小,
c ↦ c ′ = ⌊ q ′ q c ⌉ , q ′ < q . c \ \mapsto\ c' = \Big\lfloor \tfrac{q'}{q}\, c \Big\rceil,\qquad q' < q. c ↦ c ′ = ⌊ q q ′ c ⌉ , q ′ < q .
噪声也随之缩小 q ′ / q q'/q q ′ / q 倍,而(经过适当的修正)明文不变。打个比方:噪声的绝对大小 被压回原来的量级,代价是模数变小、"剩余空间"变少。实践中取 q = q 0 q 1 ⋯ q L q = q_0 q_1 \cdots q_L q = q 0 q 1 ⋯ q L 为一串素数的乘积,每层乘法后"扔掉"一个素数,噪声从指数增长变成线性 于层数 L L L 。这串素数的表示用的就是中国剩余定理 (RNS 表示),也是抽象代数的内容。
Gentry 的自举 (bootstrapping):层数用完了怎么办?Gentry 的想法是"用同态的方式运行解密算法 ":
事先把私钥 s s s 用它自己(或另一把公钥)加密,公开 E n c ( s ) \mathrm{Enc}(s) Enc ( s ) ,称为自举密钥。
拿到一个噪声快满的密文 c c c 。服务器把 c c c 的每一位当作常数 ,把 E n c ( s ) \mathrm{Enc}(s) Enc ( s ) 当作加密输入 ,同态地计算解密电路 D e c ( ⋅ , c ) \mathrm{Dec}(\cdot, c) Dec ( ⋅ , c ) :
E v a l ( D e c ( ⋅ , c ) , E n c ( s ) ) = E n c ( D e c ( s , c ) ) = E n c ( m ) . \mathrm{Eval}\big(\mathrm{Dec}(\cdot,\ c),\ \mathrm{Enc}(s)\big) = \mathrm{Enc}\big(\mathrm{Dec}(s, c)\big) = \mathrm{Enc}(m). Eval ( Dec ( ⋅ , c ) , Enc ( s ) ) = Enc ( Dec ( s , c ) ) = Enc ( m ) .
结果仍然是 m m m 的密文,但它的噪声只来自"计算解密电路"这一步,与原来 c c c 里的噪声无关 。
只要方案能同态地计算自己的解密电路并且还剩至少一次乘法的余量 (称为 bootstrappable),就可以无限次"刷新"密文,从 SHE 升级为 FHE。
两个细节
公开 E n c ( s ) \mathrm{Enc}(s) Enc ( s ) (用 s s s 自己加密 s s s )需要额外的循环安全 (circular security)假设,目前没有被证明,但也没有已知攻击。
用手套箱比喻:箱子 A 里的东西快看不清了,就把整个箱子 A 放进一个新的干净箱子 B,再把 A 的钥匙也锁进 B(钥匙是加密的,没人能直接用),然后隔着 B 的手套用 A 的钥匙打开 A。东西就到了干净的箱子 B 里,全程没人见到明文。
3.7 BGV、BFV、CKKS(以及 TFHE)的区别
三大主流 RLWE 方案的密文都在 R q = Z q [ x ] / ( x n + 1 ) R_q = \mathbb{Z}_q[x]/(x^n + 1) R q = Z q [ x ] / ( x n + 1 ) 上,区别在于明文放在相位的哪个位置 :
方案
相位 c 0 + c 1 s c_0 + c_1 s c 0 + c 1 s 的形状
明文空间
适合做什么
BGV (2011)
m + t e m + t\,e m + t e ,明文在低位
R t = Z t [ x ] / ( x n + 1 ) R_t = \mathbb{Z}_t[x]/(x^n + 1) R t = Z t [ x ] / ( x n + 1 ) ,精确整数运算
精确的模 t t t 整数运算;靠模切换管理噪声
BFV (2012)
Δ m + e \Delta m + e Δ m + e ,Δ = ⌊ q / t ⌋ \Delta = \lfloor q/t \rfloor Δ = ⌊ q / t ⌋ ,明文在高位
同样是 R t R_t R t ,精确整数运算
精确整数运算;"尺度不变",实现较简单(SEAL、Apple 用的就是它)
CKKS (2017)
Δ m + e \Delta m + e Δ m + e ,但把 e e e 视为近似误差
复数(实数)向量,近似运算
浮点数计算、机器学习、统计;乘法后用 rescale 除以 Δ \Delta Δ
TFHE / FHEW
LWE 样本,明文是比特或小整数
{ 0 , 1 } \{0,1\} { 0 , 1 } 或 Z t \mathbb{Z}_t Z t (t t t 很小)
任意布尔电路、比较、查表;每个门都自举 ,自举极快
TFHE / FHEW: 每次运算都快速自举 可编程自举 = 查表
CKKS 的核心想法 :浮点运算本来就有舍入误差,那就干脆把加密噪声也当成舍入误差的一部分。明文 m m m 是"真实值乘以缩放因子 Δ \Delta Δ 再取整",解密得到的是 m + e m + e m + e ,只要 e e e 相对于 Δ \Delta Δ 很小,就只是丢了几位精度。乘法后相位变成 Δ 2 m m ′ + ⋯ \Delta^2 m m' + \cdots Δ 2 m m ′ + ⋯ ,用 rescale(除以 Δ \Delta Δ 并降低模数)恢复尺度,这和模切换是同一个操作。
批处理(SIMD)与中国剩余定理 :对 BGV/BFV,若素数 t ≡ 1 ( m o d 2 n ) t \equiv 1 \pmod{2n} t ≡ 1 ( mod 2 n ) ,则 Z t \mathbb{Z}_t Z t 中含有本原 2 n 2n 2 n 次单位根 ζ \zeta ζ ,于是 x n + 1 x^n + 1 x n + 1 在 Z t [ x ] \mathbb{Z}_t[x] Z t [ x ] 上分裂为 n n n 个一次因子,由中国剩余定理得
R t = Z t [ x ] / ( x n + 1 ) ≅ ∏ i = 1 n Z t [ x ] / ( x − ζ 2 i − 1 ) ≅ Z t n . R_t = \mathbb{Z}_t[x]/(x^n + 1) \;\cong\; \prod_{i=1}^{n} \mathbb{Z}_t[x]/(x - \zeta^{2i-1}) \;\cong\; \mathbb{Z}_t^n. R t = Z t [ x ] / ( x n + 1 ) ≅ i = 1 ∏ n Z t [ x ] / ( x − ζ 2 i − 1 ) ≅ Z t n .
这个同构是环同构 ,所以 R t R_t R t 里的一次乘法就等于 n n n 个槽里各自做一次乘法。一个密文就能同时处理 n n n 个数(n = 2 14 n = 2^{14} n = 2 14 时是 16384 16384 16384 个)。CKKS 用的是类似的想法:通过典范嵌入 R → C n R \to \mathbb{C}^{n} R → C n 把 n / 2 n/2 n /2 个复数装进一个多项式。
3.8 小结:从抽象代数看同态加密
抽象代数概念
在同态加密里的角色
群同态 / 环同态
同态性的定义本身;RSA、ElGamal 是乘法群同态,Paillier 是群同构
商环 F [ x ] / ( f ) F[x]/(f) F [ x ] / ( f )
密文与明文所在的环 Z q [ x ] / ( x n + 1 ) \mathbb{Z}_q[x]/(x^n + 1) Z q [ x ] / ( x n + 1 )
代值同态 e v s \mathrm{ev}_s ev s
解密的第一步 c 0 + c 1 s c_0 + c_1 s c 0 + c 1 s ,也解释了密文乘法
不可约多项式
x n + 1 = Φ 2 n x^n + 1 = \Phi_{2n} x n + 1 = Φ 2 n 不可约,保证环的结构良好
中国剩余定理
批处理 R t ≅ Z t n R_t \cong \mathbb{Z}_t^n R t ≅ Z t n ;RNS 表示与模切换
理想与核
若 E n c \mathrm{Enc} Enc 是精确同态,核与像的结构会泄露信息,所以必须加噪声
延伸阅读
Craig Gentry, A Fully Homomorphic Encryption Scheme , Stanford PhD thesis, 2009
Oded Regev, On Lattices, Learning with Errors, Random Linear Codes, and Cryptography , 2005
Brakerski, Gentry, Vaikuntanathan, (Leveled) Fully Homomorphic Encryption without Bootstrapping , 2012(BGV)
Fan, Vercauteren, Somewhat Practical Fully Homomorphic Encryption , 2012(BFV)
Cheon, Kim, Kim, Song, Homomorphic Encryption for Arithmetic of Approximate Numbers , 2017(CKKS)
Pascal Paillier, Public-Key Cryptosystems Based on Composite Degree Residuosity Classes , 1999
Microsoft SEAL、OpenFHE、Zama TFHE-rs 的官方文档与示例