文章目录

  • 前言
  • 推荐阅读资料
  • BGV方案介绍
    • 密文形式
      • 噪声
    • Modulus Switching
      • 为什么需要MS
      • 如何做MS
  • 关于KeySwitching/Relinearization
  • 小尾巴

前言

之前看了好多资料,发现对于BGV的介绍都比较少,大家都主要关注于CKKS。其实在一些整数域上面的计算BGV还是很有优势的,与CKKS相比,BGV是一个确定性的加密方案,与BFV相比,BGV的乘法在RNS下实现要简单非常多。所以在某些场景下(比如有限域上的MPC与HE结合)会更加偏向于使用BGV方案,而且BGV方案也相对最易懂。

推荐阅读资料

  1. (Leveled) Fully Homomorphic Encryption without Bootstrapping

最初的BGV文章,但是主要关注于LWE上面。

  1. Fully homomorphic encryption with polylog overhead
  2. Homomorphic Evaluation of the AES Circuit

关于BGV的两篇优化,作者都是(Gentry,Halevi,Smart),所以叫做GHS优化。

  1. Fully homomorphic SIMD operations

这篇文章是关于SIMD的,SIMD技术可以说是RLWE对于LWE的一个碾压性的优势之一了。作者是Smart和Vercauteren。

  1. Algorithms in HElib
  2. Bootstrapping for HElib
  3. Design and implementation of HElib : a homomorphic encryption library

上面三篇文章都是Halevi和Shoup写的,关于Helib中如何实现BGV方案并优化,以及如何对于BGV做Bootstrapping。

BGV方案介绍

密文形式

首先BGV最基本的加密形式是:

在这里我们只看对称加密,因为公钥加密与对称加密的密文形式是一致的。


对于LWE类型的密文来说,
首先有一些公开参数:明文模数ttt,密文模数qqq,向量维度nnn
取私钥为s∈Zqn\mathbf{s} \in \Z_q^ns∈Zqn​,对于明文m∈Ztm\in \Z_tm∈Zt​
选取a∈Zqn\mathbf{a}\in \Z_q^na∈Zqn​,b=⟨a,s⟩+m+temodqb=\langle \mathbf{a},\mathbf{s}\rangle + m +te \bmod qb=⟨a,s⟩+m+temodq。eee是从高斯分布中选取的整数。
令密文c=(b,a)c=(b,\mathbf{a})c=(b,a)。
则解密为
先计算μ=b−⟨a,s⟩=m+temodq\mu = b- \langle \mathbf{a},\mathbf{s} \rangle = m+te \bmod qμ=b−⟨a,s⟩=m+temodq。然后计算m=[μ]t=mm=[\mu]_t=mm=[μ]t​=m。

这里的⟨⋅⟩\langle \cdot \rangle⟨⋅⟩为内积操作,对于a=(a0,...,an−1),s=(s0,...,sn−1)\mathbf{a}=(a_0,...,a_{n-1}),\mathbf{s}=(s_0,...,s_{n-1})a=(a0​,...,an−1​),s=(s0​,...,sn−1​)来说,⟨a,s⟩=a0s0+a1s1+⋯+an−1sn−1∈Z\langle \mathbf{a},\mathbf{s}\rangle=a_0s_0+a_1s_1+\cdots+a_{n-1}s_{n-1}\in\Z⟨a,s⟩=a0​s0​+a1​s1​+⋯+an−1​sn−1​∈Z。
[μ]t[\mu]_t[μ]t​其实等价于μmodt\mu \bmod tμmodt。


