FHE入门

1. 引言

Fully Homomorphic Encryption(FHE,全同态加密)长期以来一直被认为是密码学的圣杯之一。FHE前景光明:

  • FHE是一种加密类型,允许第三方对密文数据进行计算,并获得加密结果,
  • 可将密文结果交还给拥有原始数据解密密钥的任何人,而第三方本身无法解密数据或结果。
    在这里插入图片描述

如,使用第三方垃圾邮件过滤器来检查一组邮件是否是垃圾邮件。隐私需求源自两方面:

  • 1)服务端:垃圾邮件过滤器希望其算法具有隐私性:
    • 要么垃圾邮件过滤器提供商希望保持其源代码封闭,
    • 要么垃圾邮件过滤器依赖于他们不想公开披露的非常大的数据库,因为这会使攻击更容易,
    • 或者二者兼而有之。
  • 2)用户端:而用户关心其数据的隐私,且不想将未加密的电子邮件上传给第三方。

借助FHE的方案为:
在这里插入图片描述
FHE应用广泛,包括在区块链领域。如:

  • 可用于实现隐私保护轻节点(轻节点将加密index i i i传递给服务端,服务端计算并返回 d a t a [ 0 ] ∗ ( i = 0 ) + d a t a [ 1 ] ∗ ( i = 1 ) + . . . + d a t a [ n ] ∗ ( i = n ) data[0] * (i = 0) + data[1] * (i = 1) + ... + data[n] * (i = n) data[0](i=0)+data[1](i=1)+...+data[n](i=n),其中 d a t a [ i ] data[i] data[i]是区块或状态中的第 i i i 个数据及其 Merkle 分支, ( i = k ) (i = k) (i=k)是一个表达式,若 i = = k i == k i==k,则返回 1 1 1,否则返回 0 0 0;轻节点获得所需的数据,服务端对节点的请求一无所知。

FHE还可用于:

  • 更高效的stealth address协议,以及更普遍的隐私保护协议的扩容方案,目前这些协议要求每个用户亲自扫描整个区块链以查找incoming交易。
  • 隐私保护数据共享市场,允许用户对其数据执行某些特定的计算,同时完全控制自己的数据。
  • 更强大的密码学原语的组成部分,如更高效的多方计算协议,以及最终的混淆。

2. 部分同态加密、某种程度同态加密、全同态加密

同态加密有多种类型,主要区别在于其能基于密文所计算的函数类型:

  • 部分同态加密(Partially homomorphic encryption):仅支持基于密文做非常有限的操作:如,仅支持做密文加法(即根据 e n c r y p t ( a ) , e n c r y p t ( b ) encrypt(a), encrypt(b) encrypt(a),encrypt(b),来计算 e n c r y p t ( a + b ) encrypt(a+b) encrypt(a+b)),或,仅支持做密文乘法(即根据 e n c r y p t ( a ) , e n c r y p t ( b ) encrypt(a), encrypt(b) encrypt(a),encrypt(b),来计算 e n c r y p t ( a ∗ b ) encrypt(a*b) encrypt(ab))。
  • 某种程度同态加密(Somewhat homomorphic encryption):支持基于密文做加法以及有限次数的乘法(或,有限degree的多项式)。即,可根据原始密文 e n c r y p t ( x 1 ) , . . . , e n c r y p t ( x n ) encrypt(x_1), ... ,encrypt(x_n) encrypt(x1),...,encrypt(xn),可计算 e n c r y p t ( P ( x 1 , . . . , x n ) ) encrypt(P(x_1, ... ,x_n)) encrypt(P(x1,...,xn)),其中 P ( x 1 , . . . , x n ) P(x_1, ... ,x_n) P(x1,...,xn)为degree < D <D <D的多项式, D D D通常非常小,如取值为5到15。
  • 全同态加密(Fully homomorphic encryption):支持基于密文做无限次数的加法和无限次数的乘法。加法和乘法用于实现任意binary电路门(如 A N D ( x , y ) = x ∗ y 、 O R ( x , y ) = x + y − x ∗ y 、 X O R ( x , y ) = x + y − 2 ∗ x ∗ y 、仅关心奇偶用 x + y 、 N O T ( x ) = 1 − x AND(x, y) = x*y、OR(x,y)=x+y-x*y、XOR(x,y)=x+y-2*x*y、仅关心奇偶用x+y、NOT(x)=1-x AND(x,y)=xyOR(x,y)=x+yxyXOR(x,y)=x+y2xy、仅关心奇偶用x+yNOT(x)=1x,因此,这足以基于密文做任意计算。

部分同态加密相当容易,如:

  • RSA 具有乘法同态: e n c ( x ) = x e enc(x)=x^e enc(x)=xe e n c ( y ) = y e enc(y)=y^e enc(y)=ye, 所以 e n c ( x ) ∗ e n c ( y ) = ( x y ) e = e n c ( x y ) enc(x)*enc(y)=(xy)^e=enc(xy) enc(x)enc(y)=(xy)e=enc(xy)
  • 椭圆曲线具有加法同态: e n c ( x ) = x ∗ G , e n c ( y ) = y ∗ G enc(x)=x*G,enc(y)=y*G enc(x)=xGenc(y)=yG,所以 e n c ( x ) + e n c ( y ) = ( x + y ) ∗ G = e n c ( x + y ) enc(x)+enc(y)=(x+y)*G=enc(x+y) enc(x)+enc(y)=(x+y)G=enc(x+y)

事实证明,同时允许加法和乘法要困难得多。

3. 某种程度同态加密 示例

本节将介绍“某种程度同态加密”算法示例(即支持有限次数乘法)。Craig Gentry 于 2009 年使用该技术的一个更复杂的版本创建了有史以来第一个全同态加密方案,详情见论文《A FULLY HOMOMORPHIC ENCRYPTION SCHEME》。
最近的研究已转向使用基于向量和矩阵的不同方案,详情见后面章节。

可将这些同态加密方案称为secret-key方案,即:

  • 即,加密和解密,都使用相同的秘钥。

任何secret-key HE方案,都可很容易地转换为public-key方案:

  • “public key”:通常为对0的多次加密集合,以及对1的加密(,以及可能更多对2次幂的加密)。
  • 为加密某value,将其与合适的非零密文子集相加,然后再加上零密文的随机子集,以将该密文“随机化”,使得根据最终的密文,无法判断其所加密的具体value值。

此处的secret key为某大素数 p p p(可将 p p p看成是具有数百甚至数千位的大素数)。该方案仅对 0 0 0 1 1 1加密,因此“加法”对应为XOR,即 1 + 1 = 0 1+1=0 1+1=0
为对某value m m m进行加密,其中 m m m值为 1 1 1 0 0 0

  • 生成一个大的随机值 R R R R R R值通常甚至比 p p p大。
  • 生成一个更小的随机值 r r r r r r值通常远小于 p p p
  • m m m加密的密文为: c t = e n c ( m ) = R ∗ p + r ∗ 2 + m ct=enc(m)=R*p+r*2+m ct=enc(m)=Rp+r2+m
  • 解密密文 c t ct ct,计算: d e c ( c t ) = ( c t m o d    p ) m o d    2 dec(ct)=(ct\mod p)\mod 2 dec(ct)=(ctmodp)mod2

对于:
c t 1 = R 1 ∗ p + r 1 ∗ 2 + m 1 ct_1=R_1*p+r_1*2+m_1 ct1=R1p+r12+m1
c t 2 = R 2 ∗ p + r 2 ∗ 2 + m 2 ct_2=R_2*p+r_2*2+m_2 ct2=R2p+r22+m2

对2个密文 c t 1 , c t 2 ct_1,ct_2 ct1,ct2求和,即 c t 1 + c t 2 ct_1 + ct_2 ct1+ct2,有:
c t 1 + c t 2 = R 1 ∗ p + R 2 ∗ p + r 1 ∗ 2 + r 2 ∗ 2 + m 1 + m 2 = ( R 1 + R 2 ) ∗ p + ( r 1 + r 2 ) ∗ 2 + ( m 1 + m 2 ) ct_1+ct_2=R_1*p+R_2*p+r_1*2+r_2*2+m_1+m_2=(R_1+R_2)*p+(r_1+r_2)*2+(m_1+m_2) ct1+ct2=R1p+R2p+r12+r22+m1+m2=(R1+R2)p+(r1+r2)2+(m1+m2)

其形式与“ m 1 + m 2 m_1+m_2 m1+m2”密文完全相同。解密时,对第一项做 m o d    p \mod p modp 0 0 0,对第二项做 m o d    2 \mod 2 mod2 0 0 0,剩下的为 m 1 + m 2 m_1+m_2 m1+m2(注意,若 m 1 = 1 和 m 2 = 1 m_1=1和m_2=1 m1=1m2=1,则 2 2 2会被吸收到第二项中,剩余为 0 0 0)。这样,就有了加法同态。

对2个密文 c t 1 , c t 2 ct_1,ct_2 ct1,ct2相乘,即 c t 1 ∗ c t 2 ct_1* ct_2 ct1ct2,有:
c t 1 ∗ c t 2 = ( R 1 ∗ p + r 1 ∗ 2 + m 1 ) ∗ ( R 2 ∗ p + r 2 ∗ 2 + m 2 ) = ( R 1 ∗ R 2 ∗ p + r 1 ∗ 2 + m 1 + r 2 ∗ 2 + m 2 ) ∗ p + ( r 1 ∗ r 2 ∗ 2 + r 1 ∗ m 2 + r 2 ∗ m 1 ) ∗ 2 + ( m 1 ∗ m 2 ) ct_1*ct_2=(R_1*p+r_1*2+m_1)*(R_2*p+r_2*2+m_2)=(R_1*R_2*p+r_1*2+m_1+r_2*2+m_2)*p+(r_1*r_2*2+r_1*m_2+r_2*m_1)*2+(m_1*m_2) ct1ct2=(R1p+r12+m1)(R2p+r22+m2)=(R1R2p+r12+m1+r22+m2)p+(r1r22+r1m2+r2m1)2+(m1m2)

其形式与“ m 1 ∗ m 2 m_1*m_2 m1m2”密文完全相同。解密时,对第一项做 m o d    p \mod p modp 0 0 0,对第二项做 m o d    2 \mod 2 mod2 0 0 0,剩下的为 m 1 ∗ m 2 m_1*m_2 m1m2。这样,就有了乘法同态。

但此时有2个问题:

  • 1)密文本身的大小会增加(相乘时长度大约会翻倍)
  • 2)较小项中的“noise噪音”(也常称为“error错误”),即 ∗ 2 *2 2项,也会按二次方放大。

