Back
Featured image of post 同态加密(2) BV11b方案

同态加密(2) BV11b方案

BV11b方案是由Zvika Brakersi与Vinod Vaikuntanathan于2011年提出的同态加密方案, 发表于论文[BV11b]中.

CIS 2018回顾

符号说明

本文中, 我们采用方括号+下标的方式来表示向量中的具体某一位. 例如向量s的第i位用s[i]来表示. 我们有时候会用下标0来表示不存在的下标, 例如hi可以用hi,0来表示, 这样做的好处是, 我们不用显式地提及hi, 而是用hi,j就可以表示所有的hi,j0hi来避免描述地冗长.

原文中的安全参数采用的是κ, 由于这个字母容易和k混淆, 且为了与我其他博文统一, 我修改为了λ.

简介

假设我们采用的LWE的噪声为偶数, 即具有2e的形式, 则最终我们得到的加密密文具有(a,b=a,s+2e+m)Zqn×Zq的形式, 其中m{0,1}是我们加密的密文. 在有了这种形式的密文后, 通过ba,s=2e+m, 再模上2方可解除m.

如果我们将解密的过程看作是一个函数, 即对于a来说, fa,b(x)=ba,xmodq, 那么当我们输入正确的密钥s时, 最终计算出的结果再模上2就是解密的结果. 如果a具有n维, 我们有 fa,b(x)=bi=1na[i]s[i] 先假设另一个明文m{0,1}采用(a,b=a,s+2e+m)进行加密, 那么很显然的, fa,b(x)可以用来描述其解密过程. 我们发现, 如果将两个函数加或乘在一起, 传入正确的密文后, 我们将会得到原先密文的加或乘的加密. 当然, 这里的加是指比特异或或者GF(2)上的加法. 观察 fa,b(x)fa,b(x)=(ba[i]x[i])(ba[i]x[i])=h0+hix[i]+hi,jx[i]x[j] 这里传入参数s后, 就有 fa,b(s)fa,b(s)=(2e+m)(2e+m)=4ee+2em+2em+mm=2(2ee+em+em)+mm 最终模上2后确实可以得到mm. 类似的加法我们也可以具体验证.

但是这里的乘法也就带来了一个问题, 描述我们多项式的系数个数, 由原先的O(n)个变成了O(n2)个—-多了那些二次项的系数. 如果我们反复的进行乘法, 那么进行L次乘法, 描述多项式的系数个数就会变成O(n2L), 这显然不是我们想要的.

解决这一问题的办法是, 让我们同态加密的加密方, 用一个新的密钥t将原先密钥s的所有一次项s[i]二次项s[i]s[j]都加密起来, 即生成密文(ai,j,bi,j)满足 bi,j=ai,j,t+2ei,j+s[i]s[j]ai,j,t+s[i]s[j] 如果我们将以上密文改写成解密多项式并带入到fa,b(x)fa,b(x)中, 我们将会得到一个全新的多项式函数 g(x)=h0+hi(biai,x))+hi,j(bi,jai,j,x) 这个多项式满足 g(t)=h0+hi(biai,t))+hi,j(bi,jai,j,t)=h0+his[i]+hi,js[i]s[j] 其最终模2的结果也就是mm.

如果我们还想多进行一层的乘法运算怎么办? 由于gfa,b具有类似的形式, 因此我们也可以将t的一次项和二次项用另一个新的密钥t进行加密, 再交由同态运算方处理即可—-类似的过程再噪声没有过大的情况下可以一直持续下去.

当然, 这里我们保持了噪声是偶数的性质了吗? 这一点毋庸置疑, 因为说明所有的噪声都是偶数, 无论如何也不可能凑出奇数的噪声来.

潜在的问题

上面的方案由一个潜在的问题. hi,j不是标准的LWE生成的项, 我们也没有理由假设它是一个较小的值, 而实际上它们确实可以很大. 当这些项很大的时候, 极有可能导致hi,j(bi,jai,j,t)hi,js[i]s[j].为了避免这一情况的发生, 我们需要让hi,j都不要太大. 我们采用的办法就是我们用过的"BitDecomp"大法, 即用二进制来表示hi,j, 将其表示为hi,j=i=0logq2τhi,j,τ. 到这里看起来也许就不那么美好了, 因此每项参数的意思需要你牢记, 这样你才能继续读下去.

