原文作者之一Zvika Brakerski在2018 CIS冬令营上为学员讲解全同态加密
原文作者之一Vinod Vaikuntanathan在2018 CIS冬令营上为学员讲解全同态加密
CIS 2018回顾
符号说明
本文中, 我们采用方括号+下标的方式来表示向量中的具体某一位. 例如向量的第位用来表示. 我们有时候会用下标0来表示不存在的下标, 例如可以用来表示, 这样做的好处是, 我们不用显式地提及, 而是用就可以表示所有的和来避免描述地冗长.
原文中的安全参数采用的是, 由于这个字母容易和混淆, 且为了与我其他博文统一, 我修改为了.
简介
假设我们采用的LWE的噪声为偶数, 即具有的形式, 则最终我们得到的加密密文具有的形式, 其中是我们加密的密文. 在有了这种形式的密文后, 通过, 再模上2方可解除.
如果我们将解密的过程看作是一个函数, 即对于来说, , 那么当我们输入正确的密钥时, 最终计算出的结果再模上2就是解密的结果. 如果具有维, 我们有
先假设另一个明文采用进行加密, 那么很显然的, 可以用来描述其解密过程. 我们发现, 如果将两个函数加或乘在一起, 传入正确的密文后, 我们将会得到原先密文的加或乘的加密. 当然, 这里的加是指比特异或或者上的加法. 观察
这里传入参数后, 就有
最终模上2后确实可以得到. 类似的加法我们也可以具体验证.
但是这里的乘法也就带来了一个问题, 描述我们多项式的系数个数, 由原先的个变成了个—-多了那些二次项的系数. 如果我们反复的进行乘法, 那么进行次乘法, 描述多项式的系数个数就会变成, 这显然不是我们想要的.
解决这一问题的办法是, 让我们同态加密的加密方, 用一个新的密钥将原先密钥的所有一次项二次项都加密起来, 即生成密文满足
如果我们将以上密文改写成解密多项式并带入到中, 我们将会得到一个全新的多项式函数
这个多项式满足
其最终模2的结果也就是.
如果我们还想多进行一层的乘法运算怎么办? 由于和具有类似的形式, 因此我们也可以将的一次项和二次项用另一个新的密钥进行加密, 再交由同态运算方处理即可—-类似的过程再噪声没有过大的情况下可以一直持续下去.
当然, 这里我们保持了噪声是偶数的性质了吗? 这一点毋庸置疑, 因为说明所有的噪声都是偶数, 无论如何也不可能凑出奇数的噪声来.
潜在的问题
上面的方案由一个潜在的问题. 不是标准的LWE生成的项, 我们也没有理由假设它是一个较小的值, 而实际上它们确实可以很大. 当这些项很大的时候, 极有可能导致.为了避免这一情况的发生, 我们需要让都不要太大. 我们采用的办法就是我们用过的"BitDecomp"大法, 即用二进制来表示, 将其表示为. 到这里看起来也许就不那么美好了, 因此每项参数的意思需要你牢记, 这样你才能继续读下去.
接下来更令人费解的是, 我们要构造一个是密文的形式, 但是又不是对任何东西的加密的一种"密文", 令
这里像是将按照的方式拆开, 但是实际上是我们为每一个单独准备的"密文", 但是他们并不是对的加密, 因为我们的加密方案只会加密1 bit, 在的时候, 整个会在模2的时候被一同模掉. 不过好在是还是成立的.
但是这样做也有一个好处, 就是我们可以利用对的拆分, 用以上的这组"密文"来表示, 我们有
这个时候较小, 的情况就不会出现了, 因此整个等式的也就能得到保持.
Bootstrapping准备工作
回想一下每进行一次乘法的噪声增长.
从项可以看出, 每进行一次乘法运算, 噪声都从变成了, 同GSW方案一样, 我们的噪声是按双对数的方式进行增长的. 即在进行层乘法之后, 噪声至少变成了. 我们的模数的选择只能是的不能达到双指数而只能达到(其中为常数), 要使得噪声不超过, 我们的只能选择在. 但是, LWE解密电路的深度是, 也就是说, 我们的的方案不能支持我们的解密电路! 也就无法实现Bootstrapping来达到FHE!
此时我们的办法是, 用大的模数和维数来进行Bootstrapping, 而用小的模数和维数来进行同态运算. 这样, 我们同态运算过程中解密电路的深度就不会太深, 能够被模数和维数大的Bootstrapping过程所支持. 现在我们来介绍如何从参数转换到. 其中, , 由于, 我们就可以用大参数做约层同态运算, 成功地将小参数下地解密电路包括进来.
我们首先可以发现, 在我们进行一次乘法, 将密钥从切换到时, 我们并不以一定需要与的维数相同, 通过选择维数更小的我们就可以降低维数. 降低模数时, 采用的思想是近似逼近. 假设在模时我们用如下的方式来生成"密文"
其中是按照LWE加密生成的, 则
即可大致还原出. 我们用来代替之前的用于构造新的一次多项式函数, 使得新的多项式模数变得更小了. 值得一提的是, 这里需要引入**稀疏子集和假设**. 也许你看到这里又迷糊了, 这里又还原不出, 那又有意义呢? 单独来看是没有什么意义, 但它的噪声是偶数的, 所有的这样的东西拼凑在一起最终可以帮助我们解密出同态运算的结果.
到此为止, 我们就可以将切换到进行计算时的模数和维数都变小了.
BV11b中的SWHE同态加密方案
这一部分将分为两个小部分介绍, 第一步就是不做模数切换和维数切换的基础同态方案. 第二部分就是采用模数切换和维数切换的技术, 将转换成一个可以加入Bootstrapping的方案, 在的基础上加上Bootstrapping技术就可以得到一个FHE方案.
即使是本节内容大多已经在前面介绍过了, 这里只是将其形式化, 并对整个方案的流程做一定的解读.
密钥生成、加密、解密
第一步和GSW一样, 都要有一个Setup, 之所以需要这个过程是因为我们要选择需要做同态的层数. 注意, 这一步在原文中是没有显式地写出来地, 但是它确实也这一做了.
- : 用表示安全参数, 表示同态运算的层数, 选择参数满足, , 和为奇数且, 其中为常数. 选择上的噪声分布.
这些参数的选择大多是为了保证基于的LWE加密的安全性. 如果不关注实现的细节和安全性规约, 可以忽略大部分的参数选择. 需要记住的选择规则是: 可以是的超指数的, 但不能达到的双指数, 且大约是.
接下来的看起来会有一些复杂, 因为我们把每一层的密钥的一次和二次项用下一层密钥加密后的结果写在了一起, 作为计算密钥(Evaluation Key), 但是他们的本质实际上读者已经见过了
-
: 选择个向量, 对于所有的和计算
同时选择和, 计算.
输出公钥, 计算密钥和私钥.
计算密钥这一长串的东西, 读者在前面已经见过很多次了, 应该比较熟悉了. 唯一多了的参数是是代表当前同态的层.
注意这里最后的代表当前同态(乘法)运算的层数. 同时由于噪声始终是偶数累计的, 因此模2仍然可以消除噪声.
在做完同态运算后, 我们得到的是第层的密文, 即密文的格式是.
这里注意连同就构成了最终解密多项式函数的描述, 就相当于是求解密多项式在点的值.
同态运算
加法的同态比较简单, 将多个同一层的密文相加即可.
解密的正确性留给读者. 可以看出, 加法同态不消耗同态层数, 因此我们的同态层数是指乘法层数.
对于乘法来说, 我们需要用到前面介绍的技术.
- 乘法门: 对于两个同层的乘法密文和, 计算
令, 并带入, 得到
和
最终输出.
注意记号处发扬了我们在符号说明处的关于下标的说明, 实际上其内容包括常数项, 一次项(系数为)和二次项(系数为). 同样这里的同态计算验证留作.
将加法门和乘法门的Eval方式结合起来, 我们就可以得到
- : 采用加法门和乘法门Eval的方式输出最终运算结果.
要使得结果正确, 点电路必须是我们支持的电路, 必须是一个加法乘法交替的电路, 第层的乘法密文的输出只能通向层的乘法. 如果不考虑深度限制, 实际上所有的布尔电路都可以转化为这一的电路, 但是考虑到深度限制, 我们还有工作要做. 到这里, SWHE方案就算介绍完了, 采用该方案可以做到的对数多项式(polylog)层的同态运算.
BV11b中的FHE方案
我们用来表示我们的可以加入Bootstrapping的方案, 该方案需要用到方案的内容, 阅读这一部分, 请确保对前面知识的熟悉. 为了使我们的方案支持Bootstrapping, 我们必须降低解密电路的深度, 我们使用的方法是用维数切换和模数切换, 将密文的模数和维数变得更小.
- : 用表示安全参数, 表示同态运算的层数, 选择参数满足, , 和为奇数且, 其中为常数. 选择上的噪声分布. 选择上的噪声分布.
是和方案是一样的, 实际上我们中参数的设定就是为了方便中的方案描述. 来自[BV11b]作者的建议: 在阅读时可以带入参数以及-bounded的和-bounded的进行理解.
实际上可以看出, 我们仍然需要借用原先方案的密钥. 原因是我们在做同态运算的时候, 接收到的输入是大密文, 而最后输出必须是小密文. 我们要求大密文和小密文的解密结果是一样的, 但是小密文的解密电路却更浅. 因此, 我们首先需要调用原先的, 得到计算结果后, 再将密文变成小密文. 因此我们的加密算法, 应当和相同:
具体的计算过程:
最后密文确实是小密文的格式, 因此我们的解密需要按照小密文的格式进行解密:
这里仍然有一个问题, 就是要验证经过大密钥转换后的小密钥用解密的结果与大密钥用解密出的结果相同, 其基本思想已经在本文中有所体现, 具体的验证过程也可以参考[BV11b]论文.
注释