BGV同态加密方案是由Zvika Brakerski, Graig Gentry, Vindo Vaikuntanathan提出于[BGV12] 1. 该方案是BV11b方案基础上一个较大的改进. 该方案挖掘出BV11b方案中模数切换可以降低密文的绝对噪声这一特点, 将其发扬广大, 使得在加密在无需Bootstrapping的情况下可以做到较多层数的同态乘法运算.
如果需要实现全同态加密, 该方案仍需要引入Circular Security假设和Boostrapping. 但是由于模数切换使得我们可以在不进行Bootstrapping的情况下做较多次数的同态运算, 并且使得Bootstrapping之前的密文模数变得非常小, 因此Bootstrapping是非常容易的. 因此该方法能够显著降低Bootstrapping的次数和难度.
简介
我们在介绍BV11b方案的时候, 介绍过密文的格式为
-
: 计算并输出
我们将采用另一种形式的LWE加密来表示上述问题(在LWE介绍性文章(写成后地址将被更新到这里)以及本文之后的内容会有介绍), 用
BV11b的核心思想之一是在最后同态计算结束后, 需要将大密文(即维数和模数较大的密文)转换为小密文(即模数和维数较小的密文). 其中, 维数切换的操作是平凡, 而模数切换的操作需要一定的技巧性, 且其安全性依赖于稀疏子集和假设. 一个不太让人感觉到的惊奇的现象是, 在进行模数切换的时, 噪声也成比例减小了. 即我们有如下引理:
引理1 设
和 是两个奇数模数, 是一个整数向量. 令 为一个距离 最近的一个整数向量满足 . 则对于任意的 使得 有 且 其中 是 的第一范数.
第一个结果能够保持我们在输入正确密钥时解密结果的正确性, 而第二个结果则表明我们确实几乎在模数切换的同时几乎时等比例缩小了噪声, 这是由于从噪声分布中选择
证明: 根据假设, 对于某个整数
从上式的证明中, 我们也可以看出额外的噪声是如何引入的, 即从
到了这里你也许就明白这个方案的工作原理了: 虽然噪声是和模数等比例缩小的, 但是如果噪声本身就比较小, 那么通过模数切换, 它将变得非常小, 使得一次乘法同态运算后噪声也不会变得太大. 例如两个模
基于如上的思想, 我们可以从一开始就选择非常大的模数
如果不进行模数切换, 噪声是双指数倍数增长的,
GLWE介绍
在本文中, 作者将LWE与RLWE统一为了GLWE, 使得在介绍方案的时候不用重复劳动. 我们按照作者的思路, 对GLWE一些介绍.
GLWE (General Learning with Errors) 是一种将LWE与RLWE统一的表示方式. 我们知道, LWE的元组都是
定义2 GLWE
设安全参数为
, 令 为一个整数维数, 令 其中 是一个2的指数幂, ling 是一个素数2, 令 和 , 令 是一个 上的分布. GLWE 问题, 定义为区分如下两个分布:
上的均匀分布. - 由如下方式产生的分布: 首选均匀生成
和 , 选择 , 然后输出 .
现在我们介绍GLWE困难的参数假设. 我们认为, 满足参数
Leveled FHE构造
现在, 我们就来构造安全性基于GLWE的Leveled FHE方案. 这个方案采用了模数切换来控制噪声, 使得噪声始终维持在较小的水平, 而使得我们可以进行较多次的乘法同态运算. 不过在此之前, 我们还是像BV11b基于LWE的公钥加密方案一样, 我们先构造好基于GLWE的公钥加密方案.
基于GLWE假设的公钥加密方案
该方案在选择
- 由于换了一种LWE的形式, 密钥的形式和最终解密的形式看起来略有不同.
- 基础密钥
的选择来自于 , 则是为了保证 的第一范数较小, 从而使得我们在模数切换的时候能够有效控制噪声.
对于第一点不同, 熟悉LWE的读者可以立即看出来, 这仅仅是由于我们不再单独写出
基于GLWE假设的公钥加密方案:
-
: 由比特 来确定我们是构造LWE假设下的方案( )还是RLWE假设下的方案( ). 选择一个 比特的模数 和参数 此处要求最终的参数使得GLWE问题实例具有安全性. 令 , 并令参数集合 . -
: 选择 , 输出 . -
: 均匀选择 , 选择 并令 . 并令 . -
: 令 , 选择 , 输出密文 . -
: 输出 .
现在我们来看一下这个加密及解密过程为什么同BV11b中的方案是一样的. 对于加密来说,
其他符号介绍
这里使用的技术喝BV11b中基本是一样的, 只是由于模数切换的原因, 我们需要经常处理不同的模数, 因此几个函数中多了模数这一个参数. 此外, 结果的顺序也由有所不同.
: 即将 拆解成其二进制表示, , 其中 . 输出 .
显然有
: 输出 ).
根据以上的定义, 我们有
密钥切换
现在我们来介绍密钥切换的具体过程. 与其说是介绍, 不如说是熟悉我们的新记号. 回顾一下我们要将密钥
:- 对于每个
, 执行 . - 令
. 输出 .
- 对于每个
其中第二步是一个批量操作, 此处是在将
看到这里你也许会觉得蹊跷, 为什么没有二次项了? 实际上这里作者又换了一种写法, 将
: 输出 .
模数切换
模数切换的方法我们也已经在前文中介绍完毕, 现在将其形式化
: 输出距离 最近且满足 的向量 .
很明显, 这里我们是要将
我们之前已经估计了对于LWE下的密文, 这么做会导致噪声如何变化, 那么对于RLWE, 有类似的结果吗? 有的, 正如如下引理
引理3 设
是多项式环的次数. 令 为满足 的正整数. 令 和 . 则对于任意 满足 , 则有 且
其中
Leveled FHE方案
铺垫到这里, 我们终于可以拿出LWE方案了. 实际上这里相比BV11b并没有多少新内容, 我们做的大部分工作是在带大家适应新的符号和解释模数切换的好处.
首先和其他的Leveled FHE一样, 有个Setup阶段
-
: 设 . 对于每个 :- 执行
, 其中 中的模数逐渐从 降低到 .
对于每个
- 令
,
- 执行
这里的
: 对于每个 , 执行:- 执行
和 - 令
. - 令
. - 令
3. (当 时不执行该步骤)
- 执行
实际上上述算法中, 我们就生成了每一层的公私钥, 并且做好了每一层的
: 计算并输出 . : 根据密钥的层数选择 , 计算并输出 .
此处我们忽略了确定密文层数的参数来化简表示. 接下来我们演示同态计算. 同态计算中, 需要用到密钥切换过程, 该过程包括模数切换过程和维数切换过程, 我们将其统一为一个
:- 计算
- 计算
- 计算并输出
- 计算
最后我们补充完同态借助
: 首先计算 , 再计算输出 . : 首先计算 , 即由 所表示的多项式函数相乘得到的多项式函数对应的密文, 再计算并输出 .
这里要注意的是, 加法的密文后完全可以看做是
其他
在作者阅读完代数数论和RLWE的知识后, 将会带各位阅读Batching部分的操作, 该部分内容可以极大地提升本方案的效率, 也被CKKS方案借鉴. Bootstrapping和安全性证明也将在之后完成.