接下来更令人费解的是, 我们要构造一个是密文的形式, 但是又不是对任何东西的加密的一种"密文", 令 bi,j,τ=ai,j,τ,t+2ei,j,τ+2τs[i]s[j]ai,j,τ,t+2τs[i]s[j] 这里像是将ai,j,bi,j按照hi,j的方式拆开, 但是实际上是我们为每一个2τs[i]s[j]单独准备的"密文", 但是他们并不是对2τs[i]s[j]的加密, 因为我们的加密方案只会加密1 bit, 在τ1的时候, 整个2τs[i]s[j]会在模2的时候被一同模掉. 不过好在是bi,j,τai,j,τ,t2τs[i]s[j]还是成立的.

但是这样做也有一个好处, 就是我们可以利用对hi,j的拆分, 用以上的这组"密文"来表示hi,j, 我们有 hi,js[i]s[j]=τ=0logqhi,j,τ2τs[i]s[j]τ=0logqhi,j,τ(bi,j,τai,j,τ,t) 这个时候hi,j,τ较小, hi,j,τ(bi,j,τai,j,τ,t)hi,j,τs[i]s[j]的情况就不会出现了, 因此整个等式的也就能得到保持.

Bootstrapping准备工作

回想一下每进行一次乘法的噪声增长. fa,b(s)fa,b(s)=(2e+m)(2e+m)=4ee+2em+2em+mm=2(2ee+em+em)+mmee项可以看出, 每进行一次乘法运算, 噪声都从E变成了E2, 同GSW方案一样, 我们的噪声是按双对数的方式进行增长的. 即在进行L层乘法之后, 噪声至少变成了E2L. 我们的模数1q的选择只能是n的不能达到双指数而只能达到2nϵ(其中ϵ为常数), 要使得噪声不超过O(q)=O(2nϵ), 我们的L只能选择在polylog n. 但是, LWE解密电路的深度是max(n,logq), 也就是说, 我们的的方案不能支持我们的解密电路! 也就无法实现Bootstrapping来达到FHE!

此时我们的办法是, 用大的模数和维数来进行Bootstrapping, 而用小的模数和维数来进行同态运算. 这样, 我们同态运算过程中解密电路的深度就不会太深, 能够被模数和维数大的Bootstrapping过程所支持. 现在我们来介绍如何从参数(n,logq)转换到(k,logp)2. 其中, n=kc,p=poly(k), 由于q=2nϵ, 我们就可以用大参数做约D=nϵ=kcϵ层同态运算, 成功地将小参数下地解密电路包括进来.

我们首先可以发现, 在我们进行一次乘法, 将密钥从s切换到t时, 我们并不以一定需要ts的维数相同, 通过选择维数更小的t我们就可以降低维数. 降低模数时, 采用的思想是近似逼近. 假设在模p时我们用如下的方式来生成"密文" b^i,j,τ=a^i,j,τ,t+e+pq2τs[i] 其中(a^i,j,τ,b^i,j,τ)Zpk×Zp是按照LWE加密生成的, 则 2τs[i]s[j]qp(bi,j,τai,j,τ,t) 即可大致还原出2τs[i]s[j]. 我们用qp(b^i,j,τa^i,j,τ,t)来代替之前的bi,j,τai,j,τ,t用于构造新的一次多项式函数, 使得新的多项式模数变得更小了. 值得一提的是, 这里需要引入**稀疏子集和假设**. 也许你看到这里又迷糊了, 这里又还原不出2τs[i]s[j], 那又有意义呢? 单独来看是没有什么意义, 但它的噪声是偶数的, 所有的这样的东西拼凑在一起最终可以帮助我们解密出同态运算的结果.

到此为止, 我们就可以将切换到t进行计算时的模数和维数都变小了.

BV11b中的SWHE同态加密方案

这一部分将分为两个小部分介绍, 第一步就是不做模数切换和维数切换的基础同态方案SH. 第二部分就是采用模数切换和维数切换的技术, 将SH转换成一个可以加入Bootstrapping的方案BTS, 在BTS的基础上加上Bootstrapping技术就可以得到一个FHE方案.