在密文中添加噪声是有必要的,因为该方案的安全性基于Approximate GCD problem
在这里插入图片描述

若改用“exact GCD problem”,则将很容易破解该系统:

  • 若有一组形如 p ∗ R 1 + m 1 p*R_1+m_1 pR1+m1 p ∗ R 2 + m 2 p*R_2+m_2 pR2+m2……的表达式,则可使用欧几里得算法来高效计算出最大公约数 p p p
  • 但若密文中有一些“噪声”,则提取 p p p将很快变得不切实际。因此该方案是安全的。

不过,“噪声”引入了固有的限制:

  • 若密文相乘了多次,“噪声”最终会变得足够大,以至于超过 p p p,从而使得 m o d    p \mod p modp m o d    2 \mod 2 mod2 步骤之间会“相互干扰”,导致数据无法提取。

这是所有同态加密方案的固有权衡:

  • 从“有噪声”的近似方程中提取信息比从精确方程中提取信息要困难得多,但在密文数据上进行计算时所添加的任何噪声都会迅速增加,限制了在噪声变得无法承受之前所能进行的计算量。
  • 这就是为什么这些方案只是“某种程度”同态的原因。

4. Bootstrapping引导

这是所有同态加密方案的固有权衡:

  • 从“有噪声”的近似方程中提取信息比从精确方程中提取信息要困难得多,但在密文数据上进行计算时所添加的任何噪声都会迅速增加,限制了在噪声变得无法承受之前所能进行的计算量。
  • 这就是为什么这些方案只是“某种程度”同态的原因。

该问题有2大类解决方案:

  • 1)在许多同态加密方案中,有一些巧妙的技巧,可使乘法仅将噪声增加一个常数因子(如1000倍),而不是平方。将噪声增加1000倍听起来仍然很多,但,若 p p p(或其它方案中的类似值)为300-bit数字,则,意味着可做100次乘法,这足以做非常广泛的计算。
  • 2)Craig Gentry的“Bootstrapping引导”技术。