对于RLWE类型的密文来说,
公开参数为:明文模数ttt,多项式空间R=Z[X]/Xn+1\mathcal{R}=\Z[X]/X^n+1R=Z[X]/Xn+1,以及系数模qqq的多项式空间Rq=Zq[X]/Xn+1\mathcal{R}_q=\Z_q[X]/X^n+1Rq​=Zq​[X]/Xn+1。
取私钥为s∈Rqs\in \mathcal{R}_qs∈Rq​,对于明文m∈Rtm\in R_tm∈Rt​:
选取a∈Rq,b=as+m+te∈Rqa\in \mathcal{R}_q,b=as+m+te \in \mathcal{R}_qa∈Rq​,b=as+m+te∈Rq​,eee是一个系数满足高斯分布的多项式。
令密文为c=(b,a)c=(b,a)c=(b,a)
则解密为
先计算μ=b−as=m+te∈Rq\mu = b-as=m+te\in \mathcal{R}_qμ=b−as=m+te∈Rq​,然后计算m=[μ]t∈Rtm=[\mu]_t\in\mathcal{R}_tm=[μ]t​∈Rt​。


这里可以看到RLWE类型的密文相对于LWE类型的密文来说的一个优势在于,一个LWE的密文的长度是n+1n+1n+1,对应的明文是Zt\Z_tZt​内的,相当于有效信息只有1个,利用率为1n+1\frac{1}{n+1}n+11​;而RLWE的密文长度是2n2n2n,对应的明文是Rt\mathcal{R}_tRt​内的,有效信息最多有nnn个,利用率为12\frac{1}{2}21​。如果使用SIMD的技术的话,可以将这nnn位都有效的利用起来。

关于SIMD的技术,SV的文章我还没有看,但现在BGV和BFV类型的SIMD应该都用的是INTT来做encoding的吧,可以参考一下CKKS的Encoding。思想是类似的。

噪声

注意到在解密过程中,是先得到了m+temodqm+te \bmod qm+temodq,然后再模ttt得到mmm的。这里一个很重要的条件就是(m+te)<q(m+te)<q(m+te)<q,BGV将φs(c)=b−as=m+te\varphi_s(c)=b-as=m+teφs​(c)=b−as=m+te这一项称作噪声,一个很重要的条件就是噪声的大小要<q<q<q。如果是一个中心取模的方案,还要额外地要求噪声的大小<q2<\frac{q}{2}<2q​。

Modulus Switching

注:后面的符号表示都是针对基于RLWE的BGV方案了。

感觉BGV里面最核心的技术应该就是Modulus Switching了,因为只有这个方案这么用,像Key Switching那种,基本所有同态方案都有使用。

为什么需要MS

首先,Modulus Switching是干什么的,直观上理解,modulus switching是将一个密文模数qqq转换到另一个密文模数q′q'q′上。

