全同态加密知识体系整理
时间:2023-05-28 20:07:00
文章由AdijeShen整理,供个人学习使用。
将同态加密的重要知识和方法整理到2022年。
文章目录
- 引
- 基础知识
- 基于RLWE同态加密方案(BGV,BFV,CKKS)
-
- 通用的格式
- 效率和功能
- 加解密流程
-
- 私钥加密过程 E n c s k Enc_{sk} Encsk
- 公钥加密过程 E n c p k Enc_{pk} Encpk
- 解密 D e c s k Dec_{sk} Decsk
- 同态性质
-
- 加法
- 明文密文加
- 明文密文乘
- 乘法
- 密钥替换(再现性化)
- 噪声控制
-
- 模数替换Modulus Switching(CKKS,BGV)
- Scale Invariant(BFV)
- 总结
- Bootstrapping(通用方法)
- 编码(SIMD,encoding)
-
- 基于NTT&FFT
-
- 基于FFT的编码(CKKS)
- 基于NTT的编码(BGV,BFV)
- 总结
- 自同构(旋转,替换)
- FHEW同态加密类型
-
- BlindRotate
- Functional Bootstrapping
- 同态加密应用
-
- 隐私集合求交PSI
- 隐匿查询PIR
- 作为MPC的组件
- 作为FL的组件
- 一般优化方法
-
- 计算效率(RNS,NTT,Montgomery)
- 通信费用(随机种子,模数替换)
- 前沿研究
-
- CKKS安全问题
- 将FHEW类型的密和RLWE类型的同态加密结合
- 研究如何进行快速的Bootstrapping
- 将RLWE类型的同态加密与MPC结合,通过MPC实现Bootstrapping过程
- 同态加密参数(实现相关)
-
- 推荐参数
- 参数与效率
- 代码中参数的解释
- 开源库效率测试:
-
- SEAL
- Lattigo
引
我将现代的FHE技术视作两类,一种是基于RLWE的层次同态加密(LHE),包括了BGV,BFV和CKKS,这种方案一般来说支持多项式打包技术,可以一次性运算(加法乘法)多个数据,效率上较高,但LHE目前来说Bootstrapping开销比较大,一般来说只当作支持有限次数的运算的同态加密方法使用。
而第二类技术以FHEW和TFHE为代表的高效自举(Bootstrapping)技术,但问题在于这类的方案对于多项式打包并不友好。但也有优势,对于LHE类型的方案来说,只支持加法和乘法操作,对于一下非多项式的函数,比如激活函数,需要使用高次多项式拟合。而第FHEW类型的方案可以在自举的同时运算一个任意的函数。
基础知识
用粗体小写 a \bf a a来表示一个向量,小写 a a a表示一个标量或者多项式, R q R_q Rq表示一个模 q q q和模 X n + 1 X^n+1 Xn+1多项式环, ∥ a ∥ ∞ \|a\|_{\infty} ∥a∥∞表示向量或多项式的无穷范数,即 a a a中的最大项。 σ \sigma σ表示一个随机分布(一般具体为高斯分布)。
多项式环:
R R R:定义为 Z m o d X n + 1 \Z \bmod X^{n}+1 ZmodXn+1,
R q R_q Rq, R t R_t Rt,包含参数 n n n, q q q, t t t。
R q : R m o d q R_q: R \bmod q Rq:Rmodq。
一般形式: ∑ i ∈ [ 0... n − 1 ] a i ⋅ x i , a i ∈ Z q \sum_{i\in[0...n-1]}a_i\cdot x^{i},a_i \in \Z_q ∑i∈[0...n−1]ai⋅xi,ai∈Zq。
例子:
n=8, 16 x 7 + 2 x 6 + ⋯ + 15 x + 2 ∈ R 17 16x^7+2x^6+\cdots+15x+2\in R_{17} 16x7+2x6+⋯+15x+2∈R17。
一般来说明文空间为 R t R_t Rt或 R R R,密文空间为 R q 2 R_q^2 Rq2。
L W E \sf LWE LWE问题:
有一个秘密向量 s \bf s s,给定多组 ( a , b ) ∈ Z q n + 1 (\mathbf{a},b)\in \Z_q^{n+1} (a,b)∈Zqn+1,其中 a ∈ Z q n {\bf a} \in {\Z}_q^{n} a∈Zqn是随机选取的向量 b = ⟨ a , s ⟩ + e b=\langle {\bf a,s} \rangle+e b=⟨a,s⟩+e, e ∈ σ e \in \sigma e∈σ,通过 ( a , b ) ({\bf a},b) (a,b)推出 s \bf s s是困难的。
R L W E \sf RLWE RLWE问题:
有一个秘密多项式 s s s,给定多组 ( a , b ) ∈ R q 2 (a,b)\in R_q^2 (a,b)∈Rq2,其中 a ∈ R q a\in R_q a∈Rq是随机选取的多项式, b = a s + e b=as+e b=as+e, e ∈ σ n e\in \sigma^{n} e∈σn,通过 ( a , b ) (a,b) (a,b)推出 s s s是困难的。
基于RLWE的同态加密方案(BGV,BFV,CKKS)
通用的格式
RLWE类型的同态加密(BGV,BFV,CKKS)密文的通用格式为 c t = ( c 0 , c 1 ) ∈ R q 2 {\sf ct}=(c_0,c_1)\in R_q^2 ct=(c0,c1)∈Rq2,有时候也写作 c t = ( a , b ) {\sf ct}=(a,b) ct=(a,b),其中 b = a s + e + m b=as+e+m b=as+e+m。
这里三个方案有一点小小的区别:
BGV的明文空间为 R t R_t Rt,密文格式为 ( a , a s + t e + m ) (a,as+te+m) (a,as+te+m),
BFV的明文空间为 R t R_t Rt,密文格式为 ( a , a s + e + Δ m ) , Δ = ⌊ q t ⌋ (a,as+e+\Delta m), \Delta = \lfloor\frac{q}{t}\rfloor (a,as+e+Δm),Δ=⌊tq⌋,
CKKS的明文空间为 R R R,密文格式为 ( a , a s + e + Δ m ) , Δ = 2 k (a,as+e+\Delta m), \Delta=2^k (a,as+e+Δm),Δ=2k。
注意到BFV和CKKS中 Δ \Delta Δ的定义是不一致的,BFV中 Δ \Delta Δ作用是为了与BGV中的 t t t类似,是为了保证明文空间 R t R_t Rt范围内解密的精确性。
而CKKS中 Δ \Delta Δ是为了能够在 Z q \Z_q Zq中表示浮点数,以(k=10)的情况为例,可用 1280 1280 1280表示 1.25 ⋅ 2 10 1.25\cdot 2^{10} 1.25⋅210。在应用中, k k k可以取到60。
效率和功能方面
目前来说,我会把BGV和BFV放在一类,都是对于整数( Z t \Z_t Zt)的同态加密方案。他们的计算能力(即噪声增长)和性能都差不多,在 t > 2 16 t>2^{16} t>216时,BGV效率会更优一些。但BFV的易用度要高于BGV,因为BGV的模数会不断变小,处理不同模数下密文之间的操作会比较麻烦,而BFV的模数是保持不变的。 t t t最小取 2 2 2,最大取 ∼ 2 59 \sim2^{59} ∼259
但由于BGV特殊的modulus switching机制,所以对于模数的选取有特殊要求,因此很多开源库没有实现BGV。都是将CKKS和BFV实现了,这两个协议可以共用一套参数( R q R_q Rq相同)。
可参考资料:BGV与BFV对比
对于CKKS来说,他的主要优势在于可以计算浮点数或者说复数 C \mathbb{C} C(但复数使用较少),效率方面与BGV和BFV相差不多,但有对于浮点数的计算有误差存在,不像BGV和BFV是精确的加密。
总结:三者的效率差不多。BGV和BFV是整数方案,精确。CKKS支持浮点数,不精确。
加解密流程
下面以CKKS举例说明一下RLWE类型密文的加密解密过程:
私钥加密流程 E n c s k Enc_{sk} Encsk
公开参数:多项式环 R q R_q Rq