BGV方案简介(同态加密)
Posted AdijeShen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BGV方案简介(同态加密)相关的知识,希望对你有一定的参考价值。
文章目录
前言
之前看了好多资料,发现对于BGV的介绍都比较少,大家都主要关注于CKKS。其实在一些整数域上面的计算BGV还是很有优势的,与CKKS相比,BGV是一个确定性的加密方案,与BFV相比,BGV的乘法在RNS下实现要简单非常多。所以在某些场景下(比如有限域上的MPC与HE结合)会更加偏向于使用BGV方案,而且BGV方案也相对最易懂。
推荐阅读资料
最初的BGV文章,但是主要关注于LWE上面。
关于BGV的两篇优化,作者都是(Gentry,Halevi,Smart),所以叫做GHS优化。
这篇文章是将SIMD的,SIMD技术可以说是RLWE对于LWE的一个碾压性的优势之一了。作者是Smart和Vercauteren。
- Algorithms in HElib
- Bootstrapping for HElib
- Design and implementation of HElib : a homomorphic encryption library
上面三篇文章都是Halevi和Shoup写的,关于Helib中如何实现BGV方案并优化,以及如何对于BGV做Bootstrapping。
BGV方案介绍
密文形式
首先BGV最基本的加密形式是:
在这里我们只看对称加密,因为公钥加密与对称加密的密文形式是一致的。
对于LWE类型的密文来说,
首先有一些公开参数:明文模数
t
t
t,密文模数
q
q
q,向量维度
n
n
n
取私钥为
s
∈
Z
q
n
\\mathbfs \\in \\Z_q^n
s∈Zqn,对于明文
m
∈
Z
t
m\\in \\Z_t
m∈Zt
选取
a
∈
Z
q
n
\\mathbfa\\in \\Z_q^n
a∈Zqn,
b
=
⟨
a
,
s
⟩
+
m
+
t
e
m
o
d
q
b=\\langle \\mathbfa,\\mathbfs\\rangle + m +te \\bmod q
b=⟨a,s⟩+m+temodq。
e
e
e是从高斯分布中选取的整数。
令密文
c
=
(
b
,
a
)
c=(b,\\mathbfa)
c=(b,a)。
则解密为
先计算
μ
=
b
−
⟨
a
,
s
⟩
=
m
+
t
e
m
o
d
q
\\mu = b- \\langle \\mathbfa,\\mathbfs \\rangle = m+te \\bmod q
μ=b−⟨a,s⟩=m+temodq。然后计算
m
=
[
μ
]
t
=
m
m=[\\mu]_t=m
m=[μ]t=m。
这里的 ⟨ ⋅ ⟩ \\langle \\cdot \\rangle ⟨⋅⟩为内积操作,对于 a = ( a 0 , . . . , a n − 1 ) , s = ( s 0 , . . . , s n − 1 ) \\mathbfa=(a_0,...,a_n-1),\\mathbfs=(s_0,...,s_n-1) a=(a0,...,an−1),s=(s0,...,sn−1)来说, ⟨ a , s ⟩ = a 0 s 0 + a 1 s 1 + ⋯ + a n − 1 s n − 1 ∈ Z \\langle \\mathbfa,\\mathbfs\\rangle=a_0s_0+a_1s_1+\\cdots+a_n-1s_n-1\\in\\Z ⟨a,s⟩=a0s0+a1s1+⋯+an−1sn−1∈Z。
[ μ ] t [\\mu]_t [μ]t其实等价于 μ m o d t \\mu \\bmod t μmodt。
对于RLWE类型的密文来说,
公开参数为:明文模数
t
t
t,多项式空间
R
=
Z
[
X
]
/
X
n
+
1
\\mathcalR=\\Z[X]/X^n+1
R=Z[X]/Xn+1,以及系数模
q
q
q的多项式空间
R
q
=
Z
q
[
X
]
/
X
n
+
1
\\mathcalR_q=\\Z_q[X]/X^n+1
Rq=Zq[X]/Xn+1。
取私钥为
s
∈
R
q
s\\in \\mathcalR_q
s∈Rq,对于明文
m
∈
R
t
m\\in R_t
m∈Rt:
选取
a
∈
R
q
,
b
=
a
s
+
m
+
t
e
∈
R
q
a\\in \\mathcalR_q,b=as+m+te \\in \\mathcalR_q
a∈Rq,b=as+m+te∈Rq,
e
e
e是一个系数满足高斯分布的多项式。
令密文为
c
=
(
b
,
a
)
c=(b,a)
c=(b,a)
则解密为
先计算
μ
=
b
−
a
s
=
m
+
t
e
∈
R
q
\\mu = b-as=m+te\\in \\mathcalR_q
μ=b−as=m+te∈Rq,然后计算
m
=
[
μ
]
t
∈
R
t
m=[\\mu]_t\\in\\mathcalR_t
m=[μ]t∈Rt。
这里可以看到RLWE类型的密文相对于LWE类型的密文来说的一个优势在于,一个LWE的密文的长度是 n + 1 n+1 n+1,对应的明文是 Z t \\Z_t Zt内的,相当于有效信息只有1个,利用率为 1 n + 1 \\frac1n+1 n+11;而RLWE的密文长度是 2 n 2n 2n,对应的明文是 R t \\mathcalR_t Rt内的,有效信息最多有 n n n个,利用率为 1 2 \\frac12 21。如果使用SIMD的技术的话,可以将这 n n n位都有效的利用起来。
关于SIMD的技术,SV的文章我还没有看,但现在BGV和BFV类型的SIMD应该都用的是INTT来做encoding的吧,可以参考一下CKKS的Encoding。思想是类似的。
噪声
注意到在解密过程中,是先得到了 m + t e m o d q m+te \\bmod q m+temodq,然后再模 t t t得到 m m m的。这里一个很重要的条件就是 ( m + t e ) < q (m+te)<q (m+te)<q,BGV将 φ s ( c ) = b − a s = m + t e \\varphi_s(c)=b-as=m+te φs(c)=b−as=m+tpython简单LWE 加解密方案实现,支持密文同态加法以及常数乘法