本文是ZJU Crypto School 2023中Lattice 3-4相关内容的总结。
在这一篇文章中,我们将涉及:
- L W E ≤ P K E LWE \leq PKE LWE≤PKE,此即,我们可以基于LWE构造公钥加密
- 进一步地,我们如何构造签名?FHE?怎么优化参数?
此即:构造
L
W
E
≤
P
K
E
LWE \leq PKE
LWE≤PKE
L
W
E
≤
S
I
G
LWE \leq SIG
LWE≤SIG
L
W
E
≤
F
H
E
LWE \leq FHE
LWE≤FHE
(在后两者中,我们将使用格Trapdoor技巧)
PKE
首先,我们回顾Oded Regev的PKE构造方案(的一种构造方式)。它是很多IBE/FHE方案的基础。
KeyGen
\operatorname{KeyGen}
KeyGen:我们生成
A
∈
Z
q
n
×
m
A \in \mathbb Z_q^{n \times m}
A∈Zqn×m。(这里需要
A
A
A是一个矮胖的矩阵,即
n
<
m
n < m
n<m)。
r
r
r是一个短向量,不妨认为
r
∈
{
0
,
1
}
m
r \in \{0, 1\}^m
r∈{0,1}m。计算
u
=
A
r
u = Ar
u=Ar。
于是:
- 公钥 p k = ( A , u = A r ) pk = (A, u = Ar) pk=(A,u=Ar)
- 私钥 s k = r sk = r sk=r。
Enc
p
k
(
m
)
\operatorname{Enc}_{pk}(m)
Encpk(m):我们生成均匀随机(uniformly random)的
s
←
Z
q
n
s \leftarrow \mathbb{Z}_q^n
s←Zqn,计算
(
c
1
,
c
2
)
=
(
s
A
+
e
,
s
u
+
e
′
+
q
2
m
)
(c_1, c_2) = (sA+e, su+e'+\frac{q}{2}m)
(c1,c2)=(sA+e,su+e′+2qm)
其中
e
,
e
′
e, e'
e,e′都是噪声。则
(
c
1
,
c
2
)
(c_1, c_2)
(c1,c2)为密文。
Dec s k ( c 1 , c 2 ) \operatorname{Dec}_{sk}(c_1, c_2) Decsk(c1,c2):计算 ⌊ c 2 − c 1 ⋅ r ⌉ \lfloor c_2 - c_1 \cdot r\rceil ⌊c2−c1⋅r⌉。其中 ⌊ ⋅ ⌉ \lfloor ·\rceil ⌊⋅⌉是取整。
我们考察解密正确性,即计算 c 2 − c 1 ⋅ r c_2 - c_1 \cdot r c2−c1⋅r。
c
2
−
c
1
r
c_2 - c_1r
c2−c1r
=
(
s
u
+
e
′
+
q
2
m
)
−
(
s
A
+
e
)
r
= (su+e'+\frac{q}{2}m) - (sA+e)r
=(su+e′+2qm)−(sA+e)r
=
s
A
r
+
e
′
+
q
2
m
−
s
A
r
−
e
r
= sAr+e'+\frac{q}{2}m- sAr - er
=sAr+e′+2qm−sAr−er
=
q
2
m
+
e
′
−
e
r
= \frac{q}{2}m + e' - er
=2qm+e′−er
其中后面的 e ′ + s e − e r e' + se - er e′+se−er是小的。于是,我们只需要考察 q 2 m \frac{q}{2}m 2qm是接近于0还是接近于 q 2 \frac{q}{2} 2q(在 m o d q \mod q modq意义下)。
在这里。我们需要知道 r r r是一个短向量。如果 r r r太大,那么无法保证解密的正确性。
PKE安全性
下面,我们考虑上述PKE方案的安全性。我们首先观察密文的形式:
( c 1 , c 2 ) = ( s A + e , s u + e ′ + q 2 m ) (c_1, c_2) = (sA+e, su+e'+\frac{q}{2}m) (c1,c2)=(sA+e,su+e′+2qm)
注意到 c 1 , c 2 c_1, c_2 c1,c2长得都比较像LWE的sample。 c 1 c_1 c1显然就是一个LWE。如果 u u u是uniformly random的向量,那么 c 2 c_2 c2也将是一个LWE的sample。
但是 u = A r + e u=Ar+e u=Ar+e,从构造上来看, u u u其实并不是在 Z q n \mathbb Z_q^n Zqn上uniformly random的。因为 r r r是在 { 0 , 1 } m \{0, 1\}^m {0,1}m上均匀随机的而不是在 Z q n \mathbb Z_q^n Zqn上均匀随机的。
但是 u u u实际上和uniformly random(在统计上)不可区分的。
为了说明这样一件事情,我们引入Leftover Hash Lemma(LHL)。
它大概是说,你如果从 { 0 , 1 } \{0, 1\} {0,1}中均匀随机选 r r r,那么 u = A r u=Ar u=Ar的分布和均匀随机(在统计上)不可区分。
剩余哈希引理(LHL)
引理(Leftover Hash Lemma, LHL).
A
←
Z
q
n
×
m
A \leftarrow \mathbb{Z}_q^{n \times m}
A←Zqn×m,
r
←
{
0
,
1
}
m
r \leftarrow \{0, 1\}^m
r←{0,1}m,
u
←
Z
q
n
u \leftarrow \mathbb{Z}_q^n
u←Zqn。如果
m
>
n
log
q
+
O
(
1
log
q
)
m > n\log q + O(\frac{1}{\log q})
m>nlogq+O(logq1),那么
(
A
,
A
r
)
≈
ϵ
(
A
,
u
)
(A, Ar)\approx_\epsilon (A, u)
(A,Ar)≈ϵ(A,u)
其中, ≈ ϵ \approx_\epsilon ≈ϵ指统计距离的差为 ϵ \epsilon ϵ。
即, ( A , A r ) (A, Ar) (A,Ar)和 ( A , u ) (A, u) (A,u)是统计上不可区分的。
我们在这里不会去证明LHL。但是,我们提供一种理解LHL的思路:LHL本质上是一种对随机性的提取或者降维(Randomness extraction)。
假设存在一个随机源 r r r。这个 r r r均匀采样于 { 0 , 1 } m \{0, 1\}^m {0,1}m,但是如果把这个 r r r放在 Z q m \mathbb Z_q^m Zqm下,那么它显然不是 Z q m \mathbb Z_q^m Zqm上均匀随机的。
我们计算 A r Ar Ar。这个 A r Ar Ar就是一个提取(或者压缩)随机性的过程。矮胖的矩阵 A A A就是提取器。
取对数底数为2,于是 r r r的熵是 m log 2 m\log 2 mlog2。如果 u u u是真随机的,那么 u u u的熵就是 n log q n\log q nlogq。
因此,如果 m log 2 m\log 2 mlog2比 n log q n\log q nlogq大一点点,那么可以认为 r r r中包含的随机性足够萃取成一个 Z q n \mathbb Z^n_q Zqn上的随机向量。我们就可以在计算上认为 A r Ar Ar就是随机的。
从这里的分析来看,引理中涉及的不等式 m > n log q + O ( 1 log q ) m > n\log q + O(\frac{1}{\log q}) m>nlogq+O(logq1)似乎是存在一些不准确的地方。
定理. 上述PKE是安全的,并且密文是伪随机的。
我们需要证明, ( p k , Enc p k ( m ) ) (pk, \operatorname{Enc}_{pk}(m)) (pk,Encpk(m))和 ( p k , u n i f o r m ) (pk, uniform) (pk,uniform)是统计不可区分的。
( p k , Enc p k ( m ) ) = ( A , u = A r , s A + e , s u + e ′ + q 2 m ) (pk, \operatorname{Enc}_{pk}(m)) = (A, u = Ar, sA+e, su+e'+\frac{q}{2}m) (pk,Encpk(m))=(A,u=Ar,sA+e,su+e′+2qm),
我们有 p k = ( A , u = A r ) pk = (A, u = Ar) pk=(A,u=Ar)和 ( A , u 0 ) (A, u_0) (A,u0)不可区分(LHL)。这里 u 0 u_0 u0是真·均匀随机。
于是 ( p k , Enc p k ( m ) ) (pk, \operatorname{Enc}_{pk}(m)) (pk,Encpk(m))和 ( A , u 0 , s A + e , s u + e ′ + q 2 m ) (A, u_0, sA+e, su+e'+\frac{q}{2}m) (A,u0,sA+e,su+e′+2qm)不可区分。
根据LWE问题(和LHL), ( A , u 0 , s A + e , s u + e ′ + q 2 m ) (A, u_0, sA+e, su+e'+\frac{q}{2}m) (A,u0,sA+e,su+e′+2qm)和 ( A , u 0 , u 1 , u 2 + q 2 m ) (A, u_0, u_1, u_2+\frac{q}{2}m) (A,u0,u1,u2+2qm)是不可区分的。其中 u 1 , u 2 u_1, u_2 u1,u2是真·均匀随机。
最后,由于一次性密码本, ( A , u 0 , u 1 , u 2 + q 2 m ) (A, u_0, u_1, u_2+\frac{q}{2}m) (A,u0,u1,u2+2qm)和 ( A , u 0 , u 1 , u 2 ) (A, u_0, u_1, u_2) (A,u0,u1,u2)是不可区分的。
PKE的另一种形式
KeyGen \operatorname{KeyGen} KeyGen:
- p k = ( A , u ) pk = (A, u) pk=(A,u),其中 A ← Z q m × n ( m > n ) , u = A s + e A \leftarrow \mathbb Z_q^{m \times n} (m > n), u = As + e A←Zqm×n(m>n),u=As+e。 A A A是一个高矩阵。
- s k = s sk = s sk=s
Enc \operatorname{Enc} Enc:生成向量 r ← { 0 , 1 } m r \leftarrow \{0, 1\}^m r←{0,1}m。注意到 r r r是小的。则 Enc p k ( m ) = ( r A , r u + q 2 m ) \operatorname{Enc}_{pk}(m) = (rA, ru + \frac{q}{2}m) Encpk(m)=(rA,ru+2qm)。注意到,这里我们在加密的时候没有加噪声,那么密文的形式不再是LWE。于是在分析安全性的时候,就不能用到LWE了。
Dec \operatorname{Dec} Dec:给定密文 ( c 1 , c 2 ) (c_1, c_2) (c1,c2),计算 ⌊ c 2 − c 1 s ⌉ \lfloor c_2 - c_1s\rceil ⌊c2−c1s⌉。
(希望大家可以根据上下文分清 m m m作为维度和作为明文的区别。本文中这么写并不严谨,但是希望不会影阅响读)
解密的正确性:
c
2
−
c
1
s
c_2 - c_1s
c2−c1s
=
r
u
+
q
2
m
−
r
A
s
= ru + \frac{q}{2}m - rAs
=ru+2qm−rAs
=
r
A
s
+
r
e
+
q
2
m
−
r
A
s
= rAs + re + \frac{q}{2}m - rAs
=rAs+re+2qm−rAs
=
q
2
m
+
r
e
= \frac{q}{2}m + re
=2qm+re
安全性分析:我们将简述 ( p k , E n c ( m ) ) ≈ ( p k , u 0 ) (pk, Enc(m)) \approx (pk, u_0) (pk,Enc(m))≈(pk,u0)的证明思路,其中 u 0 u_0 u0是真·均匀随机。
首先,
(
A
,
u
,
c
1
,
c
2
)
(A, u, c_1, c_2)
(A,u,c1,c2)
=
(
A
,
u
=
A
s
+
e
,
c
1
=
r
A
,
c
2
=
r
u
+
q
2
m
)
= (A, u = As + e, c_1 = rA, c_2 = ru + \frac{q}{2}m)
=(A,u=As+e,c1=rA,c2=ru+2qm)
于是根据DLWE,我们无法区分
(
A
,
A
s
+
e
,
r
A
,
r
u
+
q
2
m
)
(A, As + e, rA, ru + \frac{q}{2}m)
(A,As+e,rA,ru+2qm)和
(
A
,
z
1
,
r
A
,
r
z
2
+
q
2
m
)
(A, z_1, rA, rz_2 + \frac{q}{2}m)
(A,z1,rA,rz2+2qm)。其中
z
i
z_i
zi是真·均匀随机。
又根据LHL,我们无法区分 r A rA rA和均匀随机向量、 r z 2 rz_2 rz2和随机向量。
名词拓展:Dual Mode Encryption。我们真实的pk是 ( A , u = A s + e ) (A, u=As+e) (A,u=As+e),但是这个pk是和 ( A , z ) (A,z) (A,z)是不可区分的。如果我们用真实的pk加密,就会得到上面的分布,用sk解密的话也能恢复明文的信息。但是如果用 ( A , z ) (A,z) (A,z)进行加密,那么你得到的结果就是均匀随机的东西。DME大概的意思是,你有可能在KeyGen时生成真实世界的pk,然后加解密过程就一切如常。但是在分析的时候,我们可以生成一个和真实世界不可区分的pk,那么在加密后,你的消息会被完完全全地掩盖。于是安全性得到了保证。
格中的陷门(Trapdoor)
陷门这个东西,可以拿来构造一些诸如签名、IBE、FHE的方案。
首先,什么是陷门?一种未经证实的类比,陷门类似于软件的后门。一个黑客直接攻破一个App难度很大。但是如果我们有软件后门,那么攻破这个App就有可能变得简单。
给定LWE/SIS问题,如果我们有了陷门,那么求解SIS/LWE问题就是简单的。如果没有陷门,那么求解SIS/LWE问题就是难的。
我们以SIS问题为例。随机选定 A A A, 任意给定 u u u,我们想找一个短向量 r r r,使得 A r = u Ar = u Ar=u。这就是SIS问题。找到符合要求的 r r r就意味着破解了SIS。
但是,如果我们换个顺序,给定 A , r A, r A,r,计算 A r = u Ar = u Ar=u,这就是很简单的事情。
陷门的存在就支持我们做这样的更换顺序的事情。具体地,SIS陷门意味着给你一个矩阵 T T T,你就可以把上述SIS问题变成给定 A , r A, r A,r,计算 A r = u Ar = u Ar=u的问题。如果没有这个 T T T,你就做不到这个事情。
早期,GPV方案构造了一个陷门,但是构造比较复杂。
后来,MP12方案构建了一个非常漂亮的陷门:G-Trapdoor。G-Trapdoor的命名来源于构造中产生的一个特定矩阵 G G G。可以基于MP12方案构造很多有意思的东西。
给定矩阵 G G G和向量 u u u,我们要找小的 r r r,使得 G r = u Gr = u Gr=u。如果 G G G和 u u u是随机的,那么这个事情不容易啊。但是,如果我们非常巧合地把 G G G选成了单位矩阵 I I I,那么这个事情就有可能是非常简单的。
具体地,假如我们在格 Z q 2 \mathbb Z_q^2 Zq2上随机采样选取格基 ( 1 , 0 ) (1, 0) (1,0)和 ( 0 , 1 ) (0, 1) (0,1),把它捏成矩阵 G G G(于是 G G G是单位矩阵),那么对于任意的向量 u u u,求解 G r = u Gr = u Gr=u的过程将变成无聊的报坐标过程。但是如果我们对 G G G做一个线性变换,搞出来一个随机矩阵 A A A,那么求解 A z = u Az=u Az=u就基本意味着解SIS了。
今天,我们假设有这样一个让整件事情变得容易的 G G G。如果对于选定的随机矩阵 A A A,存在一个矩阵 T T T,使得 A T = G AT=G AT=G,那么如何找到 z z z,使得 A z = u Az = u Az=u?
我们可以走如下的步骤:
- 采样 r r r,使得 G r = u Gr = u Gr=u
- 输出 z = T r z = Tr z=Tr。于是 A ( T r ) = u A(Tr) = u A(Tr)=u。
此处, T T T就是陷门。其实,给定随机的矩阵 A A A,寻找 T T T是很困难的。
G G G能做到的事情还不止这些。
给定 ( G , s G + e ) (G, sG+e) (G,sG+e),找出 s s s和 e e e也是比较简单的。
我们假设这样的 G G G存在。那么我们是不是也可以构造一个LWE的陷门呢?
假设我们知道 A T = G AT=G AT=G,那么我们有 s A T + e T = s G + e ′ sAT+eT = sG+e' sAT+eT=sG+e′。于是可以顺利地求解出 s s s和 e e e。在这里,我们说这个 G G G可以做LWE Inversion。
注意,我们对于 T T T有一些额外的要求:如果 T T T过大,那么 e T = e ′ eT=e' eT=e′就是大的,可能导致解密的失败。
在前述的SIS陷门中也有同样的要求:如果 T T T太大, T r Tr Tr也不可避免地会变大(输出的 z z z就不是短向量了)。
下面的问题就是,能不能以及如何找到一个高品质的(小的) T T T。
构造方法:
-
首先,和经典的、不带Trapdoor的LWE一样,采样 A ← Z q n × m A \leftarrow \mathbb Z_q^{n \times m} A←Zqn×m(A是一个矮胖的矩阵)
-
Trapdoor采样:采样 ( A , B ) (A,B) (A,B)。并且,如果我们把 B B B遮住,我们希望 A A A看着就像均匀随机。MP12中的构造方法如下:
构造 [ A 1 A 2 ] [A_1 \ \ A_2] [A1 A2],其中 A i ∈ Z q n × m , i = 1 , 2 A_i \in Z_q^{n \times m}, i=1,2 Ai∈Zqn×m,i=1,2。 A 1 A_1 A1来自均匀采样, A 2 = A 1 R + G A_2 = A_1R+G A2=A1R+G,其中 R ← { 0 , 1 } m × m R \leftarrow \{0, 1\}^{m \times m} R←{0,1}m×m均匀随机。
这里,我们还没说 G G G怎么生成,但是我们先假设存在这样的 G G G。
几个问题:
-
这里的 A A A为什么和Uniformly random不可区分?因为LHL。
-
怎么把 A A A转换到 G G G?即 A ⋅ ? = G A · ? = G A⋅?=G?
我们构造 [ A 1 A 1 R + G ] [ − R I ] = G \begin{bmatrix}A_1 \ A_1R + G\end{bmatrix} \begin{bmatrix}-R \\ I\end{bmatrix} = G [A1 A1R+G][−RI]=G,于是 T = [ − R I ] T = \begin{bmatrix}-R \\ I\end{bmatrix} T=[−RI]。这里,矩阵 R R R决定了 T T T的构造品质(范数)。
-
需要注意, G G G并不唯一。但是,存在构造 G G G的方法(比如下面将要介绍的构造)。
G G G是什么,需要满足什么性质?
- 给定 G G G, ∀ u \forall u ∀u,可以找到短向量 G r = u Gr = u Gr=u。
- 当用 G G G作为LWE中的矩阵时,LWE问题应当是简单的。
MP12中给出了 G G G的构造:
选取向量 g = [ 1 2 4 8 ⋯ q 2 ] g = [1\ 2\ 4\ 8\ \cdots \frac{q}{2}] g=[1 2 4 8 ⋯2q]。于是 G = g ⊗ I n G = g \otimes I_n G=g⊗In,其中 ⊗ \otimes ⊗是Kroneckor积。
有了这个向量 g g g,给定数字 a a a,我们可以求解 r r r,使得 g ⋅ r = a g \cdot r = a g⋅r=a。(二进制分解)
同理, G r = u Gr = u Gr=u也可以进行计算。其中 u u u是向量。
上面的步骤构造了基于SIS的陷门。
这个陷门如何用于LWE问题呢?
假设 q = 2 k q = 2^k q=2k。我们给定如前所述的向量 g g g,采样LWE example: s g + e sg + e sg+e。其中, s s s是数字, e e e是向量。LWE问题的的目标是,寻找 s s s和 e e e。
我们将向量拆解。
s
g
+
e
sg+e
sg+e是对这两个向量(都在
m
o
d
q
\mod q
modq意义下)求和:
(
s
s
⋅
2
⋯
s
⋅
2
k
−
1
)
(s \ s·2 \ \cdots \ s·2^{k-1} )
(s s⋅2 ⋯ s⋅2k−1)
(
e
0
e
1
⋯
e
k
−
1
)
(e_0 \ e_1 \ \cdots \ e_{k-1})
(e0 e1 ⋯ ek−1)
我们考虑 s ⋅ 2 k − 1 + e k − 1 s·2^{k-1}+e_{k-1} s⋅2k−1+ek−1。我们总是可以将 s s s写成 s = 2 s ′ + s 0 s=2s'+s_0 s=2s′+s0。于是 s ⋅ 2 k − 1 + e k − 1 = 2 k s ′ + 2 k − 1 ⋅ s 0 + e k − 1 s·2^{k-1}+e_{k-1} = 2^ks' + 2^{k-1}·s_0 + e_{k-1} s⋅2k−1+ek−1=2ks′+2k−1⋅s0+ek−1。
在 q = 2 k q=2^k q=2k的时候,你可以把 2 k s ′ 2^ks' 2ks′模掉,于是得到: 2 k − 1 s 0 + e k − 1 2^{k-1}s_0 + e_{k-1} 2k−1s0+ek−1。通过rounding就可以从中提取到 s 0 s_0 s0。这意味着,我们提取到了 s s s的最低比特位。重复这一步骤,于是我们可以求解出数字 s s s的每一个比特位,于是求解到整个 s s s。
最后,在SIS Trapdoor中,实际过程并不是输出 z = T r z = Tr z=Tr这么简单。它确实是输出短向量,但是这个短向量有可能泄露 T T T的信息。于是另一个问题是,我有一个Trapdoor,我可以找到一个短向量,但是这个短向量并不泄露 T T T的信息。处理的方法是给整套流程再添加一些随机项。
最后达到的目的就是,我们采样的样本只和格有关系,而和我们使用哪一组Trapdoor无关。
基于陷门的签名
有了Trapdoor以后,GPV方案基于它构造了签名:
KeyGen \operatorname{KeyGen} KeyGen: ( A , T ) (A, T) (A,T)——产生陷门。 p k = A , s k = T pk = A, sk=T pk=A,sk=T。
Sign ( m ) \operatorname{Sign}(m) Sign(m)。计算 r m r_m rm,使得 A ⋅ r m = H ( m ) A \cdot r_m = H(m) A⋅rm=H(m)。其中, H ( m ) H(m) H(m)是 m m m的哈希值。注意,需要有私钥 T T T的参与才能完成签名。
关于验签,我们只需要验证两件事:
- r m r_m rm是一个短向量;
- A ⋅ r m = H ( m ) A \cdot r_m = H(m) A⋅rm=H(m)。
定理. 在SIS问题的安全性假设以及random oracle(用于哈希)的安全性假设下,签名函数 Sign ( ⋅ ) \operatorname{Sign}(·) Sign(⋅)是安全的。
证明思路. 我们假设存在攻击者,他可以攻破这个签名函数。我们的证明目标是,存在归约,使得攻击者可以攻破SIS。
签名安全性的大致内容:一个对消息 m m m的签名如果是不安全的,那么意味着可以找到碰撞 m ′ m' m′,使得对 m , m ′ m, m' m,m′进行签名的结果是一样的。
首先,我们生成 ( A , T ) (A,T) (A,T)对,将 A A A公开。攻击者知道签名 r r r,于是知道 H ( m ) H(m) H(m),但是不知道私钥 T T T和签名对应的明文 m m m。
根据定义,攻击者可以通过查询RO来获取消息对应的哈希值。这意味着,RO需要维护一张表,对于给定的输入 x x x,RO要能查到对应的 r r r,并且返回 H ( x ) = A r H(x) = Ar H(x)=Ar。
现在假设攻击者要伪造 m ∗ , r ∗ m^*, r^* m∗,r∗使得 A r ∗ = H ( m ∗ ) = H ( m ) Ar^* = H(m^*) = H(m) Ar∗=H(m∗)=H(m)。
于是有 A ( r − r ∗ ) = 0 A(r - r^*) = 0 A(r−r∗)=0。
这意味着攻击者可以攻破SIS。
全同态加密(Fully Homomorphic Encryption)
首先,看一下全同态加密的概念。
我们任意选取若干的明文 x 1 , . . . , x n x_1,...,x_n x1,...,xn。与此同时有一个特殊的加密方案 ( K e y G e n , E n c , D e c ) (KeyGen, Enc, Dec) (KeyGen,Enc,Dec)。我们可以计算一个函数 f ( x 1 , . . . , x n ) f(x_1,...,x_n) f(x1,...,xn)。现在我们分别对这些明文进行加密,得到 c i = E n c ( x i ) , i = 1 , . . . , n c_i = Enc(x_i), i=1,...,n ci=Enc(xi),i=1,...,n。这个特殊加密方案还支持对密文 c 1 , . . . , c n c_1,...,c_n c1,...,cn做一些密文的运算 E n c E v a l ( f ) EncEval(f) EncEval(f)。计算 E n c E v a l ( f ) ( c 1 , . . . , c n ) EncEval(f)(c_1, ..., c_n) EncEval(f)(c1,...,cn)之后解密的结果,和在明文状态下计算 f ( x 1 , . . . , x n ) f(x_1,...,x_n) f(x1,...,xn)的结果是一样的。这就是同态加密的概念。
同态加密到目前为止经历了四代:
- 第一代:Gentry在2009年提出的基于ideal lattice的加密方案。
- 第二代:BV, BGV, BFV等方案——基于RLWE问题,支持对一个整数向量进行加密,进而支持SIMD运算。
- 第三代:GSW,一个非常简洁的方案。FHEW, TFHE等。
- 第四代:CKKS方案,支持浮点向量的运算。但是,第四代和第二代的方法没有什么本质上的差别,主要是编码消息时使用的技巧(基于Canonical Embedding)有所不同。但是这个方案因为可以对浮点数进行操作,所以在隐私保护机器学习中还是比较火的。
这一部分将基于GSW方案进行介绍。
这个方案有一个特征,就是在 K e y G e n KeyGen KeyGen时需要对外暴露两个Key。一个是公钥 p k pk pk,一个是在做同态计算时用到的密钥 e v k evk evk。
下面,我们来看具体的实现。
KeyGen \operatorname{KeyGen} KeyGen. 首先生成随机矩阵 A A A,采样私钥 s k = s sk = s sk=s,计算公钥 p k = [ A b ] = B pk = \begin{bmatrix}A \\ b\end{bmatrix} = B pk=[Ab]=B,其中 b = s A + e b = sA+e b=sA+e, e e e是误差。可以根据LHL证明 p k pk pk的伪随机性。
Enc \operatorname{Enc} Enc. 对比特 m m m进行加密。给定比特 m ∈ { 0 , 1 } m \in \{0, 1\} m∈{0,1},计算 C = B R + m G C= BR + mG C=BR+mG,其中 R ∈ { 0 , 1 } M × M R \in \{0, 1\}^{M \times M} R∈{0,1}M×M。
Dec \operatorname{Dec} Dec. 假如我们直接计算 ( − s , 1 ) ⋅ C = ( − s , 1 ) B R + ( − s , 1 ) m G = e R + ( − s , 1 ) m G (-s, 1) · C = (-s, 1)BR + (-s, 1)mG = eR + (-s, 1)mG (−s,1)⋅C=(−s,1)BR+(−s,1)mG=eR+(−s,1)mG,我们会发现仍然无法计算出 m m m。其中, ( − s , 1 ) ⋅ B = b − s A = e (-s, 1) · B = b - sA = e (−s,1)⋅B=b−sA=e。
下面的问题在于如何提取
m
m
m。我们找一个向量
r
r
r,使得
G
r
=
[
0
⋮
0
q
/
2
]
Gr = \begin{bmatrix} 0 \\ \vdots \\ 0 \\ q/2 \end{bmatrix}
Gr=
0⋮0q/2
于是有: ( − s , 1 ) ⋅ C r = ( − s , 1 ) B R r + ( − s , 1 ) m G r = e ′ ′ + m q / 2 (-s, 1) · Cr = (-s, 1)BRr + (-s, 1)mGr = e'' + mq/2 (−s,1)⋅Cr=(−s,1)BRr+(−s,1)mGr=e′′+mq/2。只需要考察 e ′ ′ + m q / 2 e'' + mq/2 e′′+mq/2更接近0还是 q / 2 q/2 q/2就可以了。
下面,我们考察加法的计算。假设有 C 1 = B R 1 + m 1 G C_1 = BR_1 + m_1G C1=BR1+m1G和 C 2 = B R 2 + m 2 G C_2 = BR_2 + m_2G C2=BR2+m2G。
可以直接得到: C 1 + C 2 = B ( R 1 + R 2 ) + ( m 1 + m 2 ) G C_1 + C_2 = B(R_1+R_2) + (m_1+m_2)G C1+C2=B(R1+R2)+(m1+m2)G。
但是做乘法不是那么容易。假设有 C 1 = B R 1 + m 1 G C_1 = BR_1 + m_1G C1=BR1+m1G和 C 2 = B R 2 + m 2 G C_2 = BR_2 + m_2G C2=BR2+m2G。我们所希望的是,做乘法之后的密文仍然有类似于 B R + m G BR + mG BR+mG的密文形式。
一个直观的想法是计算 C 1 G − 1 C 2 C_1G^{-1}C_2 C1G−1C2。
首先,我们可以计算矩阵 G G G的逆 G − 1 G^{-1} G−1。则有 G G − 1 = I GG^{-1} = I GG−1=I。
于是计算密文乘法的过程就类似于:
(
B
R
1
+
m
1
G
)
G
−
1
C
2
(BR_1 + m_1G)G^{-1}C_2
(BR1+m1G)G−1C2
=
B
R
1
G
−
1
C
2
+
m
1
G
G
−
1
C
2
= BR_1G^{-1}C_2 + m_1GG^{-1}C_2
=BR1G−1C2+m1GG−1C2
=
B
R
′
+
m
1
B
R
2
+
m
1
m
2
G
= BR'+m_1BR_2+m_1m_2G
=BR′+m1BR2+m1m2G
=
B
R
′
+
B
m
1
R
2
+
m
1
m
2
G
= BR' + Bm_1R_2 + m_1m_2G
=BR′+Bm1R2+m1m2G
=
B
R
′
′
+
m
1
m
2
G
= BR'' + m_1m_2G
=BR′′+m1m2G
于是转化成了我们想要的形式。
我们观察上述的乘法操作,可以发现:
-
G − 1 G^{-1} G−1大概将噪声扩大了 n \sqrt{n} n倍。
-
假如给定密文 C 1 , C 2 C_1, C_2 C1,C2,它们的噪声界分别为 b 1 > b 2 b_1 > b_2 b1>b2,那么你计算 C 1 C 2 C_1C_2 C1C2和计算 C 2 C 1 C_2C_1 C2C1的噪声界存在差别,因为乘法的先后次序不同,引入的噪声是不一样的。
在这个情况下,计算 C 2 G − 1 C 1 C_2G^{-1}C_1 C2G−1C1的噪声要比 C 1 G − 1 C 2 C_1G^{-1}C_2 C1G−1C2要小。
全同态加密的自举操作(Bootstrapping)
由于时间不够,课件里主要从high level讲了Bootstrapping。这里,我们建议读者参考本人的这篇博客给出的关于自举的简介。