BFV是把Bra12的LWE版本推到了RLWE版本,Bra12也可以叫做BFV。
对比以前的Regev的LWE公钥加密方案,其实几乎只是把明文空间换了,也就是在最大比特编码的时候把2换成t,即,
Δ
=
⌊
q
/
t
⌋
\Delta = \lfloor q/t \rfloor
Δ=⌊q/t⌋。同时这里的
q
q
q是没有限制的,也就是可以使用2的幂次来简化运算。
这里可以这样看
s
=
(
1
,
s
)
\mathbf s = (1,\mathbf s)
s=(1,s),
c
t
=
(
c
0
,
c
1
)
\mathbf {ct}=(\mathbf c_0,\mathbf c_1)
ct=(c0,c1)。
对于正确性验证
c
0
+
c
1
⋅
s
=
p
0
⋅
u
+
e
1
+
Δ
⋅
m
+
p
1
⋅
u
+
e
2
=
−
a
⋅
s
⋅
u
+
e
⋅
u
+
e
1
+
Δ
⋅
m
+
a
⋅
s
⋅
u
+
e
2
⋅
s
=
Δ
⋅
m
+
e
⋅
u
+
e
1
+
e
2
⋅
s
(
m
o
d
q
)
可以看到这里的噪声似乎与
u
\mathbf u
u和
s
\mathbf s
s有关,如果将这两个取的小一点,能够一定程度上减低噪声。
另外,将噪声用
v
=
e
⋅
u
+
e
1
+
e
2
⋅
s
\mathbf v = \mathbf e \cdot \mathbf u +\mathbf e_1 + \mathbf e_2 \cdot \mathbf s
v=e⋅u+e1+e2⋅s表示,能够得到
[
c
0
+
c
1
⋅
s
]
q
=
Δ
⋅
m
+
v
[\mathbf c_0+\mathbf c_1 \cdot \mathbf s ]_q =\Delta \cdot \mathbf m + \mathbf v
[c0+c1⋅s]q=Δ⋅m+v,与此同时若取样的
χ
≤
B
\chi \le B
χ≤B的话,我们将得到噪声的界限,即
v
≤
2
⋅
B
2
⋅
δ
R
+
B
\mathbf v \le 2\cdot B^2 \cdot \delta_R+B
v≤2⋅B2⋅δR+B,其中
δ
R
\delta_R
δR表示扩张因子
δ
R
=
max
{
∥
a
⋅
b
∥
∥
a
∥
⋅
∥
b
∥
:
a
,
b
∈
R
}
\delta_{R}=\max \left\{\frac{\|a \cdot b\|}{\|a\| \cdot\|b\|}: a, b \in R\right\}
δR=max{∥a∥⋅∥b∥∥a⋅b∥:a,b∈R},其中的
∣
∣
a
∣
∣
=
m
a
x
i
∣
a
i
∣
||a||=max_i|a_i|
∣∣a∣∣=maxi∣ai∣为无穷范数。
方案是基于前面的LPR.ES方案的,作为优化,该方案增加了一个重线性化,将
u
\mathbf u
u和
s
\mathbf s
s的取值范围变为
R
2
\mathbb R_2
R2,即它们的范数为1,其他基本一致
借用BV11里面的思想,将解密过程看作一个解密函数,即得到,
[
c
t
(
x
)
]
q
=
[
c
0
+
c
1
⋅
x
]
q
[\mathbf {ct}(\mathbf x)]_q=[\mathbf c_0+\mathbf c_1 \cdot \mathbf x ]_q
[ct(x)]q=[c0+c1⋅x]q
代入密钥就能得到明文
[
c
t
(
s
)
]
q
=
Δ
⋅
m
+
v
[\mathbf {ct}(\mathbf s)]_q= \Delta \cdot \mathbf m + \mathbf v
[ct(s)]q=Δ⋅m+v
来看看核心的乘法运算
该定理表明,乘法时,噪声不是呈平方增长,而是大致上乘以了一个系数 2 ⋅ t ⋅ δ R 2 ⋅ ∣ ∣ s ∣ ∣ 2\cdot t\cdot \delta_R^2\cdot||\mathbf s|| 2⋅t⋅δR2⋅∣∣s∣∣,也就是线性增长,从表达式里能看到,对噪声有显著影响的是 t t t和 s \mathbf s s的范数。(具体引理证明感兴趣可以去原文看看😇)
然后用BV11中的函数思想,两个函数相乘得到的将是三项,成为二次函数,需要执行重线性化让它还原为两项也就是一次式。
假设一个二阶的密文为
[
c
0
,
c
1
,
c
2
]
[\mathbf c_0,\mathbf c_1,\mathbf c_2]
[c0,c1,c2],线性化的目的是将它变成一阶的
[
c
0
′
,
c
1
′
]
[\mathbf c'_0,\mathbf c'_1]
[c0′,c1′]即
[
c
0
+
c
1
⋅
s
+
c
2
⋅
s
2
]
q
=
[
c
0
′
+
c
1
′
⋅
s
+
r
]
q
\left[\mathbf{c}_{0}+\mathbf{c}_{1} \cdot \mathbf{s}+\mathbf{c}_{2} \cdot \mathbf{s}^{2}\right]_{q}=\left[\mathbf{c}_{0}^{\prime}+\mathbf{c}_{1}^{\prime} \cdot \mathbf{s}+\mathbf{r}\right]_{q}
[c0+c1⋅s+c2⋅s2]q=[c0′+c1′⋅s+r]q,其中
r
\mathbf r
r很小。
由于
s
2
\mathbf s^2
s2是不可知的,所以这里选用的方式是加密一手。
为此,这里引入了一个重线性化密钥
r
l
k
=
(
[
−
(
a
0
⋅
s
+
e
0
)
+
s
2
]
q
,
a
0
)
rlk=([-(\mathbf a_0 \cdot \mathbf s +\mathbf e_0)+\mathbf s^2]_q,\mathbf a_0)
rlk=([−(a0⋅s+e0)+s2]q,a0),满足
r
l
k
[
0
]
+
r
l
k
[
1
]
⋅
s
=
s
2
+
e
0
rlk[0]+rlk[1]\cdot \mathbf s =\mathbf s^2 +\mathbf e_0
rlk[0]+rlk[1]⋅s=s2+e0
第一种使用
r
l
k
rlk
rlk来转换密文的方法是令
c
0
′
=
c
0
+
r
l
k
[
0
]
⋅
c
2
\mathbf c'_0 = \mathbf c_0+rlk[0]\cdot\mathbf c_2
c0′=c0+rlk[0]⋅c2和
c
1
′
=
c
1
+
r
l
k
[
1
]
⋅
c
2
\mathbf c'_1 = \mathbf c_1+rlk[1]\cdot\mathbf c_2
c1′=c1+rlk[1]⋅c2这样得到的噪声
r
=
e
0
⋅
c
2
\mathbf r=\mathbf e_0 \cdot \mathbf c_2
r=e0⋅c2(独立于密文的噪声,只是重线性化带来的噪声),但是由于
c
2
∈
R
q
\mathbf c_2 \in R_q
c2∈Rq,直接使用的话,会导致噪声被放大很多很多,所以需要进行分解。
那么这里的方法是选择一个基(独立于
t
t
t),将
c
2
\mathbf c_2
c2切片。即令
c
2
=
∑
i
=
0
ℓ
T
i
⋅
c
2
(
i
)
\mathbf c_2 = \sum_{i=0}^{\ell} T^i \cdot \mathbf c_2^{(i)}
c2=∑i=0ℓTi⋅c2(i),其中
ℓ
=
⌊
log
T
(
q
)
⌋
\ell=\lfloor\log_T(q) \rfloor
ℓ=⌊logT(q)⌋,且
c
2
(
i
)
\mathbf c_2^{(i)}
c2(i)系数均在
R
T
R_T
RT中,与此对应的设置重线性化密钥为
r
l
k
=
[
(
[
−
(
a
i
⋅
s
+
e
i
)
+
T
i
⋅
s
2
]
q
,
a
i
)
:
i
∈
[
0..
ℓ
]
]
rlk=\left[\left(\left[-\left(\mathbf{a}_{i} \cdot \mathbf{s}+\mathbf{e}_{i}\right)+T^{i} \cdot \mathbf{s}^{2}\right]_{q}, \mathbf{a}_{i}\right): i \in[0 . . \ell]\right]
rlk=[([−(ai⋅s+ei)+Ti⋅s2]q,ai):i∈[0..ℓ]]
由此得到更新后的密文为
c
0
′
=
[
c
0
+
∑
i
=
0
ℓ
rlk
[
i
]
[
0
]
⋅
c
2
(
i
)
]
q
and
c
1
′
=
[
c
1
+
∑
i
=
0
ℓ
rlk
[
i
]
[
1
]
⋅
c
2
(
i
)
]
q
\mathbf{c}_{0}^{\prime}=\left[\mathbf{c}_{0}+\sum_{i=0}^{\ell} \operatorname{rlk}[i][0] \cdot \mathbf{c}_{2}^{(i)}\right]_{q} \quad \text { and } \quad \mathbf{c}_{1}^{\prime}=\left[\mathbf{c}_{1}+\sum_{i=0}^{\ell} \operatorname{rlk}[i][1] \cdot \mathbf{c}_{2}^{(i)}\right]_{q}
c0′=[c0+∑i=0ℓrlk[i][0]⋅c2(i)]q and c1′=[c1+∑i=0ℓrlk[i][1]⋅c2(i)]q
最终得到的噪声将为
r
=
∑
i
=
0
ℓ
c
2
(
i
)
⋅
e
i
\mathbf r = \sum_{i=0}^\ell \mathbf c_2 ^{(i)}\cdot \mathbf e_i
r=∑i=0ℓc2(i)⋅ei。
这样操作的结果是
T
T
T越大,
r
l
k
rlk
rlk越小,噪声
r
\mathbf r
r就越大,但是
T
T
T越小,
r
l
k
rlk
rlk就会越大,那么计算速度就会变慢。同时由于重线性化的噪声独立于密文噪声,为了良好的同态,应该让噪声
r
\mathbf r
r的值在密文噪声的附近。
动态线性化:先选取足够小的
T
T
T来获取足够小的误差,当几次乘法导致误差变大后,可以选择对
T
2
T^2
T2进行线性化进行加速,也就是计算包含
T
2
T^2
T2的
r
l
k
rlk
rlk,由此
r
l
k
rlk
rlk中应当包含所需的所有信息。(有点懵还,原文是这么写的)
先给出一个能大模数的能够容纳较大误差噪声的加密版本的
s
2
\mathbf s^2
s2,然后再进行缩放来获取所需要的。
更新
r
l
k
=
(
−
[
(
a
⋅
s
+
e
)
+
p
⋅
s
2
]
p
⋅
q
,
a
)
rlk = (-[(\mathbf a \cdot \mathbf s + \mathbf e)+p \cdot \mathbf s^2]_{p \cdot q},\mathbf a)
rlk=(−[(a⋅s+e)+p⋅s2]p⋅q,a),其中
a
∈
R
p
⋅
q
a \in R_{p \cdot q}
a∈Rp⋅q和
e
←
χ
′
\mathbf e \leftarrow \chi'
e←χ′(和前面是不一样的分布)。同时密文也要更新为,
c
0
′
′
=
[
⌊
c
2
⋅
r
l
k
[
0
]
p
⌋
]
q
\mathbf c_0'' = \left[\left\lfloor\frac{\mathbf{c}_{2} \cdot \mathbf{r l k}[0]}{p}\right\rfloor\right]_{q}
c0′′=[⌊pc2⋅rlk[0]⌋]q,
c
1
′
′
=
[
⌊
c
2
⋅
r
l
k
[
1
]
p
⌋
]
q
\mathbf c_1''=\left[\left\lfloor\frac{\mathbf{c}_{2} \cdot \mathbf{r l k}[1]}{p}\right\rfloor\right]_{q}
c1′′=[⌊pc2⋅rlk[1]⌋]q
简单计算能得到
c
0
′
′
+
c
1
′
′
⋅
s
=
c
2
′
′
⋅
s
2
+
r
\mathbf c_0''+\mathbf c_1'' \cdot s = \mathbf c_2'' \cdot \mathbf s^2 +\mathbf r
c0′′+c1′′⋅s=c2′′⋅s2+r
粗略的估算能得到
∥
r
∥
<
q
⋅
B
k
⋅
δ
R
p
+
(
δ
R
⋅
∥
s
∥
+
1
)
/
2
\|\mathbf{r}\|<\frac{q \cdot B_{k} \cdot \delta_{R}}{p}+\left(\delta_{R} \cdot\|s\|+1\right) / 2
∥r∥<pq⋅Bk⋅δR+(δR⋅∥s∥+1)/2
动态线性化:选择足够大的
p
p
p来获取足够小的误差,多次乘法噪声增大后就可以通过提取
p
′
/
p
p'/p
p′/p,切换模数,来形成有效
r
l
k
rlk
rlk进行加速。
这里方案和前面的LPR方案很类似,不同的是,
s
\mathbf s
s和
u
\mathbf u
u的取值范围是
R
2
R^2
R2(这是为了减小噪声),多了重线性化密钥(缩减密文规模的)。
密文的形式是
c
t
=
(
c
0
,
c
1
)
\mathbf ct=(\mathbf c_0,\mathbf c_1)
ct=(c0,c1),乘法其实就是两个密文对应项的乘,然后类似Bra12中的一样乘以一个缩放系数
t
/
q
t/q
t/q用于减小噪声
然后是重线性化,和之前描述的一样
要实现乘法深度为
L
L
L的电路,需要满足
4
⋅
δ
R
L
⋅
(
δ
R
+
1.25
)
L
+
1
⋅
t
L
−
1
<
⌊
q
/
B
⌋
4 \cdot \delta_{R}^{L} \cdot\left(\delta_{R}+1.25\right)^{L+1} \cdot t^{L-1}<\lfloor q / B\rfloor
4⋅δRL⋅(δR+1.25)L+1⋅tL−1<⌊q/B⌋
(这块儿有点迷糊,没咋看懂,后面有需要再补吧)
采用的是Gentry的Bootstrapping方法,即在噪声达到最大值之前,进行一次同态解密,使得密文具有固定的噪声,且之后仍能进行一次乘法运算。
同态解密的条件是解密电路的深度必须小于同态运算最大深度,由此,需要对上面方案的解密方案进行处理。
这里采用的是不允许解密运算中的噪声
v
\mathbf v
v增长到界限,而是将它限制在
Δ
/
μ
(
μ
>
2
)
\Delta/\mu(\mu>2)
Δ/μ(μ>2)内,可以通过将低位全部设置为0来忽略
c
t
[
0
]
\mathbf ct[0]
ct[0]和
c
t
[
1
]
\mathbf ct[1]
ct[1]中的大部分,从而达到优化解密的目的。
设置后,会增加一部分误差,即,把
c
t
[
0
]
\mathbf ct[0]
ct[0]和
c
t
[
1
]
\mathbf ct[1]
ct[1],替换为了
c
0
=
c
t
[
0
]
+
e
0
\mathbf c_0 =\mathbf ct[0]+\mathbf e_0
c0=ct[0]+e0和
c
1
=
c
t
[
1
]
+
e
1
\mathbf c_1 =\mathbf ct[1]+\mathbf e_1
c1=ct[1]+e1(
∣
∣
e
i
∣
∣
<
Δ
/
v
||\mathbf e_i||< \Delta/v
∣∣ei∣∣<Δ/v)。
这样将得到一个增加了新噪声的密文
c
0
+
c
1
⋅
s
=
Δ
⋅
m
+
v
+
e
0
+
e
1
⋅
s
+
q
⋅
r
\mathbf{c}_{0}+\mathbf{c}_{1} \cdot \mathbf{s}=\Delta \cdot \mathbf{m}+\mathbf{v}+\mathbf{e}_{0}+\mathbf{e}_{1} \cdot \mathbf{s}+q \cdot \mathbf{r}
c0+c1⋅s=Δ⋅m+v+e0+e1⋅s+q⋅r
为了约束新增加的噪声,这里定义了两个函数
abs
(
a
(
x
)
)
∈
Z
[
x
]
\operatorname{abs}(a(x)) \in Z[x]
abs(a(x))∈Z[x]为将系数绝对值化后的多项式,并定义函数
H
(
f
)
=
max
{
∥
∑
i
=
0
d
−
1
abs
(
x
i
+
j
m
o
d
f
(
x
)
)
∥
∣
j
=
0
,
…
,
d
−
1
}
H(f)=\max \left\{\left\|\sum_{i=0}^{d-1} \operatorname{abs}\left(x^{i+j} \bmod f(x)\right)\right\| \mid j=0, \ldots, d-1\right\}
H(f)=max{∥∥∥∑i=0d−1abs(xi+jmodf(x))∥∥∥∣j=0,…,d−1}
对于分圆多项式如
f
=
x
d
+
1
f=x^d +1
f=xd+1,代入上面函数能得到
H
(
f
)
=
1
H(f)=1
H(f)=1,用
h
h
h代表
s
\mathbf s
s的汉明距离(比特中的非0个数),会得到噪声的界限是
Δ
/
μ
+
(
H
(
f
)
⋅
h
+
1
)
⋅
Δ
/
ν
\Delta / \mu+(H(f) \cdot h+1) \cdot \Delta / \nu
Δ/μ+(H(f)⋅h+1)⋅Δ/ν,当满足条件
2
⋅
μ
⋅
(
H
(
f
)
⋅
h
+
1
)
<
ν
⋅
(
μ
−
2
)
2 \cdot \mu \cdot(H(f) \cdot h+1)<\nu \cdot(\mu-2)
2⋅μ⋅(H(f)⋅h+1)<ν⋅(μ−2)时,密文能够正确解密。
Fan, Junfeng and Frederik Vercauteren. “Somewhat Practical Fully Homomorphic Encryption.” IACR Cryptol. ePrint Arch. 2012 (2012): 144.
全同态加密BFV-(section 1-基础知识)
全同态加密BFV-(section 2-SHE)
全同态加密:BFV