但这样有什么用处呢?
那首先要看一下乘法的密文噪声:
前面我们已经定义了,所谓的噪声就是φs(c)=(m+te)\varphi_s(c)=(m+te)φs​(c)=(m+te),对于两个不同的密文,c1=Enc(m1),c2=Enc(m2)c_1 = Enc(m_1),c_2=Enc(m_2)c1​=Enc(m1​),c2​=Enc(m2​),φ(c1)=m1+te1,φ(c2)=m2+te2\varphi(c_1)=m_1+te_1,\varphi(c_2)=m_2+te_2φ(c1​)=m1​+te1​,φ(c2​)=m2​+te2​。两个的乘法的噪声为φ(c1c2)=φ(c1)⋅φ(c2)=(m1+te1)(m2+te2)=m1m2⏟<t2+t(m1e2+m2e1)⏟<t2∣e∣+t2e1e2⏟<t2∣e∣2\varphi(c_1c_2) = \varphi(c_1)\cdot \varphi(c_2)=(m_1+t e_1)(m_2+te_2) \\ =\underbrace{m_1m_2}_{<t^2} +\underbrace{t(m_1e_2+m_2e_1)}_{<t^2|e|}+\underbrace{t^2e_1e_2}_{<t^2|e|^2}φ(c1​c2​)=φ(c1​)⋅φ(c2​)=(m1​+te1​)(m2​+te2​)=<t2m1​m2​​​+<t2∣e∣t(m1​e2​+m2​e1​)​​+<t2∣e∣2t2e1​e2​​​
可以看到相比原来的噪声大小φ(c)=m+te⏟<t∣e∣\varphi(c)=\underbrace{m+te}_{<t|e|}φ(c)=<t∣e∣m+te​​,
乘法之后的噪声是翻倍了。而如果我们需要正确解密的话,需要噪声大小φ(c)<q//(φ(c)<q/2)\varphi(c)<q//(\varphi(c)<q/2)φ(c)<q//(φ(c)<q/2)。假设我们初始的噪声大小为t∣e∣=Bt|e|=Bt∣e∣=B,则乘法之后的噪声大小为B2B^2B2,再进行一次乘法变为B4B^4B4,进行ℓ\ellℓ次乘法之后噪声大小为B2ℓB^{2^\ell}B2ℓ。若要求B2ℓ<qB^{2^\ell}<qB2ℓ<q,则最多做ℓ≈log⁡2(log⁡B(q))−1\ell\approx \log_2(\log_B(q))-1ℓ≈log2​(logB​(q))−1次乘法。
如何减少这种噪声的扩张呢?,其实BGV,BFV,CKKS给出了三种不同的解决方法,其中BGV和CKKS比较类似,都是把密文和模数同时减少(区别在于,CKKS缩小完模数之后会对明文产生影响,变为一个近似的结果;而BGV不会)。BFV则是一个scale invariant的方法,即模数不会变,通过乘法后除以一个扩张因子来保持噪声规模。
为什么模数减小噪声也会变小:考虑以下情况:
φ(c)=m+temodq,φ(pqc)=pqm+pqte⏟<pqBmodp\varphi(c)=m+te \bmod q,\varphi(\frac{p}{q} c)=\underbrace{\frac{p}{q}m+\frac{p}{q}te}_{<\frac{p}{q}B} \bmod pφ(c)=m+temodq,φ(qp​c)=<qp​Bqp​m+qp​te​​modp
通过对密文整体进行缩放,模数从qqq变为ppp,噪声从BBB变为pqB\frac{p}{q}Bqp​B,那这里疑问就产生了:噪声和模数的比例关系没变啊,还是Bq=pqBp\frac{B}{q}=\frac{\frac{p}{q}B}{p}qB​=pqp​B​,为什么说减少了噪声呢?

这里举个例子:比如B=2,q=131072,p=12q=65536B=2,q=131072,p=\frac{1}{2}q=65536B=2,q=131072,p=21​q=65536。那么不使用MS的噪声扩张为
2mod131072→multiply4mod131072→multiply16mod131072→multiply256mod131072→multiply65536mod131072→multiply(×)655362mod1310722 \bmod 131072 \stackrel{multiply}{\to}4 \bmod 131072 \stackrel{multiply}{\to} 16 \bmod 131072\stackrel{multiply}{\to} 256 \bmod 131072\stackrel{multiply}{\to} 65536 \bmod 131072\stackrel{multiply(\times)}{\to} 65536^2 \bmod 1310722mod131072→multiply4mod131072→multiply16mod131072→multiply256mod131072→multiply65536mod131072→multiply(×)655362mod131072
总共能做4层乘法。

如果我们在第一次乘法之后做一个MS,即将B→pqBB\to \frac{p}{q}BB→qp​B,q→pq\to pq→p。则噪声扩张为
2mod131072→multiply4mod131072→MS2mod65536→multiply4mod65536→multiply16mod65536→multiply256mod65536→multiply65536mod655362 \bmod 131072 \stackrel{multiply}{\to} 4 \bmod 131072\stackrel{MS}{\to} 2 \bmod 65536\stackrel{multiply}{\to} 4 \bmod 65536\stackrel{multiply}{\to} 16 \bmod 65536\stackrel{multiply}{\to} 256 \bmod 65536\stackrel{multiply}{\to} 65536 \bmod 655362mod131072→multiply4mod131072→MS2mod65536→multiply4mod65536→multiply16mod65536→multiply256mod65536→multiply65536mod65536
能做5层乘法。

