目前,全同态加密FHE,仅仅在格上被构造出来。
编码
-
most significant bit encoding
-
Encode:
输入1比特的消息 u u u,计算
b = < s , a > + e + u ⋅ ⌊ q 2 ⌉ m o d q b = <s,a>+e + u\cdot \lfloor \dfrac{q}{2} \rceil \mod q b=<s,a>+e+u⋅⌊2q⌉modq
其中 e e e是一个很小的error输出
E n c ( u ) = ( a , b ) Enc(u) = (a,b) Enc(u)=(a,b) -
Decode:
输入 c = ( a , b ) c = (a,b) c=(a,b),计算
t = b − < s , a > ≈ u ⋅ ⌊ q 2 ⌉ m o d q t = b - <s,a> \approx u \cdot \lfloor \dfrac{q}{2} \rceil \mod q t=b−<s,a>≈u⋅⌊2q⌉modq
输出
D e c ( c ) = { 0 , t ≈ 0 1 , t ≈ q 2 Dec(c) = \left\{ \begin{aligned} 0,&& t \approx 0\\ 1,&& t \approx \dfrac{q}{2}\\ \end{aligned} \right. Dec(c)=⎩⎨⎧0,1,t≈0t≈2q
-
-
least significant bit encoding
-
Encode:
输入1比特的消息 u u u,计算
b = < s , a > + u ˉ m o d q b = <s,a> + \bar u \mod q b=<s,a>+uˉmodq
其中 u ˉ ≡ u m o d 2 \bar u \equiv u \mod 2 uˉ≡umod2是一个很小的error输出
E n c ( u ) = ( a , b ) Enc(u) = (a,b) Enc(u)=(a,b) -
Decode:
输入 c = ( a , b ) c = (a,b) c=(a,b),计算
t = b − < s , a > = u ˉ m o d q t = b - <s,a> = \bar u \mod q t=b−<s,a>=uˉmodq
输出
D e c ( c ) = { 0 , t ≡ 0 m o d 2 1 , t ≡ 1 m o d 2 Dec(c) = \left\{ \begin{aligned} 0,&& t \equiv 0 \mod 2\\ 1,&& t \equiv 1 \mod 2\\ \end{aligned} \right. Dec(c)={0,1,t≡0mod2t≡1mod2
-
-
如果记 s ˉ = ( − s , 1 ) \bar s = (-s,1) sˉ=(−s,1),那么 D e c ( c ) = < s ˉ , c > = b − < s , a > Dec(c) = <\bar s,c> = b-<s,a> Dec(c)=<sˉ,c>=b−<s,a>
-
当明文、密文的模数互素时,两种编码方式等价。可以在不知道 s s s的情况下从一种编码转换为另一种编码。
BV scheme
-
BV方案是一种FHE,它支持同态布尔运算 (模2加法、模2乘法)。由于这两个布尔逻辑是完备的,我们可以搭建起任意电路。
-
BV方案使用关于奇数 q q q的LWE秘密 s s s作为私钥,将LWE采样作为密文 c = ( a , b ) c=(a,b) c=(a,b)
-
使用least significant bit encoding编码方式: D e c ( c ) = < s ˉ , c > = u ˉ m o d q Dec(c) = <\bar s, c> = \bar u \mod q Dec(c)=<sˉ,c>=uˉmodq
-
加法同态:
< s ˉ , c 1 + c 2 > = < s ˉ , c 1 > + < s ˉ , c 2 > = u ˉ 1 + u ˉ 2 m o d q <\bar s, c_1 + c_2> = <\bar s,c_1> + <\bar s,c_2> = \bar u_1 + \bar u_2 \mod q <sˉ,c1+c2>=<sˉ,c1>+<sˉ,c2>=uˉ1+uˉ2modq -
乘法同态:
< s ˉ ⊗ s ˉ , c 1 ⊗ c 2 > = < s ˉ , c 1 > ⋅ < s ˉ , c 2 > = u ˉ 1 ⋅ u ˉ 2 m o d q <\bar s \otimes \bar s, c_1 \otimes c_2> = <\bar s,c_1> \cdot <\bar s,c_2> = \bar u_1 \cdot \bar u_2 \mod q <sˉ⊗sˉ,c1⊗c2>=<sˉ,c1>⋅<sˉ,c2>=uˉ1⋅uˉ2modq
其中的 ⊗ \otimes ⊗是克罗内克积 (Kronecker product)对于 c 1 , c 2 ∈ Z q n c_1,c_2 \in Z_q^n c1,c2∈Zqn,有
c 1 ⊗ c 2 = ( c 1 , i ⋅ c 2 , j ) i , j ∈ Z q n 2 c_1 \otimes c_2 = (c_{1,i} \cdot c_{2,j})_{i,j} \in Z_q^{n^2} c1⊗c2=(c1,i⋅c2,j)i,j∈Zqn2 -
随着密文同态乘法的计算,密文的规模迅速增大。每次相乘,因为和 c i ∈ Z q n c_i \in Z_q^n ci∈Zqn做克罗内克积,其密文的规模扩大 n n n倍。
-
同时,噪声规模也在迅速增长。若干次同态乘法后,噪声将会大到淹没原始信息的程度,从而导致解密失败。
Key switching technique
-
通过替换密钥,约简密文的维度。
-
假设 s i n s_{in} sin把信息 u u u加密为 c i n c_{in} cin,令 s i n , c i n ∈ Z q n i n s_{in},c_{in} \in Z_q^{n_{in}} sin,cin∈Zqnin
< s i n , c i n > = ( s i n t G ) ⋅ G − 1 ( c i n ) ≈ u ⋅ ⌊ q 2 ⌉ <s_{in},c_{in}> = (s_{in}^tG) \cdot G^{-1}(c_{in}) \approx u \cdot \lfloor \dfrac{q}{2} \rceil <sin,cin>=(sintG)⋅G−1(cin)≈u⋅⌊2q⌉
其中 G ∈ Z q n i n × ( n i n l ) G \in Z_q^{n_{in} \times (n_{in}l)} G∈Zqnin×(ninl)是工具矩阵 (Gadget Matrix),编码方式为most significant bit encoding -
选取 s o u t ∈ Z q n o u t s_{out} \in Z_q^{n_{out}} sout∈Zqnout,对于方程
s o u t t K ≈ s i n t G m o d q s_{out}^tK \approx s_{in}^t G \mod q souttK≈sintGmodq
可以求解 K ∈ Z q n o u t × ( n i n l ) K \in Z_q^{n_{out} \times (n_{in}l)} K∈Zqnout×(ninl),它的第 j j j列是关于 s o u t s_{out} sout的LWE采样 ( a , s o u t t a + e + s i n t G j ) (a,s_{out}^ta+e+s_{in}^t G_j) (a,soutta+e+sintGj)如果 s i n s_{in} sin与 s o u t s_{out} sout独立,那么 K K K是伪随机的。
-
令
c o u t = K ⋅ G − 1 ( c i n ) ∈ Z q n o u t c_{out} = K \cdot G^{-1}(c_{in}) \in Z_q^{n_{out}} cout=K⋅G−1(cin)∈Zqnout
其中 G − 1 ( c i n ) G^{-1}(c_{in}) G−1(cin)是短整数向量。 -
容易验证
< s o u t , c o u t > = ( s o u t t K ) ⋅ G − 1 ( c i n ) ≈ ( s i n t G ) ⋅ G − 1 ( c i n ) = < s i n , c i n > <s_{out},c_{out}> = (s_{out}^t K) \cdot G^{-1}(c_{in}) \approx (s_{in}^tG) \cdot G^{-1}(c_{in}) = <s_{in},c_{in}> <sout,cout>=(souttK)⋅G−1(cin)≈(sintG)⋅G−1(cin)=<sin,cin>
即 s o u t s_{out} sout把信息 u u u加密为 c o u t c_{out} cout
Modulus reduction technique
-
将模数 q q q除掉 p o l y ( n ) poly(n) poly(n),控制错误比率几乎不变。
-
设置 q = n Θ ( d ) q = n^{\Theta(d)} q=nΘ(d),那么可以支持深度 d d d的乘法电路。
-
当从 Z q Z_q Zq转换到 Z q ′ Z_{q'} Zq′时,使用舍入操作 ⌊ c ⌉ q ′ = ⌊ q ′ q ⋅ c ⌉ \lfloor c \rceil_{q'} = \lfloor \dfrac{q'}{q} \cdot c \rceil ⌊c⌉q′=⌊qq′⋅c⌉
-
那么
< s , c > ∈ e + q Z ⇓ < s , ⌊ c ⌉ q ′ > ∈ < s , q ′ q ⋅ c + [ − 0.5 , 0.5 ] n > ⊆ ( q ′ q ⋅ e + ∥ s ∥ n ⋅ [ − 0.5 , 0.5 ] ) + q ′ Z \begin{aligned} <s, c> &\in\, e+qZ\\ &\Downarrow\\ <s, \lfloor c \rceil_{q'}> &\in\,\,\, <s, \dfrac{q'}{q} \cdot c + [-0.5,0.5]^n>\\ &\sube (\dfrac{q'}{q} \cdot e + \|s\|\sqrt n \cdot [-0.5,0.5]) + q'Z \end{aligned} <s,c><s,⌊c⌉q′>∈e+qZ⇓∈<s,qq′⋅c+[−0.5,0.5]n>⊆(qq′⋅e+∥s∥n⋅[−0.5,0.5])+q′Z -
由于 s s s是短向量,因此在 Z q ′ Z_{q'} Zq′上的错误比率维持在 ∣ e ∣ / q |e|/q ∣e∣/q附近。
Bootstrapping
- 目前的FHE都是“leveled”的。即:虽然可以支持同态加法和同态乘法两种运算,且同态加法 (几乎) 可以无限次运算;但是,同态乘法会使得密文中的噪声迅速增长,淹没掉原始的信息,从而无法正确解密。
- 为了获得“unbounded”的FHE,Gentry提出了一种自举算法:将私钥 s k 1 sk_1 sk1用公钥 p k 2 pk_2 pk2加密,将 p k 1 pk_1 pk1下的密文也用公钥 p k 2 pk_2 pk2加密,然后运行解密函数 (同态运算),得到 p k 2 pk_2 pk2下的密文。
- 只要解密操作没有消耗掉所有的乘法次数,那么就可以继续在密文下对消息进行同态计算了。
- 设置 s k 1 = s k 2 = s k , p k 1 = p k 2 = p k sk_1=sk_2=sk,\,pk_1=pk_2=pk sk1=sk2=sk,pk1=pk2=pk,这需要额外的安全要求:循环 (circular) 加密安全,即使用 p k pk pk加密 s k sk sk后得到的 c s k c_{sk} csk对于消息 m m m的密文 c c c的解密没有帮助。
- 这条性质很难证明,但同时目前也没有攻击方案。