全同态加密:BGV
Posted 山登绝顶我为峰 3(^v^)3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全同态加密:BGV相关的知识,希望对你有一定的参考价值。
参考文献:
- Brakerski Z, Vaikuntanathan V. Efficient fully homomorphic encryption from (standard) LWE[J]. SIAM Journal on computing, 2014, 43(2): 831-871.
- Brakerski Z, Gentry C, Vaikuntanathan V. (Leveled) fully homomorphic encryption without bootstrapping[J]. ACM Transactions on Computation Theory (TOCT), 2014, 6(3): 1-36.
- Peikert C. A decade of lattice cryptography[J]. Foundations and trends® in theoretical computer science, 2016, 10(4): 283-424.
文章目录
基础知识
快速数论变换 NTT,在文章 深入理解NTT 中介绍。BGV 方案中,使用多项式环
R
=
Z
[
x
]
/
(
f
(
x
)
)
R = \\mathbb Z[x]/(f(x))
R=Z[x]/(f(x)),其中
f
(
x
)
=
x
d
+
1
f(x)=x^d+1
f(x)=xd+1 是分圆多项式,
d
=
2
k
d=2^k
d=2k 是二的幂次。环
R
R
R 包含所有次数小于
d
d
d 的整系数多项式。然后,选取它的一个主理想
I
=
(
q
(
x
)
)
I=(q(x))
I=(q(x)),满足它的指数
[
R
:
I
]
=
p
[R:I]=p
[R:I]=p 是个素数,即环
R
R
R 是
p
p
p 个陪集
a
i
+
I
,
a
i
∈
R
a_i+I,\\, a_i \\in R
ai+I,ai∈R 的不交并。做商环:
R
q
=
R
/
I
=
R
=
Z
[
x
]
/
(
q
(
x
)
,
f
(
x
)
)
R_q = R/I = R = \\mathbb Z[x]/(q(x),f(x))
Rq=R/I=R=Z[x]/(q(x),f(x))
最简单的,可令 q ( x ) = p q(x)=p q(x)=p 是个素数,那么 R q = Z p [ x ] / ( f ( x ) ) R_q = \\mathbb Z_p[x]/(f(x)) Rq=Zp[x]/(f(x))
假如
p
≡
1
m
o
d
2
d
p \\equiv 1 \\mod 2d
p≡1mod2d,那么在
R
p
R_p
Rp 上多项式
f
(
x
)
f(x)
f(x) 可以完全分解为线性的互素因式,
f
(
x
)
=
x
d
+
1
=
∏
i
=
1
d
(
x
−
ξ
i
)
f(x) = x^d+1 = \\prod_i=1^d (x-\\xi_i)
f(x)=xd+1=i=1∏d(x−ξi)
从而根据 CRT,令
P
i
=
(
x
−
ξ
i
,
p
)
P_i = (x-\\xi_i,\\, p)
Pi=(x−ξi,p) 为彼此互素的理想,有:
R
p
≅
Z
[
x
]
/
P
1
×
⋯
Z
[
x
]
/
P
d
R_p \\cong \\mathbb Z[x]/P_1 \\times \\cdots \\mathbb Z[x]/P_d
Rp≅Z[x]/P1×⋯Z[x]/Pd
简记 Z [ x ] / P i = R P i \\mathbb Z[x]/P_i = R_P_i Z[x]/Pi=RPi
LWE 和 RLWE 问题,在文章 格上困难问题 中介绍。为了方便方案的描述,BGV 不想对两种格困难问题分别构造方案,因此定义了 General Learning with Errors (GLWE) Problem:
其中的噪声分布(一般取做离散高斯分布) χ \\chi χ 是 B-bounded distributions,定义如下:
格上的陷门,在文章 格密码:陷门OWF 中介绍。在 BGV 中对 Gadget 的描述为:
G
:
=
I
n
⊗
g
=
[
g
0
⋯
0
g
0
⋮
0
⋱
⋮
.
.
.
g
]
∈
Z
q
n
×
n
l
G:=I_n \\otimes g= \\left[ \\beginarrayc | c c c g & 0 & \\cdots \\\\ \\hline 0 & g & 0 \\\\ \\vdots & 0 & \\ddots & \\vdots\\\\ & & ... & g\\\\ \\endarray \\right] \\in \\mathbb Z_q^n \\times nl
G:=In⊗g=⎣
⎡g0⋮0g0⋯0⋱...⋮g⎦
⎤∈Zqn×nl
其中 q q q 是素数, l = ⌈ log q ⌉ l = \\lceil \\log q \\rceil l=⌈logq⌉, g = [ 1 , 2 , 4 , ⋯ , 2 l ] g=[1,2,4,\\cdots,2^l] g=[1,2,4,⋯,2l]
- x ⃗ = G u ⃗ \\vec x = G \\vec u x=Gu:将向量 u ⃗ ∈ R 2 n l \\vec u \\in R_2^nl u∈R2nl 分成 n n n块,每个长为 l l l的 block 做二进制合成,得到向量 x ⃗ ∈ R q n \\vec x \\in R_q^n x∈Rqn
- u ⃗ = G − 1 ( x ) \\vec u = G^-1(x) u=G−前言
- 推荐阅读资料
- BGV方案介绍
- 关于KeySwitching/Relinearization
- Algorithms in HElib
- Bootstrapping for HElib
- Design and implementation of HElib : a homomorphic encryption library
前言
之前看了好多资料,发现对于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。
上面三篇文章都是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+t云安全与同态加密_调研分析同态加密技术及其应用分析——By Me
密码算法(SM1SM2SM3SM4同态加密密态计算隐私计算和安全多方计算)
云安全与同态加密_调研分析云计算安全领域主要研究成果——By Me