即使是本节内容大多已经在前面介绍过了, 这里只是将其形式化, 并对整个方案的流程做一定的解读.

密钥生成、加密、解密

第一步和GSW一样, 都要有一个Setup, 之所以需要这个过程是因为我们要选择需要做同态的层数. 注意, 这一步在原文中是没有显式地写出来地, 但是它确实也这一做了.

  • SH.Setup(1L,1λ): 用λ表示安全参数, L表示同态运算的层数, 选择参数m,n,q满足n=poly(λ), mnlogq+2λ, Lϵlognq为奇数且q[2nϵ,22nϵ), 其中ϵ(0,1)为常数. 选择Zq上的噪声分布χ.

这些参数的选择大多是为了保证基于的LWE加密的安全性. 如果不关注实现的细节和安全性规约, 可以忽略大部分的参数选择. 需要记住的选择规则是: q可以是n的超指数的, 但不能达到n的双指数, 且m大约是nlogq.

接下来的KeyGen看起来会有一些复杂, 因为我们把每一层的密钥的一次和二次项用下一层密钥加密后的结果写在了一起, 作为计算密钥(Evaluation Key), 但是他们的本质实际上读者已经见过了

  • SH.KeyGen(1λ): 选择L+1个向量s0,,sL$Zqn, 对于所有的[L],0ijnτ{0,,logq}计算

    ψ,i,j,τ:=(a,i,j,τ,b,i,j,τ:=a,i,j,τ,s+2e,i,j,τ+2τs1s1[j])Zqn×Zq

    同时选择AZqm×neχm, 计算b:=As0+2e.

    输出公钥sk=sL, 计算密钥evk=Ψ={ψ,i,j,τ}[L],0ijn,τ{0,,logq}和私钥pk=(A,b).

计算密钥这一长串的东西, 读者在前面已经见过很多次了, 应该比较熟悉了. 唯一多了的参数是是代表当前同态的层.

  • SH.Enc(pk,m): 选择r{0,1}m, 计算v:=ATrw:=bTr+m, 输出密文c:=((v,w),0).

注意这里最后的0代表当前同态(乘法)运算的层数. 同时由于噪声始终是偶数累计的, 因此模2仍然可以消除噪声.

在做完同态运算后, 我们得到的是第L层的密文, 即密文的格式是c=((v,w),L).

  • SH.Dec(sk,c): 输出((wv,sL)modq)mod2

这里注意v连同w就构成了最终解密多项式函数的描述, (wv,sL)modq就相当于是求解密多项式在sL点的值.

同态运算

加法的同态比较简单, 将多个同一层的密文相加即可.

  • 加法门: 对于n个密文{ci=((vi,wi),)}i[n]做加法同态, 计算和输出 c+=((v+,w+),)=((ivi,iwi),).

解密的正确性留给读者. 可以看出, 加法同态不消耗同态层数, 因此我们的同态层数L是指乘法层数.

对于乘法来说, 我们需要用到前面介绍的技术.

  • 乘法门: 对于两个同层的乘法密文c=((v,w),)c=((v,w),), 计算 ϕ(x)=(wv,x)(wv,x)=0ijnhi,jx[i]x[j]hi,j=τ=0logqhi,j,τ2τ, 并带入evk=Ψ, 得到 v×=0ijntau{0,,logq}hi,j,τa+1,i,j,τw×=0ijntau{0,,logq}hi,j,τb+1,i,j,τ 最终输出((v×,w×),+1).

注意记号处发扬了我们在符号说明处的关于下标的说明, 实际上其内容包括常数项h0=ww, 一次项(系数为hi0,j=0)和二次项(系数为hi0,j0). 同样这里的同态计算验证留作.

将加法门和乘法门的Eval方式结合起来, 我们就可以得到

  • SH.Eval(evk,f,c1,,ct): 采用加法门和乘法门Eval的方式输出最终运算结果.

要使得结果正确, f点电路必须是我们支持的电路, 必须是一个加法乘法交替的电路, 第层的乘法密文的输出只能通向+1层的乘法. 如果不考虑深度限制, 实际上所有的布尔电路都可以转化为这一的电路, 但是考虑到深度限制, 我们还有工作要做. 到这里, SWHE方案就算介绍完了, 采用该方案可以做到n的对数多项式(polylog)层的同态运算.

