BGV主要优化了BV11中的维度-模约减技术,提出了模交换技术,同时也优化了重线性化技术,提出了密钥交换技术,使得无需Bootstrapping也能做到较多层数的同态乘法。
这里在介绍方案的时候采用的另一种形式的LWE公钥加密,不是原文中的内容,但是有必要提一下,不然对于小白会懵逼很久(比如我)。
实例依然是
A
s
+
e
As+e
As+e
K
e
n
G
e
n
(
)
KenGen()
KenGen():公钥
p
k
=
[
−
A
s
A
+
2
e
]
pk = [−AsA+2e]
E
n
c
(
)
Enc()
Enc():
E
n
c
p
k
(
m
)
=
p
k
⋅
r
+
[
⋮
0
m
]
(
m
o
d
q
)
Enc_{pk}(m) = pk \cdot r + [⋮0m]
D
e
c
(
)
Dec()
Dec():
D
e
c
s
k
(
c
t
)
=
<
s
k
,
c
t
>
m
o
d
2
Dec_{sk}(ct)=
可以解密验证一下
<
s
k
,
c
t
>
=
s
k
⋅
(
p
k
⋅
r
+
[
⋮
0
m
]
)
=
s
k
⋅
p
k
⋅
r
+
s
k
[
⋮
0
m
]
=
<
2
e
,
r
>
+
m
≈
m
<sk,ct>=sk⋅(pk⋅r+[⋮0m])=sk⋅pk⋅r+sk[⋮0m]=<2e,r>+m≈m
(
<
,
>
<,>
<,>这个是内积。)
文章中把
[
<
c
,
s
>
]
q
[<\mathbf{c},\mathbf s>]_q
[<c,s>]q称为密钥
s
\mathbf s
s下密文
c
c
c的噪声
接下来根据上面的来试着构建一下密文加法和乘法。
设两个密文
c
1
,
c
2
\mathbf{c_1},\mathbf{c_2}
c1,c2,满足
<
c
1
,
s
>
=
2
e
1
+
m
1
,
<
c
2
,
s
>
=
2
e
2
+
m
2
<\mathbf{c_1},\mathbf{s}>=2e_1+m_1,<\mathbf{c_2},\mathbf{s}>=2e_2+m_2
<c1,s>=2e1+m1,<c2,s>=2e2+m2
有些地方省略了一下但是默认要模
q
q
q

因此,定义的同态操作如下:
A
d
d
i
t
i
o
n
:
Dec
(
c
1
+
c
2
,
s
)
=
Dec
(
c
1
,
s
)
+
Dec
(
c
2
,
s
)
M
u
l
t
p
l
i
c
a
t
i
o
n
:
Dec
(
c
1
⊗
c
2
,
s
⊗
s
)
=
Dec
(
c
1
,
s
)
⋅
Dec
(
c
2
,
s
)
Addition:Dec(c1+c2,s)=Dec(c1,s)+Dec(c2,s)Multplication:Dec(c1⊗c2,s⊗s)=Dec(c1,s)⋅Dec(c2,s)
同时我们可以看到,由于乘法定义为了张量积,那么密文和私钥就会膨胀得很厉害,所以需要降低它们。
在BGV方案中把LWE和RLWE统一成了GLWE。
LWE中实例为
(
a
,
b
)
←
Z
q
n
×
Z
q
(a,b) \leftarrow \mathbb{Z}_q^n \times \mathbb{Z}_q
(a,b)←Zqn×Zq
RLWE中的实例为
(
a
i
,
b
i
)
←
R
q
×
R
q
(a_i,b_i) \leftarrow {R}_q\times {R}_q
(ai,bi)←Rq×Rq
如果把
Z
\mathbb{Z}
Z也看做环,那么即可将二者统一起来。
GLWE的定义如下,