那再考虑另一种情况,每次乘法完都做一次modulus switching,将B→12B,q→12qB\to \frac{1}{2}B,q \to \frac{1}{2}qB→21​B,q→21​q:
则噪声扩张变为:
2mod131072→multiply4mod131072→MS2mod65536→multiply4mod65536→MS2mod32768→multiply4mod32768→MS2mod16384→multiply4mod16384→MS2mod8192→multiply4mod8192→MS2mod4096→multiply4mod4096→MS2mod2048→multiply4mod2048→MS2mod1024→multiply4mod1024→MS2mod512→multiply4mod512→MS2mod256→multiply4mod256→MS2mod128→multiply4mod128→MS2mod64→multiply4mod64→MS2mod32→multiply4mod32→MS2mod16→multiply4mod16→MS2mod8→multiply4mod8→MS2mod4→multiply(×)4mod42 \bmod 131072 \stackrel{multiply}{\to} 4 \bmod 131072\stackrel{MS}{\to} \\2 \bmod 65536 \stackrel{multiply}{\to} 4 \bmod 65536 \stackrel{MS}{\to} \\2 \bmod 32768\stackrel{multiply}{\to} 4 \bmod 32768\stackrel{MS}{\to} \\ 2 \bmod 16384\stackrel{multiply}{\to} 4 \bmod 16384\stackrel{MS}{\to} \\ 2 \bmod 8192\stackrel{multiply}{\to} 4 \bmod 8192\stackrel{MS}{\to} \\ 2 \bmod 4096\stackrel{multiply}{\to} 4 \bmod 4096\stackrel{MS}{\to} \\ 2 \bmod 2048\stackrel{multiply}{\to} 4 \bmod 2048\stackrel{MS}{\to} \\ 2 \bmod 1024\stackrel{multiply}{\to} 4 \bmod 1024\stackrel{MS}{\to}\\ 2 \bmod 512\stackrel{multiply}{\to} 4 \bmod 512\stackrel{MS}{\to}\\ 2 \bmod 256\stackrel{multiply}{\to} 4 \bmod 256\stackrel{MS}{\to}\\ 2 \bmod 128\stackrel{multiply}{\to} 4 \bmod 128\stackrel{MS}{\to}\\ 2 \bmod 64\stackrel{multiply}{\to} 4 \bmod 64\stackrel{MS}{\to}\\ 2 \bmod 32\stackrel{multiply}{\to} 4 \bmod 32\stackrel{MS}{\to}\\ 2 \bmod 16\stackrel{multiply}{\to} 4 \bmod 16\stackrel{MS}{\to}\\ 2 \bmod 8\stackrel{multiply}{\to} 4 \bmod 8\stackrel{MS}{\to}\\ 2 \bmod 4\stackrel{multiply(\times)}{\to} 4 \bmod 42mod131072→multiply4mod131072→MS2mod65536→multiply4mod65536→MS2mod32768→multiply4mod32768→MS2mod16384→multiply4mod16384→MS2mod8192→multiply4mod8192→MS2mod4096→multiply4mod4096→MS2mod2048→multiply4mod2048→MS2mod1024→multiply4mod1024→MS2mod512→multiply4mod512→MS2mod256→multiply4mod256→MS2mod128→multiply4mod128→MS2mod64→multiply4mod64→MS2mod32→multiply4mod32→MS2mod16→multiply4mod16→MS2mod8→multiply4mod8→MS2mod4→multiply(×)4mod4
总计有15层乘法。