BV11b中的FHE方案

我们用BTS来表示我们的可以加入Bootstrapping的方案, 该方案需要用到SH方案的内容, 阅读这一部分, 请确保对前面知识的熟悉. 为了使我们的方案支持Bootstrapping, 我们必须降低解密电路的深度, 我们使用的方法是用维数切换和模数切换, 将密文的模数和维数变得更小.

  • BTS.Setup(1L,1λ): 用λ表示安全参数, L表示同态运算的层数, 选择参数m,n,q满足n=poly(λ), mnlogq+2λ, Lϵlognq为奇数且q[2nϵ,22nϵ), 其中ϵ(0,1)为常数. 选择Zq上的噪声分布χ. 选择Zp上的噪声分布χ^.

Setup是和SH方案是一样的, 实际上我们SH中参数的设定就是为了方便BTS中的方案描述. 来自[BV11b]作者的建议: 在阅读时可以带入参数k=λ,n=k4,qn,L=1/3logn=4/3logk,p=(n2logn)poly(k),m=O(nlogq)以及n-bounded的χk-bounded的χ^进行理解.

  • BTS.KeyGen(1λ): 调用SH.KeyGen(1λ)得到sL,Ψ,(A,b). 生成短的私钥s^$Zpk并计算对应于这个短私钥的计算密钥, 即对于所有的i[n],τ{0,,logq}, 生成a^i,τ$Zpk,e^$χ^ 并计算

    b^i,τ:=a^i,τ,s^+e^i,τ+pq(2τsL[i])modp

    ψ^i,τ:=(a^i,τ,b^i,τ)Zpk×ZpΨ^={ψ^i,τ}i[n],τ{0,,logq}.

    最终输出公钥pk=(A,b), 私钥sk=s^, 计算密钥evk={Ψ,Ψ^}.

实际上可以看出, 我们仍然需要借用原先方案的密钥. 原因是我们在做同态运算的时候, 接收到的输入是大密文, 而最后输出必须是小密文. 我们要求大密文和小密文的解密结果是一样的, 但是小密文的解密电路却更浅. 因此, 我们首先需要调用原先的SH.Eval, 得到计算结果后, 再将密文变成小密文. 因此我们的加密算法, 应当和SH.Enc相同:

  • BTS.Enc(pk,m): 输出SH.Enc(pk,m).

具体的计算过程:

  • BTS.Eval(evk,f,c1,,ct): 计算cfSH.Eval(Ψ,f,c1,,ct). 记cf=((v,w),L)Zqn×Zq×{L}. 考虑多项式函数

    ϕ(x):=pq(q+1p(wv,x))modp

    按照之前的方式将其系数整理为h0,,hnZq的形式, 即

    ϕ(x)=i=0nhi(pqx[i])

    再将hi按照二进制展开, 得到

    ϕ(x)=i=0nτ=0logqhi,τ(pq2τx[i])

    采用Ψ^中的密钥来替换上式中的pq(2τsL[i])可以得到一个新的一次多项式函数, 记常数项为w^, 一次项系数向量为v^

    v^:=2i=0nτ=0logqhi,τa^i,τmodpZpk w^:=2i=0nτ=0logqhi,τb^i,τmodqZq

    最后输出密文c^=(v^,w^).

最后密文确实是小密文的格式, 因此我们的解密需要按照小密文的格式进行解密:

  • BTS.Dec(sk=s^,c^): 计算并输出 m:=((w^v^,s^)modq)mod2

这里仍然有一个问题, 就是要验证经过大密钥转换后的小密钥用BTS.Dec解密的结果与大密钥用SH.Dec解密出的结果相同, 其基本思想已经在本文中有所体现, 具体的验证过程也可以参考[BV11b]论文.

注释


  1. 我一般将modulus翻译成模数, 以同代数结构中的模(module)区分开来. 注意modulus的复数是moduli. ↩︎

  2. 此处参数的格式是(维数, 模数) ↩︎

Built with Hugo
Theme Stack designed by Jimmy