参考文献:
CKKS 满足 IND-CPA 安全性,但是并非是 IND-CPA+ 安全的,它在某些 MPC 场景中完全不安全!
由于 FHE 密文的延展性,安全性 IND-CCA2 是不可达的,同时 IND-CCA1 实际中也难以实现,因此让人们往往把 IND-CPA 作为设计目标。
然而,在云计算、MPC 等场景下,敌手可以获得某些消息的解密(访问了受限的解密神谕),这导致敌手的能力实际上没能被 IND-CPA 安全性定义所完全捕获。
我们考虑三方场景(解密者 Alice,服务器 Bob,加密者 Eva):Alice 生成 ( s k , p k ) (sk,pk) (sk,pk),Eva 加密数据 m m m 发送给 Bob,Bob 收到密文 c t ct ct 之后做一定的运算 f f f,将 c t ′ ct' ct′ 发送给 Alice 解密,最后将 m ′ m' m′ 发送给 Eva。整个流程中, m , f m,f m,f 可以被 Eva 主动选择(也可以不选择、甚至不知道), c t , c t ′ , m ′ ct,ct',m' ct,ct′,m′ 可以被 Eva 被动接收(不可以篡改、不可以注入)。
实际上 Eva 是一个被动敌手(passive attacker),其行为如图:
被动敌手可以通过访问 FHE 提供的公开标准接口(legitimate operations)构造出某个 m ∗ m^* m∗ 对应的 c t ′ ct' ct′,要求解密神谕(有能力检查 c t ′ ct' ct′ 确实是合法产生的)回应 m ′ m' m′,从而可能帮助被动敌手区分密文、甚至私钥恢复。
Raw (R)LWE Encryption Scheme,
注意上述的加解密不包含编码(纠错码、SIMD 打包),解密就是一个线性运算
CKKS 因为没有使用 Δ ≈ q / t \Delta \approx q/t Δ≈q/t 缩放因子,这使得噪声增长速度比 BGV、BFV 慢得多,因此可以执行特别深的电路(而不必自举)
采取 BV 的 tensor 技术,采取 GHS 的 raising the modulus 技术,同态乘法为:
预计算:运算秘钥 e v k = ( b : = a s + e + p s 2 , a ) ∈ R p q 2 evk=(b:=as+e+ps^2, a) \in \mathcal R_{pq}^2 evk=(b:=as+e+ps2,a)∈Rpq2,其中 a ← U ( R p q ) a \gets \mathcal U(\mathcal R_{pq}) a←U(Rpq), e ← χ e e \gets \chi_e e←χe
在线计算:输入 c 0 , c 1 ∈ R q 2 c_0,c_1\in \mathcal R_{q}^2 c0,c1∈Rq2,计算多项式乘积并且重线性化,
c = ( b 0 b 1 , a 0 b 1 + a 1 b 0 ) + ⌊ [ a 0 a 1 ] q ⋅ e v k p ⌉ ( m o d q ) c = (b_0b_1, a_0b_1+a_1b_0) + \left\lfloor \frac{[a_0a_1]_q \cdot evk}{p} \right\rceil \pmod q c=(b0b1,a0b1+a1b0)+⌊p[a0a1]q⋅evk⌉(modq)
CKKS 选取模数为 q l = q 0 ⋅ p l q_l=q_0 \cdot p^l ql=q0⋅pl,其中 p = 2 p=2 p=2 是 base, l l l 是 level,密文 ( c , Δ , l ) (c,\Delta,l) (c,Δ,l) 是带标记的,其中的 Δ \Delta Δ 是定点数的缩放因子,SIMD 编码是 $m=Encode(z;\Delta):=\lfloor \phi^{-1}(\Delta \cdot z)\rceil $,映射 ϕ : R → C N / 2 \phi: \mathcal R \to \mathbb C^{N/2} ϕ:R→CN/2 是典范嵌入,选用 ζ 2 N 4 j + 1 , j ∈ [ N / 2 ] \zeta_{2N}^{4j+1},j \in [N/2] ζ2N4j+1,j∈[N/2] 作为根。
为了控制噪声增长速度,使用 Rescaling 技术(就是 BGV 的模切换),
R S ( ( c ∈ R q l 2 , Δ , l ) , l ′ ) = ( ⌊ c p l − l ′ ⌉ ∈ R q l ′ 2 , p l − l ′ Δ , l ′ ) RS((c \in \mathcal R_{q_{l}}^2,\Delta,l), l') = \left(\left\lfloor \frac{c}{p^{l-l'}} \right\rceil \in \mathcal R_{q_{l'}}^2, p^{l-l'}\Delta, l'\right) RS((c∈Rql2,Δ,l),l′)=(⌊pl−l′c⌉∈Rql′2,pl−l′Δ,l′)
CKKS 的线性解密结果为 m ′ = m + e ∈ R q m'=m+e \in \mathcal R_q m′=m+e∈Rq,其中 $m=\lfloor \phi^{-1}(\Delta \cdot z)\rceil $,最终的输出是近似值 z ′ = D e c o d e ( m ′ ; Δ ) : = ϕ ( m ′ / Δ ) = z + e ′ z' = Decode(m';\Delta):= \phi(m'/\Delta) = z+e' z′=Decode(m′;Δ):=ϕ(m′/Δ)=z+e′
[LM21] 首先基于游戏,给出了 IND-CPA+ 的定义,
[LM21] 接着基于模拟,给出了 SIM-CPA+ 的定义,
易知,IND-CPA+ 立即导致 IND-CPA(它仅访问一次 E,并且不访问 H 和 D),可以证明 IND-CPA+ 是严格强的:
可以证明,SIM-CPA+ 导致了 IND-CPA+,并且两者相分离(SIM-CPA+ 严格更强):
确切地说,我们定义有界查询数量的变体 ( q , l ) (q,l) (q,l)-IND-CPA+ 和 ( q , l ) (q,l) (q,l)-SIM-CPA+,它对于任意的受限敌手满足上述 IND-CPA+ 安全定义、SIM-CPA+ 安全定义,除了这里的敌手只能访问至多 l ( κ ) l(\kappa) l(κ) 次 E 和 H 神谕,访问至多 q ( κ ) q(\kappa) q(κ) 次 D 神谕。[LM21] 证明了:对于任意的 q ≥ 2 q \ge 2 q≥2,都存在 ( q , l ) (q,l) (q,l)-SIM-CPA+ 安全,但是 ( q + 1 , l ) (q+1,l) (q+1,l)-IND-CPA+ 不安全的近似同态加密。因此,在 IND-CPA 和 IND-CPA+ 之间,存在无限长的安全性(严格)递增的安全性序列。
此外,上述的定义都是适应性的(security with adaptively chosen queries):敌手可以主动选取不同的查询次数和顺序。我们可以要求敌手在看到 p k , e v k pk,evk pk,evk 之前就已经确定了它的查询顺序,这就是非适应的(fully non-adaptive model)。[LM21] 证明了非适应安全比适应性安全弱的多:存在近似同态加密方案,它是 SIM-CPA+ 非适应安全的,但不是 ( 2 , 2 ) (2,2) (2,2)-IND-CPA+ 适应性安全的。
Circuit Privacy:电路隐私是说,从 E n c ( m ) Enc(m) Enc(m) 同态计算出 E n c ( f ( x ) ) Enc(f(x)) Enc(f(x)),不会泄露 f f f 的信息。
Functional Decryption:函数解密是说,选取 f ∈ L f \in \mathcal L f∈L,要求 D 神谕回应 f ( D e c ( c ) ) f(Dec(c)) f(Dec(c)),而非 m = D e c ( c ) m=Dec(c) m=Dec(c) 本身。
[LM21] 简单描述了如何将 IND-CPA+ 以及 SIM-CPA+ 的安全性定义扩展到两者。
[LM21] 给出了 CKKS 的被动敌手下的私钥恢复攻击(这远比 IND-CPA+ 攻击更强),因此 CKKS 虽然是 IND-CPA 安全,却不是 IND-CPA+ 安全。
简单起见,我们考虑对称加密。
如果敌手可以获得密文 c = ( b : = a ⋅ s + m + e , a ) c=(b:=a \cdot s+m+e,a) c=(b:=a⋅s+m+e,a) 的解密 m ′ = m + e m'=m+e m′=m+e,那么
b − m ′ = a ⋅ s ( m o d q ) b-m' = a \cdot s \pmod q b−m′=a⋅s(modq)
它是关于 s s s 的线性方程,
CKKS 的模数为 q l = q 0 ⋅ 2 l q_l=q_0 \cdot 2^l ql=q0⋅2l,导致 a ∈ R q a \in \mathcal R_q a∈Rq 基本都是不可逆的,但依旧可以恢复出 s s s 的部分信息
CKKS 采取了 SIMD 编码,最终的解密结果是 z ′ = D e c o d e ( m ′ ) z'=Decode(m') z′=Decode(m′) 而非 m ′ m' m′ 本身
[LM21] 采取重编码手段,尝试恢复出 m ′ m' m′
在多种 CKKS 的实现中(HEAAN、HElib、SEAL、PALISADE),编码解码过程都是利用 double-precision FFT 完成的。而密文的存储/运算,有些使用 Multi-precision Integer,有些则使用 RNS 系统。总体上,CKKS 的计算精度越高,那么 ϵ \epsilon ϵ 就越小,这导致更加有效的攻击。
仅使用线性代数攻击 CKKS,
对于不同实现的攻击结果,
最后 [LM21] 建议修改解密函数,不要输出 m ′ = m + e ~ m'=m+\tilde e m′=m+e~(其中的 e ~ \tilde e e~ 包含了 s k sk sk 和 u , e u,e u,e 的信息),而是输出一个近似值(不依赖私钥和随机带)
[CHK20] 对 HEAAN 做了修改,提供了两种场景下的解密函数,
[CHK20] 调查了其他几个实现的办法:
但是上述这些都只能缓解问题,重新设计一个更加安全可靠的近似同态加密,仍是个开放问题。