如,若有基于密钥 p p p加密 m m m的密文 c t ct ct,其中有很多“噪声”。相应的解决方案为:

  • 将该密文“刷新”为, m m m在另一密钥 p 2 p_2 p2下的新密文。 该“刷新”过程,“清除”了旧噪声,尽管会引入一定量的新噪声。
  • 该技巧非常巧妙。
  • p p p p 2 p_2 p2的持有者提供了一个“bootstrapping引导密钥”。该“引导密钥”包含:基于密钥 p 2 p_2 p2 p p p的各个bits加密的密文,以及,对应 p 2 p_2 p2的public key。
  • 任何人在对基于 p p p加密的密文 c t ct ct数据进行计算时,将获得该密文 c t ct ct的各个bits,并,将这些bits基于 p 2 p_2 p2加密。----》这将为使用这些密文,基于 p p p解密时,提供同态计算,所获得的单个bit,为基于 p 2 p_2 p2加密的 m m m
    在这里插入图片描述

其中:

  • 解密过程 d e c ( c t , p ) dec(ct,p) dec(ct,p)本身就是一个计算,因此其本身表现为电路,以 c t ct ct的各个bits和 p p p的各个bits为输入,并输出解密后的bit m ∈ 0 , 1 m\in 0,1 m0,1
  • 若有人有基于 p p p加密的密文 c t ct ct p 2 p_2 p2的公钥,以及基于 p 2 p_2 p2加密的 p p p的各个bits,则可“同态”计算出 d e c ( c t , p ) = m dec(ct,p)=m dec(ct,p)=m,然后获得基于 p 2 p_2 p2加密的 m m m的密文。
  • 注意,解密过程本身会清除旧的噪声,只输出 0 0 0 1 1 1
  • 解密过程本身是一个电路,其包含加法或乘法,因此会引入新的噪声。但该新噪声与原始密文中的噪声量无关。

注意:

若要多次引导,可使用不同的新密钥 p 3 , p 4 , ⋯ p_3,p_4,\cdots p3,p4,。可避免使用不同的新密钥 p 2 p_2 p2,只需设置 p 2 = p p_2=p p2=p。但,这样会引入新的假设——“circular security循环安全性”。若多次引导使用相同的密钥,那么正式证明其安全性将更加困难——详情见RD Rothblum 2012年论文《On the Circular Security of Bit-Encryption》。尽管很多密码学家认为这样没问题,循环安全性在实践中不会带来重大风险。

但,无论是否使用循环安全性,上述方案存在的问题在于:

  • 噪声爆发得如此之快,以至于方案本身的解密电路也难以承受。
  • 即,新的基于 p 2 p_2 p2加密的 m m m的密文已存在太多噪声,而无法读取。
  • 这是因为:每个加法门都会使噪声的bit-length加倍,因此,使用 d d d-bit modulus p p p只能(顺序串联)处理少于 log ⁡ ( d ) \log(d) log(d)次乘法,但解密需要 在由这些二进制逻辑门组成的电路中 计算 m o d    p \mod p modp,需要超过 log ⁡ ( d ) \log (d) log(d)次乘法。

不过,Craig Gentry想出了一些巧妙的技术来解决该问题,但这些技术太复杂难以解释。本文将直接调到2011年和2013年的新成果,以不同的方式解决了该问题。

  • 基于 Learning with Errors(LWE)的全同态加密算法
  • 基于 Matrix 的全同态加密算法

5. FHE bootstrapping: Learning with Errors(LWE)之向量版

Zvika Brakerski 和 Vinod Vaikuntanathan 在 2011 年提出的另一种同态加密,并展示了其引导技术,详情见其论文《Efficient Fully Homomorphic Encryption from (Standard) LWE》。