总结:
由此可见,MS不改变噪声和模数的比例关系,但是噪声的扩张速度是被减少了的。每次缩小噪声从而导致模数变小,在BGV里面称作密文到达了下一层,也就如为上面的写法一样,一层拥有对应模数。通过模数缩减可以使原本ℓ≈log⁡2(log⁡B(q))−1\ell\approx \log_2(\log_B(q)) -1ℓ≈log2​(logB​(q))−1次乘法。变为ℓ≈(log⁡B(q)−1\ell\approx (\log_B(q) -1ℓ≈(logB​(q)−1次乘法。

如何做MS

其实在上面的例子里面已经有设计到如何做MS的问题了,对于一个密文c=(a,b)c=(a,b)c=(a,b)。对于LLL层乘法,取多个Q:{Q0,Q1,...,QL}Q:\{Q_0,Q_1,...,Q_L\}Q:{Q0​,Q1​,...,QL​},满足Qi+1≈B⋅QiQ_{i+1}\approx B\cdot Q_iQi+1​≈B⋅Qi​的关系。
modulus switching:
c=(a,b)modQLc=(a,b) \bmod Q_Lc=(a,b)modQL​。

Modulus Switch的结果为c′c'c′,c′c'c′是距离QL−1QLc\frac{Q_{L-1}}{Q_{L}}cQL​QL−1​​c很接近的一个密文,且要满足c′=cmodtc' = c \bmod tc′=cmodt。

那么在Qi=1modtQ_i =1 \bmod tQi​=1modt的情况下,ϕ(c′)modt=ϕ(c)modt=m\phi(c') \bmod t = \phi(c) \bmod t = mϕ(c′)modt=ϕ(c)modt=m。

这里原本的内容有误,感谢评论区指出,本来凭着记忆写了,没去看文章。对如何找这样一个很接近的密文好奇的小伙伴可以看这篇文章。

关于KeySwitching/Relinearization

KeySwitching其实不算是BGV特有的技术,所以不准备放在BGV里面介绍。这里说一下大概的思路。
对于一个用sss加密的密文ccc来说,他由两部分组成,(a,b)(a,b)(a,b),其中b=as+m+teb=as+m+teb=as+m+te。
如果说我要将这个密文转为由密钥s′s's′加密,则我先使用s′s's′加密sss,得到ksk=(ak,bk)ksk=(a_k,b_k)ksk=(ak​,bk​)其中bk=aks′+s+tekb_k=a_ks'+s+te_kbk​=ak​s′+s+tek​。
key switch可以理解为得到c′=(a′,b′)=(0,b)−a⋅(ak,bk)=(−a⋅ak,b−a⋅bk)c'=(a',b')=(0,b)-a\cdot(a_k,b_k)=(-a\cdot a_k,b-a\cdot b_k)c′=(a′,b′)=(0,b)−a⋅(ak​,bk​)=(−a⋅ak​,b−a⋅bk​)。
对(a′,b′)(a',b')(a′,b′)用s′s's′解密得到

b′−a′s′=b−a⋅bk+a⋅ak⋅s′=b−a(aks′+s+tek)+(a⋅ak⋅s′)=b−a(s+tek)=b−as+atek=m+te+atek=m+te′\begin{aligned} b'-a's' &=b-a\cdot b_k+a\cdot a_k \cdot s' \\&=b-a(a_ks'+s+te_k)+(a\cdot a_k\cdot s') \\&=b-a(s+te_k) \\&=b-as+ate_k \\&=m+te+ate_{k} \\&=m+te' \end{aligned}b′−a′s′​=b−a⋅bk​+a⋅ak​⋅s′=b−a(ak​s′+s+tek​)+(a⋅ak​⋅s′)=b−a(s+tek​)=b−as+atek​=m+te+atek​=m+te′​
所以c′c'c′是一个由s′s's′加密的密文。

重线性化可以类似的理解一下,乘法之后的密文变为由s2s^2s2加密的密文,所以将s2s^2s2keyswitch回sss,就可以继续使用sss解密了。

小尾巴

本人正在入门密码学,欢迎各位同学或老师加我微信交流:shenghua-adije

BGV方案简介(同态加密)相关推荐

  1. (BGV12)同态加密方案初学

    BGV主要优化了BV11中的维度-模约减技术,提出了模交换技术,同时也优化了重线性化技术,提出了密钥交换技术,使得无需Bootstrapping也能做到较多层数的同态乘法. 前置 另一种形势的LWE公 ...

  2. 同态加密GSW方案学习笔记1-GSW最初方案概述

    概述 2013 年,Gentry 等人使用近似特征向量技术,设计了一个无需计算密钥的全同态加密方案:GSW,拉开了第三代全同态加密的帷幕.2014年,Chris Peikert 等人提出了一个更简单的 ...

  3. 密码学学习笔记(五)——CKKS同态加密方案

    文章目录 1. 提出背景 2. 方案原理 3. 算法描述 4.方案改进 4.1 自举方案 4.2 RNS变体 1. 提出背景 1978年,Rivest.Adleman和Dertouzos在文献[1]中 ...

  4. 5、隐私计算--同态加密

    目录 同态加密 同态加密研究进展 同态加密原理及方案 同态加密分类 HE方案安全性 同态加密与区块链 同态加密应用 全同态工程实现开源工具 参考推荐: 同态加密_federated的博客-CSDN博客 ...

  5. 密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)

    文章目录 SM1 对称密码 SM2 椭圆曲线公钥密码算法 SM3 杂凑算法 SM4 对称算法 同态加密 密态计算和隐私计算 安全多方计算技术 安全多方计算的应用场景 对称加密算法 非对称加密算法(公钥 ...

  6. 全同态加密(FHE)体系概述(初学版)

    同态加密定义 假设有这样一个场景,用户有一组私密数据,被加密存储在了第三方的云平台,现在,该用户想对这组数据进行某种处理,但是处理过程和结果都不想让第三方云平台看到.当然,用户可以选择将数据下载下来, ...

  7. SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算的概念

    SM1.SM2.SM3和SM4 为了保障商用密码的安全性,国家密码局制定了一系列密码标准,包括:SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法(ZUC) 等. SM1.SM ...

  8. 安全多方计算之三:同态加密

    同态加密 1. 同态加密概述 2. 乘同态的ElGamal加密方案 3. 加同态的Paillier加密方案 4. 全同态加密方案 1. 同态加密概述 同态加密首次由R.Rivest等人于1978年在& ...

  9. 同态加密BGV与BFV方案对比与梳理

    Revisiting Homomorphic Encryption Schemes for Finite Fields 文章目录 Revisiting Homomorphic Encryption S ...

最新文章

  1. exchange十种常见退信原因
  2. HuggingFace-transformers系列的介绍以及在下游任务中的使用
  3. 常用chrome插件
  4. 必须知道的八大种排序算法【java实现】
  5. Flask项目中应用七牛云存储
  6. python继承属性_Python中的属性继承问题
  7. 与梦城Typecho博客数据站+API站
  8. python深度学习库keras——安装
  9. WebSocket API 学习笔记
  10. 4.数据库数据导入查询数据库信息出现乱码问题
  11. 什么是次梯度(次导数)
  12. NumberFormat类
  13. C语言如何写循环队列,C语言 队列(循环队列)
  14. 123457123457#0#----com.MC.konglongtianse222----前拼后广--恐龙填色mc-mc1111
  15. net use 命令使用教程
  16. 华为设备配置OSPF的NSSA区域
  17. 蒲公英快速查询苹果手机UDID方法
  18. 什么叫特立独行,其实不过是活在自己的节奏里
  19. Redhat7安装HDS存储多路径软件
  20. C/C++播放音乐的函数的学习

热门文章

  1. 阿里巴巴集团副总裁贾扬清:开源大数据生态前瞻
  2. 99%的面试官都会问的一个问题,这样答就能轻松过关
  3. 【FatFs】文件系统常见应用
  4. CSS好看的背景颜色样式(持续更新)
  5. PCI网卡上扩展ROM编程 3.基址寄存器
  6. Postgresql之添加字段插件pg_migrate安装使用
  7. Vmware安装Kali Linux2020.2(详细安装教程,爬坑指南,详细到哭)
  8. 树莓派4B开发板入门
  9. 013 Cadence IC Virtuoso简介
  10. 全网最新软件测试知识点总结