则,可以通过两个参数(d,n)来确定选择的是LWE还是RLWE,LWE 只是用 d = 1 实例化的 GLWE。RLWE 是用 n = 1 实例化的 GLWE。
总之这不是一个新的结构,实际使用的还是RLWE和LWE。
E
.
S
e
t
u
p
(
1
λ
,
1
μ
,
b
)
\mathsf{E.Setup}(1^\lambda,1^\mu,b)
E.Setup(1λ,1μ,b): 由比特
b
b
b来确定我们是构造LWE假设下的方案(
b
=
0
b=0
b=0)还是RLWE假设下的方案(
b
=
1
b=1
b=1). 选择一个
μ
\mu
μ比特的模数
q
q
q和参数
d
=
d
(
λ
,
μ
,
b
)
,
n
=
n
(
λ
,
μ
,
b
)
,
N
=
⌈
(
2
n
+
1
)
log
q
⌉
,
χ
=
χ
(
λ
,
μ
,
b
)
d=d(\lambda,\mu,b),n=n(\lambda,\mu,b),N=\lceil (2n+1)\log q\rceil, \chi=\chi(\lambda, \mu, b)
d=d(λ,μ,b),n=n(λ,μ,b),N=⌈(2n+1)logq⌉,χ=χ(λ,μ,b)
此处要求最终的参数使得GLWE问题实例具有
2
λ
2^{\lambda}
2λ强度. 令
R
=
Z
[
x
]
/
(
x
d
+
1
)
R=\mathbb Z[x]/(x^d+1)
R=Z[x]/(xd+1), 并令参数集合
p
a
r
a
m
s
=
(
q
,
d
,
n
,
N
,
χ
)
params=(q,d,n,N,\chi)
params=(q,d,n,N,χ).
E . S e c r e t K e y G e n ( p a r a m s ) \mathsf{E.SecretKeyGen}(params) E.SecretKeyGen(params): 选择 s ′ ← χ n \mathbf s'\leftarrow\chi^n s′←χn, 输出 s k = s = ( 1 , s ′ [ 1 ] , ⋯ , s ′ [ n ] ) ∈ R q n + 1 sk=\mathbf s=(1,\mathbf s'[1],\cdots,\mathbf s'[n])\in R_q^{n+1} sk=s=(1,s′[1],⋯,s′[n])∈Rqn+1.
E . P u b l i c K e y G e n ( p a r a m s , s k ) \mathsf{E.PublicKeyGen}(params,sk) E.PublicKeyGen(params,sk): 均匀选择 A ′ ← R q N × n \mathbf A'\leftarrow R_q^{N\times n} A′←RqN×n, 选择 e ← χ N \mathbf e\leftarrow \chi^N e←χN并令 b = A ′ s ′ + 2 e \mathbf b=\mathbf A'\mathbf s'+2\mathbf e b=A′s′+2e. 并令 p k = A = [ b ∣ − A ′ ] pk=\mathbf A=[\mathbf b|-\mathbf A'] pk=A=[b∣−A′]或者 [ b , − A ′ ] [\mathbf b,-\mathbf A'] [b,−A′](一个拼装矩阵)。这里 A ⋅ s = 2 e \mathbf A \cdot \mathbf s = 2e A⋅s=2e
E . E n c ( p a r a m s , p k , m ∈ { 0 , 1 } ) \mathsf{E.Enc}(params,pk,m\in\{0,1\}) E.Enc(params,pk,m∈{0,1}): 令 m = ( m , 0 , ⋯ , 0 ) ∈ R q n + 1 \mathbf m=(m,0,\cdots,0)\in R_q^{n+1} m=(m,0,⋯,0)∈Rqn+1, 选择 r ← R q N \mathbf r\leftarrow R_q^N r←RqN, 输出密文 c = m + A T r ∈ R q n + 1 \mathbf c=\mathbf m+\mathbf A^T\mathbf r\in R_q^{n+1} c=m+ATr∈Rqn+1.
E . D e c ( p a r a m s , s k , c ) \mathsf{E.Dec}(params,sk,\mathbf c) E.Dec(params,sk,c): 输出 m ← [ [ ⟨ c , s ⟩ ] q ] 2 m\leftarrow [[\langle\mathbf c,\mathbf s\rangle]_q]_2 m←[[⟨c,s⟩]q]2.
这套基本方案其实就是BV11中描述的,只不过是换了一种形式。
目的就是为了减小膨胀的密文和密钥。将因为张量积而扩张的大密文和大密钥替换成小密文和小密钥,且保持解密消息基本不变。
先熟悉两个函数
B
i
t
D
e
c
o
m
p
(
)
BitDecomp()
BitDecomp()和
P
o
w
e
r
o
f
2
(
)
Powerof2()
Powerof2(),在这篇文章的扁平化小节有介绍不熟悉的可以看看。
简单来说,第一个函数的功能是把参数拆成二进制比特,第二个函数的功能是把参数扩张成2的幂次乘以参数的形式,使得内积乘积不变化。
⟨
BitDecomp
(
c
,
q
)
,
Powersof2
(
s
,
q
)
⟩
=
∑
j
=
0
⌊
log
q
⌋
⟨
u
j
,
2
j
⋅
s
⟩
=
∑
j
=
0
⌊
log
q
⌋
⟨
2
j
⋅
u
j
,
s
⟩
=
⟨
∑
j
=
0
⌊
log
q
⌋
2
j
⋅
u
j
,
s
⟩
=
⟨
c
,
s
⟩
\langle\operatorname{BitDecomp}(\mathbf{c}, q), \text { Powersof2}(\mathbf{s}, q)\rangle=\sum_{j=0}^{\lfloor\log q\rfloor}\left\langle\mathbf{u}_{j}, 2^{j} \cdot \mathbf{s}\right\rangle=\sum_{j=0}^{\lfloor\log q\rfloor}\left\langle 2^{j} \cdot \mathbf{u}_{j}, \mathbf{s}\right\rangle=\left\langle\sum_{j=0}^{\lfloor\log q\rfloor} 2^{j} \cdot \mathbf{u}_{j}, \mathbf{s}\right\rangle=\langle\mathbf{c}, \mathbf{s}\rangle
⟨BitDecomp(c,q), Powersof2(s,q)⟩=j=0∑⌊logq⌋⟨uj,2j⋅s⟩=j=0∑⌊logq⌋⟨2j⋅uj,s⟩=⟨j=0∑⌊logq⌋2j⋅uj,s⟩=⟨c,s⟩
密钥交换主要来自[BV11]中的重线性化操作,但作者发现重线性化不仅仅可以通过更换密钥来降低密钥的维数,还可以将第一个密钥下的密文转换成第二个密钥下的密文,而二者加密的消息是相同的,这样可以直接在第二个密钥下进行解密。
密钥交换主要有两个步骤:
第一个算法
S
w
i
t
c
h
K
e
y
G
e
n
(
s
1
,
q
,
n
1
,
s
2
,
n
2
)
SwitchKeyGen(\mathbf s_1,q,n_1,\mathbf s_2,n_2)
SwitchKeyGen(s1,q,n1,s2,n2)接收两个密钥向量,向量各自的维数,和共同模数作为输入,输出一些辅助信息
τ
s
1
→
s
2
\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}
τs1→s2。第二个算法
S
w
i
t
c
h
K
e
y
(
τ
s
1
→
s
2
,
c
1
,
n
1
,
n
2
,
q
)
SwitchKey(\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}},\mathbf c_1,n_1,n_2,q)
SwitchKey(τs1→s2,c1,n1,n2,q)接收辅助信息和前密钥加密的密文,来输出在后一个密钥下加密的密文。
理解说明:我们要将密钥
s
1
\mathbf{s}_{1}
s1下的密文
c
1
\mathbf{c}_{1}
c1切换到密钥
s
2
\mathbf{s}_{2}
s2下的密文
c
2
\mathbf{c}_{2}
c2,就需要先使用
s
2
\mathbf{s}_{2}
s2作为私钥,生成一个公钥,将
P
o
w
e
r
s
o
f
2
(
s
1
)
Powersof2( \left.\mathbf{s}_{1}\right)
Powersof2(s1)的每一项
2
τ
⋅
s
1
[
i
]
2^\tau \cdot \mathbf{s}_{1}[i]
2τ⋅s1[i]进行加密,把这些密文的集合记作
τ
s
1
→
s
2
\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}
τs1→s2,可以看到,之前在BV11方案中密钥是有二次项的,但是这里直接一个
s
1
\mathbf{s}_{1}
s1就把所有的一次二次项全部囊括了,只需要简单的理解到
s
1
=
s
⊗
s
\mathbf{s}_{1}=\mathbf{s} \otimes \mathbf{s}
s1=s⊗s即可。
具体操作如下,
S
w
i
t
c
h
K
e
y
G
e
n
(
s
1
∈
R
q
n
1
,
s
2
∈
R
q
n
2
)
SwitchKeyGen(\mathbf s_1 \in R_q^{n_1},\mathbf s_2 \in R_q^{n_2})
SwitchKeyGen(s1∈Rqn1,s2∈Rqn2):
首先
A
←
E
.
P
u
b
l
i
c
k
e
y
G
e
n
(
s
2
,
N
)
\mathbf{A} \leftarrow E.PublickeyGen \left(\mathbf{s}_{2}, N\right)
A←E.PublickeyGen(s2,N),
N
=
n
1
⋅
⌈
log
q
⌉
N=n_{1} \cdot\lceil\log q\rceil
N=n1⋅⌈logq⌉,这里有
s
2
⋅
A
=
2
e
\mathbf{s}_{2} \cdot \mathbf A = 2e
s2⋅A=2e。
接着
B
←
A
+
P
o
w
e
r
s
o
f
2
(
s
1
)
\mathbf{B} \leftarrow \mathbf{A}+ Powersof2( \mathbf{s}_{1})
B←A+Powersof2(s1):也就是把
P
o
w
e
r
s
o
f
2
(
s
1
)
Powersof2( \left.\mathbf{s}_{1}\right)
Powersof2(s1)加到
A
\mathbf{A}
A的第一列,得到矩阵
B
\mathbf{B}
B,输出
τ
s
1
→
s
2
=
B
\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}=\mathbf{B}
τs1→s2=B,可以把
B
\mathbf{B}
B看成
B
=
[
P
o
w
e
r
s
o
f
2
(
s
1
)
∣
A
]
\mathbf{B} = [Powersof2(\mathbf{s}_{1})| \mathbf A]
B=[Powersof2(s1)∣A]或者
B
=
[
P
o
w
e
r
s
o
f
2
(
s
1
)
,
A
]
\mathbf{B} = [Powersof2(\mathbf{s}_{1}),\mathbf A]
B=[Powersof2(s1),A]
S
w
i
t
c
h
K
e
y
(
τ
s
1
→
s
2
,
c
1
)
SwitchKey(\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}},\mathbf c_1)
SwitchKey(τs1→s2,c1):
输出
c
2
=
B
i
t
D
e
c
o
m
p
(
c
1
)
T
⋅
B
∈
R
q
n
2
\mathbf c_2=\mathsf{BitDecomp}(\mathbf c_1)^T\cdot \mathbf B\in R_q^{n_2}
c2=BitDecomp(c1)T⋅B∈Rqn2
正确性验证,
⟨
c
2
,
s
2
⟩
=
BitDecomp
(
c
1
)
T
⋅
B
⋅
s
2
=
BitDecomp
(
c
1
)
T
⋅
[
Powersof2
(
s
1
)
,
A
]
⋅
[
1
,
s
2
′
]
T
=
BitDecomp
(
c
1
)
T
⋅
(
2
e
2
+
Powersof
2
(
s
1
)
)
=
2
⟨
BitDecomp
(
c
1
)
,
e
2
⟩
+
⟨
BitDecomp
(
c
1
)
,
Powersof
2
(
s
1
)
⟩
=
2
⟨
BitDecomp
(
c
1
)
,
e
2
⟩
+
⟨
c
1
,
s
1
⟩
⟨c2,s2⟩=BitDecomp(c1)T⋅B⋅s2=BitDecomp(c1)T⋅[Powersof2(s1),A]⋅[1,s′2]T=BitDecomp(c1)T⋅(2e2+Powersof2(s1))=2⟨BitDecomp(c1),e2⟩+⟨BitDecomp(c1),Powersof2(s1)⟩=2⟨BitDecomp(c1),e2⟩+⟨c1,s1⟩
由于二进制化了,所以噪声就很小。
目的是减小噪声,在[BV11]中的模数切换操作仅仅在同态计算结束后使用,并获得一个小的密文。在BGV中是迭代的使用来保持噪声水平基本不变,但是作为牺牲,模数会逐步减小至无法继续计算,也就是说深度基本上由模数来控制了。
如果噪声界限是
B
B
B的话,那么同态乘法会产生
B
2
B^2
B2的噪声,后续就是双指数级别的增长。模交换的核心就是做一次乘法计算就将噪声
B
2
B^2
B2削减为
B
B
B,使得噪声基本维持不变,模数就会从
q
L
q^L
qL一直减小到
q
q
q。
这就无需bootstrapping也能控制噪声的增长,从而达到一个有限级同态加密。
目标是 [ ⟨ c , s ⟩ ] q m o d 2 = [ ⟨ c ′ , s ⟩ ] p m o d 2 [\langle\mathbf c,\mathbf s\rangle]_q \mod 2=[\langle \mathbf c',\mathbf s\rangle]_p \mod 2 [⟨c,s⟩]qmod2=[⟨c′,s⟩]pmod2
类似[BV11]中的一样,从 c c c到 c ′ c' c′的切换只需要缩放一个 ( p / q ) (p/q) (p/q)并适当的舍入。但是,有个惊人的发现就是如果 s s s很短且 p p p比 q q q小很多,那么噪声也会缩小的。
设 p p p和 q q q是两个奇数模数, c \mathbf c c是一个整数向量. 令 c ’ \mathbf c’ c’为一个距离 ( p / q ) ⋅ c (p/q)\cdot\mathbf c (p/q)⋅c最近的一个整数向量满足 c ′ = c m o d 2 \mathbf c'=\mathbf c\mod 2 c′=cmod2,同时 p = q m o d 2 p = q\mod 2 p=qmod2
我们知道 [ ⟨ c , s ⟩ ] q = ⟨ c , s ⟩ − k q [\langle\mathbf c,\mathbf s\rangle]_q=\langle\mathbf c,\mathbf s\rangle-kq [⟨c,s⟩]q=⟨c,s⟩−kq和 [ ⟨ c ′ , s ⟩ ] p = ⟨ c ′ , s ⟩ − k p [\langle \mathbf c',\mathbf s\rangle]_p =\langle \mathbf c',\mathbf s\rangle-kp [⟨c′,s⟩]p=⟨c′,s⟩−kp(模计算可以表示成减去模数的倍数)
由此得到第一个结论
[
[
⟨
c
′
,
s
⟩
]
p
]
2
=
[
⟨
c
′
,
s
⟩
−
k
p
]
2
=
[
⟨
c
,
s
⟩
−
k
q
]
2
=
[
⟨
c
,
s
⟩
]
q
m
o
d
2
[[\langle \mathbf c',\mathbf s\rangle]_p]_2=[\langle \mathbf c',\mathbf s\rangle-kp]_2=[\langle\mathbf c,\mathbf s\rangle-kq]_2=[\langle\mathbf c,\mathbf s\rangle]_q \mod 2
[[⟨c′,s⟩]p]2=[⟨c′,s⟩−kp]2=[⟨c,s⟩−kq]2=[⟨c,s⟩]qmod2
保证了解密时的正确性。
接着因为 s s s很小,且
[
⟨
c
′
,
s
⟩
]
p
=
⟨
c
′
,
s
⟩
−
k
p
=
⟨
c
′
,
s
⟩
−
k
q
⋅
p
q
=
⟨
c
′
,
s
⟩
+
p
q
⋅
(
[
⟨
c
,
s
⟩
]
q
−
⟨
c
,
s
⟩
)
=
⟨
c
′
,
s
⟩
−
p
q
⟨
c
,
s
⟩
+
p
q
[
⟨
c
,
s
⟩
]
q
=
p
q
⋅
[
⟨
c
,
s
⟩
]
q
+
⟨
c
′
−
(
p
q
)
c
,
s
⟩
=
p
q
⋅
[
⟨
c
,
s
⟩
]
q
+
s
m
a
l
l
p=⟨c′,s⟩−kp=⟨c′,s⟩−kq⋅pq=⟨c′,s⟩+pq⋅([⟨c,s⟩]q−⟨c,s⟩)=⟨c′,s⟩−pq⟨c,s⟩+pq[⟨c,s⟩]q=pq⋅[⟨c,s⟩]q+⟨c′−(pq)c,s⟩=pq⋅[⟨c,s⟩]q+small
倒数第二行等式的
c
′
−
(
p
q
)
c
\mathbf c'-(\frac pq)\mathbf c
c′−(qp)c是一个的系数在
(
−
1
,
1
)
(-1,1)
(−1,1)内的矩阵,所以内积肯定比
ℓ
1
(
s
)
\ell_1(s)
ℓ1(s)要小(
ℓ
1
\ell_1
ℓ1表示一阶范数,即向量每个元素的绝对值之和,它其实可以看作单位矩阵和
s
s
s做内积,对每个维度加上个绝对值)
由此得到第二个结论
∣
[
⟨
c
’
,
s
⟩
]
p
∣
=
p
q
⋅
[
⟨
c
,
s
⟩
]
q
+
⟨
c
′
−
(
p
q
)
c
,
s
⟩
<
(
p
q
)
⋅
∣
[
⟨
c
,
s
⟩
]
q
∣
+
ℓ
1
(
s
)
<
q
/
2
|[⟨c′,s⟩]p|=pq⋅[⟨c,s⟩]q+⟨c′−(pq)c,s⟩<(pq)⋅|[⟨c,s⟩]q|+ℓ1(s)<q/2
即,噪声也近乎按照比例下降。可做的乘法次数就从对数级别上升到了线性级别(
log
k
→
k
\log k \rightarrow k
logk→k),由此无需自举也能构建有限级加密方案。

c
′
←
S
c
a
l
e
(
c
,
q
,
p
,
r
)
\mathbf c'\leftarrow\mathsf{Scale}(\mathbf c,q,p,r)
c′←Scale(c,q,p,r):获取一个最靠近的整数向量,和前面理论说过的一样。使得后面满足
m
=
[
[
<
c
,
s
>
]
q
]
r
=
[
[
<
c
′
,
s
>
]
p
]
r
m = [[<\mathbf c,\mathbf s>]_q]_r =[[<\mathbf c',\mathbf s>]_p]_r
m=[[<c,s>]q]r=[[<c′,s>]p]r
方案算法:
F H E . S e t u p ( 1 λ , 1 L , b ) \mathsf{FHE.Setup}(1^\lambda,1^L,b) FHE.Setup(1λ,1L,b):
F H E . K e y G e n ( { p a r a m s j } ) \mathsf{FHE.KeyGen}(\{params_j\}) FHE.KeyGen({paramsj}):
F H E . E n c ( p a r a m s , p k , m ∈ { 0 , 1 } ) \mathsf{FHE.Enc}(params,pk,m\in\{0,1\}) FHE.Enc(params,pk,m∈{0,1}): 计算并输出 E . E n c ( A L , m ) \mathsf{E.Enc}(\mathbf A_L,m) E.Enc(AL,m).
F
H
E
.
D
e
c
(
p
a
r
a
m
s
,
s
k
,
c
)
\mathsf{FHE.Dec}(params,sk,\mathbf c)
FHE.Dec(params,sk,c): 根据密钥的层数选择
s
j
\mathbf s_j
sj, 计算并输出
E
.
D
e
c
(
s
j
,
c
)
\mathsf{E.Dec}(\mathbf s_j,\mathbf c)
E.Dec(sj,c).
此处我们忽略了确定密文层数的参数来化简表示,原文写的可以使用一个指示参数来指定。
同态计算中要用到模数交换过程和密钥交换过程, 作者将其统一为一个 R e f r e s h \mathsf{Refresh} Refresh过程:首先要根据计算密钥的格式, 将乘法(或加法)得到的结果进行 P o w e r o f 2 \mathsf{Powerof2} Powerof2操作, 然后依次进行模数切换和密钥切换,即,把一个 s j ’ = s j ⊗ s j \mathbf s_j’=\mathbf{s}_j\otimes\mathbf s_j sj’=sj⊗sj下得密文变为 s j − 1 \mathbf s_{j-1} sj−1下得密文.。
最后我们补充完同态借助 R e f r e s h \mathsf{Refresh} Refresh完成的同态运算过程(输入的两个密文都是同一个密钥加密出来的):
最后来看看整个方案的噪声增长:

在密钥交换和模交换后都会诞生一部分小的噪声,如果在模交换的时候设置模数为
q
q
q,那么乘法后的噪声就是
B
2
/
(
B
+
s
m
a
l
l
)
→
B
⋅
p
o
l
y
(
n
)
B^2/(B+small)\rightarrow B\cdot poly(n)
B2/(B+small)→B⋅poly(n)
同态加密(七)无自举的分级全同态加密 1 (Leveled)Fully Homomorphic Encryption without Bootstrapping
Brakerski Z, Gentry C, Vaikuntanathan V. (Leveled) fully homomorphic encryption without bootstrapping[J]. ACM Transactions on Computation Theory (TOCT), 2014, 6(3): 1-36.