在此,将不再使用整数作为密钥和密文,而使用向量作为密钥和密文。
使用某密钥 k = k 1 , k 2 , ⋯   , k n k=k_1,k_2,\cdots,k_n k=k1,k2,,kn,来加密某消息 m m m

  • 构建某向量 c = c 1 , c 2 , ⋯   , c n c=c_1,c_2,\cdots,c_n c=c1,c2,,cn,使得inner-product(或dot product < c , k > = c 1 k 1 + c 2 k 2 + ⋯ + c n k n <c,k>=c_1k_1+c_2k_2+\cdots+c_nk_n <c,k>=c1k1+c2k2++cnkn 对某固定值 p p p取模,等于 m + 2 e m+2e m+2e。其中:
    • m m m为所加密的消息,其值必须为 0 0 0 1 1 1
    • e e e为噪声项,其值远小于 p p p
  • 可像之前一样,通过制作一组 0 的密文来构造只允许加密但不允许解密的“公钥”;加密方可随机组合这些方程的子集,若其加密的消息为 1 1 1,则再加1。
  • 已知密钥 k k k,要解密密文 c c c,只需要计算 < c , k > m o d    p <c,k>\mod p <c,k>modp,并看其结果是奇数还是偶数(与之前的“ m o d    p m o d    2 \mod p \mod 2 modpmod2”技巧类似)。
    • 注意,此处的 m o d    p \mod p modp是“对称”模式的,其返回的值在 − p 2 -\frac{p}{2} 2p p 2 \frac{p}{2} 2p之间。如 137 m o d    10 = − 3 , 212 m o d    10 = 2 137\mod 10=-3, 212\mod 10=2 137mod10=3,212mod10=2
    • 从而使得噪声为正数或负数。
    • 此外,此时, p p p值不再要求为素数,但要求其是奇数。

此时的秘钥和密文均为向量,以5个元素的向量为例:

密钥314159265
密文27182818

并取模 p = 103 p=103 p=103为例。对应的:

  • dot product为 3 ∗ 2 + 14 ∗ 71 + 15 ∗ 82 + 92 ∗ 81 + 65 ∗ 8 = 10202 3 * 2 + 14 * 71 + 15 * 82 + 92 * 81 + 65 * 8 = 10202 32+1471+1582+9281+658=10202,且 10202 = 99 ∗ 103 + 5 10202=99*103+5 10202=99103+5,而 5 = 2 ∗ 2 + 1 5=2*2+1 5=22+1。因此对应的message为 1 1 1

注意,在实践中,密钥的第一个元素通常设置为 1 1 1;这使得为特定值生成密文变得更容易。

该方案的安全性基于“Learning with Errors”(LWE)假设——或者用更专业但也更容易理解的术语来说,即"求解带errors方程组的难度"。
在这里插入图片描述
可将密文自身看成是某方程式:

  • k 1 c 1 + ⋯ + k n c n ≈ 0 k_1c_1+\cdots+k_nc_n\approx 0 k1c1++kncn0

其中:

  • 密钥 k 1 , ⋯   , k n k_1,\cdots,k_n k1,,kn是未知的
  • 密文 c 1 , ⋯   , c n c_1,\cdots,c_n c1,,cn为其系数
  • 该等式是近似的,因为消息 m m m 0 0 0 1 1 1,噪声(error) 2 e 2e 2e 其中 e e e为相对小的值。

LWE假设,可确保:

  • 即使有多个密文,也无法恢复出密钥 k k k

注意:

在某些LWE描述中, < c , k > <c,k> <c,k>可等于任意值,但该值必须作为密文的一部分提供。其从数学上等价为 < c , k > = m + 2 e <c,k>=m+2e <c,k>=m+2e公式,因为,只需将该答案加在密文的末端,且在密钥的末端加上 − 1 -1 1,将这2个向量相乘即可得到 m + 2 e m+2e m+2e。因此,本文后面将都以 < c , k > ≈ 0 <c,k>\approx 0 <c,k>≈0公式来简化表示,其本质与 < c , k > = m + 2 e <c,k>=m+2e <c,k>=m+2e公式是等价的。

5.1 密文乘法

基于密文的加法很容易验证:

  • < c t 1 , k > = 2 e 1 + m 1 , < c t 2 , k > = 2 e 2 + m 2 <ct_1,k>=2e_1+m_1,<ct_2,k>=2e_2+m_2 <ct1,k>=2e1+m1,<ct2,k>=2e2+m2,则有 < c t 1 + c t 2 , k > = 2 ( e 1 + e 2 ) + ( m 1 + m 2 ) <ct_1+ct_2,k>=2(e_1+e_2)+(m_1+m_2) <ct1+ct2,k>=2(e1+e2)+(m1+m2)。此处加法已对 p p p取模了。

难的是基于密文的乘法:

  • 与数字乘法不同,没有自然的方式来将两个长度为 n n n的向量相乘,获得另一长度为 n n n的向量。

最好的方式是outer product

  • a ⊗ b = a 1 b 1 + a 2 b 1 + ⋯ + a n b 1 + a 1 b 2 + ⋯ + a n b 2 + ⋯ + a n b n a\otimes b=a_1b_1+a_2b_1+\cdots+a_nb_1+a_1b_2+\cdots+a_nb_2+\cdots+a_nb_n ab=a1b1+a2b1++anb1+a1b2++anb2++anbn
  • 从而基于密文的乘法可表示为: < a ⊗ b , c ⊗ d > = < a , c > ∗ < b , d > <a\otimes b, c\otimes d>=<a,c>*<b,d> <ab,cd>=<a,c><b,d>

已知2个密文 c 1 , c 2 c_1,c_2 c1,c2,计算其outer product c 1 ⊗ c 2 c_1\otimes c_2 c1c2

  • c 1 , c 2 c_1,c_2 c1,c2均基于 k k k加密,则 < c 1 , k > = 2 e 1 + m 1 <c_1,k>=2e_1+m_1 <c1,k>=2e1+m1 < c 2 , k > = 2 e 2 + m 2 <c_2,k>=2e_2+m_2 <c2,k>=2e2+m2
  • outer product c 1 ⊗ c 2 c_1\otimes c_2 c1c2,可看成是基于 k ⊗ k k\otimes k kk下对 m 1 ∗ m 2 m_1*m_2 m1m2加密的密文。
  • 使用 k ⊗ k k\otimes k kk c 1 ⊗ c 2 c_1\otimes c_2 c1c2解密,有:
    < c 1 ⊗ c 2 , k ⊗ k > = < c 1 , k > ∗ < c 2 , k > = ( 2 e 1 + m 1 ) ∗ ( 2 e 2 + m 2 ) = 2 ( e 1 m 2 + e 2 m 1 + 2 e 1 e 2 ) + m 1 m 2 <c_1\otimes c_2,k\otimes k>=<c_1,k>*<c_2,k>=(2e_1+m_1)*(2e_2+m_2)=2(e_1m_2+e_2m_1+2e_1e_2)+m_1m_2 <c1c2,kk>=<c1,k><c2,k>=(2e1+m1)(2e2+m2)=2(e1m2+e2m1+2e1e2)+m1m2

由此可知,采用outer-product方法是可行的,但存在如下问题:

  • 密文的长度,以及,密钥的长度,均按二次方扩大。接下来可:
    • 使用relinearization,来让密钥长度不再二次方扩大。代价是增加了公钥长度——需将,基于 k k k k ⊗ k k\otimes k kk的密文,提供给任何做密文计算的人。
    • 使用modulus switching,来让噪声不再二次方扩大。

5.2 重新线性化 Relinearization

为解决上面outer-product方法所引起的,密文的长度和密钥的长度均按二次方扩大,的问题,引入了relinearization流程。

private key私钥 k k k的持有者,在其公钥中,额外提供一个“relinearization key”——可将其看成是基于 k k k k ⊗ k k\otimes k kk的“noisy encryptions“。

  • 将基于 k k k k ⊗ k k\otimes k kk的密文,提供给任何做该计算的人,使其可计算方程式 < c 1 ⊗ c 2 , k ⊗ k > <c_1\otimes c_2,k\otimes k> <c1c2,kk>来解密该密文,但相应的输出为基于 k k k的密文。

正常来说,该加密方案仅支持对 m ∈ { 0 , 1 } m\in\{0,1\} m{0,1}进行加密,且” m m m的密文“为向量 c c c,使得 < c , k > = m + 2 e <c,k>=m+2e <c,k>=m+2e,其中 e e e为某小噪声。
而所谓“noisy encryptions“:

  • 为对任意的 m ∈ { 0 , 1 , 2 , ⋯   , p − 1 } m\in\{0,1,2,\cdots,p-1\} m{0,1,2,,p1}进行加密。
  • 注意,该噪声使得无法根据 c c c来完全恢复 m m m,其结果总是会偏离 2 2 2的倍数。
  • 但对于特定应用场景,其是没问题的。

relinearization key中包含一组向量,当与key k k k做inner-product时,其value形如 k i ∗ k j ∗ 2 d + 2 e ( m o d    p ) k_i*k_j*2^d+2e(\mod p) kikj2d+2e(modp),会对每个可能的 ( i , j , d ) (i,j,d) (i,j,d)取值组成其中一个向量,其中, i , j i,j i,j为key的索引号, d d d为某指数,满足 2 d < p 2^d<p 2d<p

注意:

  • 若key长度为 n n n,则在relinearization key中,将有 n 2 ∗ log ⁡ ( p ) n^2*\log(p) n2log(p)个values。

p = 15 p=15 p=15 k k k长度为 n = 2 n=2 n=2为例,则有 d = 3 d=3 d=3,对应的relinearization key为:
在这里插入图片描述
其中:

  • e n c ( x ) enc(x) enc(x)表示,若与 k k k inner-product,则输出 x + 2 e x+2e x+2e

本节的前情为:

  • 有密文 c 1 ⊗ c 2 c_1\otimes c_2 c1c2,使用 k ⊗ k k\otimes k kk c 1 ⊗ c 2 c_1\otimes c_2 c1c2解密,获得 m 1 ∗ m 2 m_1*m_2 m1m2

本节的目的为:

  • 有密文 c 1 ⊗ c 2 c_1\otimes c_2 c1c2,使用 k k k c 1 ⊗ c 2 c_1\otimes c_2 c1c2解密,获得 m 1 ∗ m 2 m_1*m_2 m1m2

借助relinearization key,即可实现该目的。

注意,该解密方程式 < c t 1 ⊗ c t 2 , k ⊗ k > <ct_1\otimes ct_2,k\otimes k> <ct1ct2,kk>中,有大量形如 ( c t 1 i ∗ c t 2 j ) ∗ k p ∗ k q (ct_{1_i}*ct_{2_j})*k_p*k_q (ct1ict2j)kpkq的项。

而在relinearization key中,有大量形如 2 d ∗ k p ∗ k q 2^d*k_p*k_q 2dkpkq的项——为基于 k k k对所有可能的 p , q p,q p,q组合的”noisy encryption“。在relinearization key中有所有这些2的幂乘,使得对每组 ( p , q ) (p,q) (p,q),可做最多 ≤ log ⁡ ( p ) \leq \log(p) log(p)次2的幂乘的加法运算——如 13 = 8 + 4 + 1 13=8+4+1 13=8+4+1,即可生成任意的 ( c t 1 i ∗ c t 2 j ) ∗ k p ∗ k q (ct_{1_i}*ct_{2_j})*k_p*k_q (ct1ict2j)kpkq

如, c t 1 = [ 1 , 2 ] , c t 2 = [ 3 , 4 ] ct_1=[1,2],ct_2=[3,4] ct1=[1,2],ct2=[3,4],则 c t 1 ⊗ c t 2 = [ 3 , 4 , 6 , 8 ] ct_1\otimes ct_2=[3,4,6,8] ct1ct2=[3,4,6,8],且 e n c ( < c t 1 ⊗ c t 2 , k ⊗ k > ) = e n c ( 3 k 1 k 1 + 4 k 1 k 2 + 6 k 2 k 1 + 8 k 2 k 2 ) enc(<ct_1\otimes ct_2,k\otimes k>)=enc(3k_1k_1+4k_1k_2+6k_2k_1+8k_2k_2) enc(<ct1ct2,kk>)=enc(3k1k1+4k1k2+6k2k1+8k2k2)可按如下方式计算:
e n c ( k 1 ∗ k 1 ) + e n c ( k 1 ∗ k 1 ∗ 2 ) + e n c ( k 1 ∗ k 2 ∗ 4 ) + e n c ( k 2 ∗ k 1 ∗ 2 ) + e n c ( k 2 ∗ k 1 ∗ 4 ) + e n c ( k 2 ∗ k 2 ∗ 8 ) enc(k_1*k_1)+enc(k_1*k_1*2)+enc(k_1*k_2*4)+enc(k_2*k_1*2)+enc(k_2*k_1*4)+enc(k_2*k_2*8) enc(k1k1)+enc(k1k12)+enc(k1k24)+enc(k2k12)+enc(k2k14)+enc(k2k28)

注意,relinearization key中的每个"noisy encryption"均有一些偶数噪声 2 e 2e 2e,且 < c t 1 ⊗ c t 2 , k ⊗ k > <ct_1\otimes ct_2,k\otimes k> <ct1ct2,kk>自身也有一些噪声:

  • < c t 1 , k > = 2 e 1 + m 1 , < c t 2 , k > = 2 e 2 + m 2 <ct_1,k>=2e_1+m_1, <ct_2,k>=2e_2+m_2 <ct1,k>=2e1+m1,<ct2,k>=2e2+m2,则 < c 1 ⊗ c 2 , k ⊗ k > = < c 1 , k > ∗ < c 2 , k > = ( 2 e 1 + m 1 ) ∗ ( 2 e 2 + m 2 ) = 2 ( e 1 m 2 + e 2 m 1 + 2 e 1 e 2 ) + m 1 m 2 <c_1\otimes c_2,k\otimes k>=<c_1,k>*<c_2,k>=(2e_1+m_1)*(2e_2+m_2)=2(e_1m_2+e_2m_1+2e_1e_2)+m_1m_2 <c1c2,kk>=<c1,k><c2,k>=(2e1+m1)(2e2+m2)=2(e1m2+e2m1+2e1e2)+m1m2。其总噪声仍相对较小,为: e 1 m 2 + e 2 m 1 + 2 e 1 e 2 e_1m_2+e_2m_1+2e_1e_2 e1m2+e2m1+2e1e2,再加上,relinearization key中的 n 2 ∗ log ⁡ ( p ) n^2*\log(p) n2log(p) fixed-size噪声。且该总噪声为偶数,当与 k k k做inner-product时,最终计算的结果,仍为 m 1 ∗ m 2 + 2 e ′ m_1*m_2+2e' m1m2+2e,其中 e ′ e' e为”combined error“总噪声。

此处使用了同态加密中一个常用技巧:

  • 已知在密钥 k k k自身(或不同的秘钥,若担心circular security的话)下加密的 k k k片段,则可基于解密方程式是来计算该数据,但该输出仍是(新)密文的。
  • 类似技术已用于上面的bootstrapping。而在此处的relinearization中,也使用了该技术。
  • 新密文具有更多的噪声:
    • 源自relinearization key中的 n 2 ∗ log ⁡ ( p ) n^2*\log(p) n2log(p) 个不同噪声,加上,原始outer-product密文中的 2 ( e 1 m 2 + e 2 m 1 + 2 e 1 e 2 ) 2(e_1m_2+e_2m_1+2e_1e_2) 2(e1m2+e2m1+2e1e2)噪声。
    • 新密文,相比于原始密文,仍有二次方大的噪声,仍未解决噪声扩大太快的问题。——需要使用modulus switching技术。

5.3 modulus switching

密文为向量 c t ct ct,使得 < c t , k > = m + 2 e <ct,k>=m+2e <ct,k>=m+2e,其中 m ∈ { 0 , 1 } m\in\{0,1\} m{0,1}。但同时,可从另一个角度来看待该密文:

  • 由于有 c t 2 m o d    p \frac{ct}{2}\mod p 2ctmodp,则 < c t 2 , k > = m 2 + e <\frac{ct}{2},k>=\frac{m}{2}+e <2ct,k>=2m+e,其中 m 2 ∈ { 0 , p + 1 2 } \frac{m}{2}\in\{0,\frac{p+1}{2}\} 2m{0,2p+1}。注意,此处因为 ( p + 1 2 ) ∗ 2 m o d    p = p + 1 = 1 (\frac{p+1}{2})*2\mod p=p+1=1 (2p+1)2modp=p+1=1,除以 2 ( m o d    p ) 2(\mod p) 2(modp),会将 1 1 1映射为 p + 1 2 \frac{p+1}{2} 2p+1。【 p p p为奇数, p + 1 2 \frac{p+1}{2} 2p+1即为 p 2 \frac{p}{2} 2p的向上取整值】

在这里插入图片描述
上图中,分别展示了modular division 和 正常的”rounded down向下取整“ integer division。
其中”division by 2 ( m o d    p ) 2 (\mod p) 2(modp)“,会:

  • 将偶数转换为small numbers
  • 1 1 1转换为 p 2 (向上取整) \frac{p}{2}(向上取整) 2p(向上取整)

因此解密计算 < c t 2 , k > = m 2 + e <\frac{ct}{2},k>=\frac{m}{2}+e <2ct,k>=2m+e时,只需查看该结果是更接近于 0 0 0,还是,更接近于 1 1 1

对于特定类型的噪声——如噪声小但无法保证其是2的倍数的情况下,该”角度“会更强健。

因此,modulus switching,对密文的处理流程为:

  • 1)Step 1:开始: < c t , k > = { 0 或 1 } + 2 e ( m o d    p ) <ct,k>=\{0或1\}+2e(\mod p) <ct,k>={01}+2e(modp)
  • 2)Step 2:对 c t ct ct 除以 2 ( m o d    p ) 2(\mod p) 2(modp) < c t ′ , k > = { 0 或 p 2 } + e ( m o d    p ) <ct',k>=\{0或\frac{p}{2}\}+e(\mod p) <ct,k>={02p}+e(modp)
  • 3)Step 3:使用”regular rounded-down integer division“,对 c t ′ ct' ct乘以 q p \frac{q}{p} pq < c t ′ ′ , k > = { 0 或 q 2 } + e ′ + e 2 ( m o d    q ) <ct'',k>=\{0或\frac{q}{2}\}+e'+e_2(\mod q) <ct′′,k>={02q}+e+e2(modq)
  • 4)Step 4:对 c t ′ ′ ct'' ct′′乘以 2 ( m o d    q ) 2(\mod q) 2(modq) < c t ′ ′ ′ , k > = { 0 或 1 } + 2 e ′ + 2 e 2 ( m o d    q ) <ct''',k>=\{0或1\}+2e'+2e_2(\mod q) <ct′′′,k>={01}+2e+2e2(modq)

其中:

  • 第3)步最关键:其将 m o d    p \mod p modp下的密文,转换为了 m o d    q \mod q modq下的密文。该过程包含对 c t ′ ct' ct中的每个元素乘以 q p \frac{q}{p} pq并rounding down,如 f l o o r ( 56 ∗ 15 103 ) = f l o o r ( 8.15533.. ) = 8 floor(56*\frac{15}{103})=floor(8.15533..)=8 floor(5610315)=floor(8.15533..)=8

其核心思想为:【注意,其中 m m m的值为 0 或 1 0或1 01。】

  • < c t ′ , k > = m ∗ p 2 + e ( m o d    p ) <ct',k>=m*\frac{p}{2}+e(\mod p) <ct,k>=m2p+e(modp),则可将其解析为: < c t ′ , k > = p ( z + m 2 ) + e <ct',k>=p(z+\frac{m}{2})+e <ct,k>=p(z+2m)+e,其中 z z z为某整数。
  • 从而有 < c t ′ ′ , k > = < c t ′ ∗ q p , k > = q ( z + m 2 ) + e ∗ q p <ct'',k>=<ct'*\frac{q}{p},k>=q(z+\frac{m}{2})+e*\frac{q}{p} <ct′′,k>=<ctpq,k>=q(z+2m)+epq
  • rounding down向下取整会增加噪声,但仅增加一点点(具体取决于 k k k中各值的size,可在不牺牲安全性的情况下,让 k k k中的值为small)。
  • 从而有 < c t ′ ′ , k > = < c t ′ ∗ q p , k > = m ∗ q 2 + e ′ + e 2 ( m o d    q ) <ct'',k>=<ct'*\frac{q}{p},k>=m*\frac{q}{2}+e'+e_2(\mod q) <ct′′,k>=<ctpq,k>=m2q+e+e2(modq),其中:
    • e ′ = e ∗ q p e'=e*\frac{q}{p} e=epq
    • e 2 e_2 e2为取整引入的小噪声。

至此:

  • 已将噪声为 2 e 2e 2e m o d    p \mod p modp的密文,转换为,具有新噪声 2 ( f l o o r ( e ∗ q p ) + e 2 ) 2(floor(e*\frac{q}{p})+e_2) 2(floor(epq)+e2) m o d    q \mod q modq的密文,其中新噪声要小于原始噪声。即 2 ( f l o o r ( e ∗ q p ) + e 2 ) 2(floor(e*\frac{q}{p})+e_2) 2(floor(epq)+e2)要小于 2 e 2e 2e。【因为 p > q p>q p>q

举例:

  • c t = [ 5612 ] ct=[5612] ct=[5612],仅为一个值
  • k = [ 9 ] k=[9] k=[9]
  • p = 9999 p=9999 p=9999 q = 113 q=113 q=113

有:

  • 1)Step 1: < c t , k > = 5612 ∗ 9 = 50508 = 9999 ∗ 5 + 2 ∗ 256 + 1 <ct,k>=5612*9=50508=9999*5+2*256+1 <ct,k>=56129=50508=99995+2256+1,因此 c t ct ct表示bit 1 1 1,但相应的噪声有点大: e = 256 e=256 e=256。即 m = 1 m=1 m=1。【此处针对的是 m o d    p \mod p modp
  • 2)Step 2: c t ′ = c t 2 ( m o d    p ) = 2806 ct'=\frac{ct}{2}(\mod p)=2806 ct=2ct(modp)=2806。(注意此处为modular division,若 c t = 5613 ct=5613 ct=5613,则有 c t 2 ( m o d    p ) = 7806 \frac{ct}{2}(\mod p)=7806 2ct(modp)=7806)。检查: < c t ′ , k > = 2806 ∗ 9 = 25254 = 9999 ∗ 2.5 + 256.5 <ct',k>=2806*9=25254=9999*2.5+256.5 <ct,k>=28069=25254=99992.5+256.5。即 z = 2 z=2 z=2,从而有 z + m 2 = 2.5 z+\frac{m}{2}=2.5 z+2m=2.5。【此处针对的是 m o d    p \mod p modp
  • 3)Step 3: c t ′ ′ = f l o o r ( c t ′ ∗ q p ) = f l o o r ( 2806 ∗ 113 9999 ) = f l o o r ( 31.7109... ) = 31 ct''=floor(ct'*\frac{q}{p})=floor(2806*\frac{113}{9999})=floor(31.7109...)=31 ct′′=floor(ctpq)=floor(28069999113)=floor(31.7109...)=31。检查: < c t ′ ′ , k > = 279 = 113 ∗ 2.5 − 3.5 <ct'',k>=279=113*2.5-3.5 <ct′′,k>=279=1132.53.5。【此处针对的是 m o d    q \mod q modq
  • 4)Step 4: c t ′ ′ ′ = c t ′ ′ ∗ 2 m o d    q = 31 ∗ 2 m o d    q = 62 ct'''=ct''*2\mod q=31*2\mod q =62 ct′′′=ct′′2modq=312modq=62。检查: < c t ′ ′ ′ , k > = 558 = 113 ∗ 5 − 2 ∗ 4 + 1 <ct''',k>=558=113*5-2*4+1 <ct′′′,k>=558=113524+1。即对应的仍为 m = 1 m=1 m=1。【此处针对的是 m o d    q \mod q modq

因此,经过以上modulus switching转换, m = 1 m=1 m=1仍得到了保留。以上流程疯狂的点在于:

  • 无人需要知道 k k k值。

聪明的读者至此会发现:

  • 尽管将噪声的绝对值大小由 256 256 256降到了 4 4 4,但该噪声的相对值大小保持不变甚至略有增加: 256 9999 ≈ 2.5 % \frac{256}{9999}\approx 2.5\% 99992562.5%,而 4 113 ≈ 3.5 % \frac{4}{113}\approx 3.5\% 11343.5%

这样的相对噪声,会导致密文被破解,但这样做的好处在于:

  • 当对密文做乘法运算时,对噪声的影响。

假设初始为具有噪声 100 100 100的密文 x x x,其模为 p = 1 0 16 − 1 p=10^{16}-1 p=10161,对 x x x做重复平方运算来计算 ( ( ( x 2 ) 2 ) 2 ) 2 = x 16 (((x^2)^2)^2)^2=x^{16} (((x2)2)2)2=x16
“normal way”为:
在这里插入图片描述
噪声膨胀如此之快,会让该计算被噪声淹没而变得不可信。
而若在每次乘法运算之后做modulus reduction(modulus switching)。假设该modulus reduction是不完美的,每次会将噪声增大 10 10 10倍,因此 1000 1000 1000倍的modulus reduction(即依次取 q = 1 0 13 − 1 , q = 1 0 10 − 1 , q = 1 0 7 − 1 q=10^{13}-1,q=10^{10}-1,q=10^{7}-1 q=10131q=10101q=1071)仅能将噪声由 10000 10000 10000降至 100 100 100(而不是 10 10 10)。
在这里插入图片描述
其核心数学思想在于:

  • 单次乘法中所增加的噪声倍数,取决于该噪声的绝对值,而不是其相对值。
  • 若持续做modulus reductions来让该噪声保持small,则每次乘法运算,仅会让该噪声增加常量倍数。
  • 因此,对于 d d d bit modulus,对应的噪声空间为 ≈ 2 d \approx 2^d 2d,可做 O ( d ) O(d) O(d)次乘法运算。
  • 这对bootstrap来说,足以!

6. FHE bootstrapping: Learning with Errors(LWE) 之 矩阵版

除上面提及的“FHE bootstrapping 之 Learning with Errors(LWE)”技术之外,详情见Craig Gentry、Amit Sahai 和 Brent Waters 2013年论文《Homomorphic Encryption from Learning with Errors: Conceptually-Simpler, Asymptotically-Faster, Attribute-Based》,其密钥 k k k仍为向量,而密文不再是向量 c t ct ct,而是matrix矩阵 C T CT CT,对应表示也由 < c t , k > = 2 e + m <ct,k>=2e+m <ct,k>=2e+m,转换为了 k ∗ C T = k ∗ m + e k*CT=k*m+e kCT=km+e

注意, k k k为某“secret near-eigenvector(近特征向量)”:

  • 若将其与该矩阵相乘,返回的值要么很接近0值,要么很接近 k k k值自身。

k ∗ C T 1 = m 1 ∗ k + e 1 , k ∗ C T 2 = m 2 ∗ k + e 2 k*CT_1=m_1*k+e_1,k*CT_2=m_2*k+e_2 kCT1=m1k+e1kCT2=m2k+e2

  • 对应的加法同态很明显: k ∗ ( C T 1 + C T 2 ) = ( m 1 + m 2 ) ∗ k + ( e 1 + e 2 ) k*(CT_1+CT_2)=(m_1+m_2)*k+(e_1+e_2) k(CT1+CT2)=(m1+m2)k+(e1+e2)
  • 对应的乘法同态也很明显: C T 1 ∗ C T 2 = ( m 1 ∗ k + e 1 ) ∗ C T 2 = m 1 ∗ k ∗ C T 2 + e 1 ∗ C T 2 = m 1 ∗ m 2 ∗ k + m 1 ∗ e 2 + e 1 ∗ C T 2 CT_1*CT_2=(m_1*k+e_1)*CT_2=m_1*k*CT_2+e_1*CT_2=m_1*m_2*k+m_1*e_2+e_1*CT_2 CT1CT2=(m1k+e1)CT2=m1kCT2+e1CT2=m1m2k+m1e2+e1CT2。【为啥是 k k k而是 k 2 k^2 k2?】

其中第一项为“目标项”,后面2项为噪声项。其中噪声项确实会按2次方膨胀(见其中的 e 1 ∗ C T 2 e_1*CT_2 e1CT2项,噪声大小会随每个密文元素大小倍数增加,且密文元素大小也会平方增大)。可有一些小技巧来避免该情况,如:

//vbuterin-research/matrix_fhe/test.py 
Starting basic encryption/decryption tests
Basic tests passed
Starting addition/multiplication tests
ct5 47
ct5 47
ct5 47
ct5 48
ct5 48
ct5 47
ct5 44
ct5 39
ct5 48
ct5 46
Addition/multiplication tests passed
[10, 11, 11, 12, 12, 9, 7, 10, 9]
Simple addition test passed
0 0
0 1
0 2
0 3
1 0
1 1
1 2
1 3
2 0
2 1
2 2
2 3
3 0
3 1
3 2
3 3
Complete addition tests passed
[10, 12, 11, 12, 11, 7, 10, 10, 1, 1, 6, 12, 11, 12, 9, 8, 9, 3]
Multi adding 3 values
[10, 9, 17, 18, 20, 20, 15, 18]
Three-item addition test passed
Multi adding 8 values
Multi adding 6 values
Multi adding 4 values
Multi adding 3 values
[29, 36, 46, 47, 46, 46, 43, 45, 41, 46, 46, 44, 45, 41]
4583 [291, 447, 314, 814, 950, 911, 369, 487]
Somewhat less simple addition test passed

此外,https://github.com/vbuterin/research/blob/master/tensor_fhe/homomorphic_encryption.py#L186中提供了一个简单的有用电路的例子,可用于构建二进制逻辑运算:

  • 将2个相加的数字,以多个bits来表示
  • 但也可为比较( > 、 < 、 = >、<、= ><=)、乘法、除法等其它运算构建电路。
//vbuterin-research/tensor_fhe/tests.py 
Starting basic tests
Key generated
Ciphertext after 0 rounds of squaring: 281474976710654, with 2 error bits
Ciphertext after 1 rounds of squaring: 281474975831649, with 20 error bits
Ciphertext after 2 rounds of squaring: 281474951235645, with 25 error bits
Ciphertext after 3 rounds of squaring: 281474466394926, with 29 error bits
Ciphertext after 4 rounds of squaring: 281460687026493, with 34 error bits
Basic tests passed
Generating more keys
Generating keys for 12 bit precision
Generating keys for 48 bit precision
Generating keys for 112 bit precision
Generated keys
Testing addition circuit for 42 and 69
error bits [7, 25, 37, 42, 48, 48, 48, 48]
Testing addition circuit for 13 37 42
error bits [8, 25, 36, 43, 48, 48, 48, 48]
Testing three-to-two for 23 914 736
Testing addition circuit for [541, 935, 255, 298, 746, 611, 563, 390]
Multi adding 8 values
Multi adding 6 values
Multi adding 4 values
Multi adding 3 values

error bits [10, 28, 40, 54, 59, 63, 66, 68, 72, 71, 72, 71, 72, 70, 71, 71]
Multiadd tests passed
Starting bootstrap test
25 error bits after 1 rounds of squaring
32 error bits after 2 rounds of squaring
39 error bits after 3 rounds of squaring
45 error bits after 4 rounds of squaring
52 error bits after 5 rounds of squaring
59 error bits after 6 rounds of squaring
65 error bits after 7 rounds of squaring
72 error bits after 8 rounds of squaring
79 error bits after 9 rounds of squaring
86 error bits after 10 rounds of squaring
Generating bootstrap key
Bootstrapping
Packed bits
Adding 61 integers
Multi adding 61 values
Multi adding 41 values
Multi adding 28 values
Multi adding 19 values
Multi adding 13 values
Multi adding 9 values
Multi adding 6 values
Multi adding 4 values
Multi adding 3 values
Error bits in bootstrap output: 100
Bootstrap successful

7. 结语

自 2012-13 年创建这些算法以来,已经进行了许多优化,但它们都是在这些基本框架之上工作的。通常,使用多项式代替整数——称为ring LWE
主要挑战仍是效率:

  • 涉及单个bit的运算,需乘以整个矩阵或执行整个重新线性化计算,开销巨大。
  • 有一些技巧可在单次密文运算中执行多次bit运算,这个研究方向的工作仍在持续进行。

预计未来很快:

  • 同态加密在隐私保护计算中的许多应用开始变得实用。
  • 同态加密中使用的lattice-based密码学的更高级应用的研究也在迅速推进。

下一个十年,FHE有望走向实际应用中。

参考资料

[1] Vitalik 2020年7月20日博客Exploring Fully Homomorphic Encryption

FHE系列博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值