本文主要记录隐私计算中的同态加密(Homomorphic Encryption,HE)技术,包括部分同态加密(RSA、GM、ElGamal、Paillier)、近似同态加密(BGN)、有限级数全同态加密和全同态加密(DGHV、BGV、BFV、CKKS、GSW、FHEW、TFHE)等技术,仅供参考

由于篇幅限制,将同态加密技术的介绍分为四个部分,第一部分讲述部分同态加密和近似同态加密技术;第二部分讲述 Bootstrapping 和 DGHV、BGV 全同态加密方案;第三部分讲述 SIMD 打包技术与 BFV、CKKS 全同态加密方案;第四部分讲述 GSW、FHEW、TFHE 全同态加密方案。

在本文中为简化表示,将加密记为 Enc(⋅)Enc(\cdot)Enc(),解密记为 Dec(⋅)Dec(\cdot)Dec(),不标明使用的公钥和私钥代表只有一对公私钥。本文中介绍的加密方案基本都依赖于各种计算难题,在之前的文章中有过介绍。

一、同态加密介绍

1. 简单介绍

加密技术一般用来保护重要的隐私信息,只能实现安全的存储信息。而同态加密是一种特殊的加密技术,额外提供了对信息进行计算的功能。

“同态”可以理解为:明文运算后的密文可以由明文对应的密文直接运算得到,即不需要解密就可以实现明文对应的运算。一般可分为加法同态乘法同态(也会存在其他的同态性质,这里以加法和乘法为例)。

  • 加法同态:对于两个消息 m0,m1m_0,m_1m0,m1,设其在某种加法同态加密算法下的密文分别为 c0,c1c_0,c_1c0,c1。存在一种函数运算,如 f(x,y)=x+yf(x,y)=x+yf(x,y)=x+y, 使得:f(c0,c1)=c0+c1=Enc(m0+m1)f(c_0, c_1)=c_0+c_1=Enc(m_0+m_1)f(c0,c1)=c0+c1=Enc(m0+m1)

  • 乘法同态:对于两个消息 m0,m1m_0,m_1m0,m1,设其在某种加法同态加密算法下的密文分别为 c0,c1c_0,c_1c0,c1。存在一种函数运算,f(x,y)=x×yf(x,y)=x\times yf(x,y)=x×y, 使得:f(c0,c1)=c0×c1=Enc(m0×m1)f(c_0, c_1)=c_0\times c_1 =Enc(m_0\times m_1)f(c0,c1)=c0×c1=Enc(m0×m1)

传统加密方式要通过 c0,c1c_0,c_1c0,c1 得到 m0+m1m_0+m_1m0+m1 的结果,只能先解密再运算:m0+m1=Dec(c0)+Dec(c1)m_0+m_1=Dec(c_0)+Dec(c_1)m0+m1=Dec(c0)+Dec(c1),这样解密会泄露明文 m0,m1m_0,m_1m0,m1 的信息。

通过同态加密可以实现 m0+m1=Dec(f(c0,c1))m_0+m_1=Dec(f(c_0,c_1))m0+m1=Dec(f(c0,c1)),可以在不泄露明文 m0,m1m_0,m_1m0,m1 的信息的情况下得到最终结果,这是使用同态加密实现隐私计算的基本原理。

2. 同态加密分类

同态加密一般可以分为四类:部分同态加密(Partially Homomorphic Encryption)、近似同态加密(Somewhat Homomorphic Encryption)、有限级数全同态加密(Leveled Fully Homomorphic Encryption)、全同态加密(Fully Homomorphic Encryption)。

  • 部分同态加密:可以简单的理解为只支持加法同态或乘法同态其中一种(可计算的函数只能包含特定的运算操作)。

  • 近似同态加密:一般指支持无限次加法同态和少量乘法同态 (可计算的函数包含的运算操作不能随意组合)。

  • 有限级数全同态加密:支持加法同态和乘法同态,但同态运算次数有限(可计算的函数包含的运算可以随意组合,但总体复杂度有限制)。

  • 全同态加密:支持无限次加法同态和乘法同态运算(能实现任意功能的函数操作)。

二、部分同态加密

本文主要介绍四种部分同态加密技术:RSA加密、GM加密、ElGamal加密、Paillier加密。

1. RSA加密方案

RSA 加密方案由 Rivest、Shamir 和 Adleman 在 1978 发表[1]^{[1]}[1](似乎在1973年 Clifford Cocks 就给出了类似的加密方案,但因为工作保密没有发表)。


1.1 密钥生成算法

  1. 选取两个不同的大素数 p,qp,qp,q,计算 n=pqn=pqn=pqφ(n)=(p−1)(q−1)\varphi(n)=(p-1)(q-1)φ(n)=(p1)(q1),其中 φ(⋅)\varphi(\cdot)φ() 为欧拉函数。

  2. 选取两个正整数 e,de,de,d 使得 ed≡1 mod φ(n)ed\equiv 1 \ mod \ \varphi(n)ed1 mod φ(n),即 ed=k⋅φ(n)+1ed=k\cdot \varphi(n)+1ed=kφ(n)+1。可通过随机取与 φ(n)\varphi(n)φ(n) 互素的正整数 eee,并计算逆元得到 d≡e−1 mod φ(n)d \equiv e^{-1} \ mod \ \varphi(n)de1 mod φ(n)

  3. 公钥为 e,ne,ne,n,私钥为 ddd

1.2 加密算法

对于消息 mmmmmm 为小于 nnn 的正整数),使用公钥加密得到密文 ccc 的过程如下:

c=Enc(m)=me mod n c=Enc(m)=m^e \ mod \ n c=Enc(m)=me mod n

1.3 解密算法

对于密文 ccc ,使用私钥解密得到明文消息 mmm 的过程如下:

m=Dec(c)=cd mod n m = Dec(c) = c^d \ mod \ n m=Dec(c)=cd mod n


正确性

可以验证: cd=med=mk⋅φ(n)+1=(mφ(n))k⋅m=mc^d = m^{ed}= m^{k\cdot \varphi(n)+1}=(m^{\varphi(n)})^k\cdot m = mcd=med=mkφ(n)+1=(mφ(n))km=m (mod nmod \ nmod n)。

其中,根据欧拉定理,mφ(n)≡1m^{\varphi(n)}\equiv 1mφ(n)1 (mod nmod \ nmod n)。

安全性

RSA 加密方案的安全性依赖于大数分解问题。在密钥生成时,私钥 ddd 的安全性由 φ(n)\varphi(n)φ(n) 决定,而 φ(n)\varphi(n)φ(n) 的计算直接依赖于 p,qp,qp,q。因此只要无法根据 nnn 计算出 p,q,φ(n)p,q,\varphi(n)p,q,φ(n),那么私钥 ddd 就无法被破解。

上述 RSA 加密方案不满足语义安全性,因为对于同一个消息 mmm,使用上述加密算法每次加密得到的密文是确定的,在实际应用中可以通过随机填充或引入哈希函数来弥补这个缺陷。

乘法同态性

RSA 加密方案具有乘法同态性,在模 nnn 意义下,有:

Enc(m0)⋅Enc(m1)=m0e⋅m1e=(m0m1)e=Enc(m0m1) Enc(m_0)\cdot Enc(m_1)=m_0^e\cdot m_1^e = (m_0m_1)^e = Enc(m_0m_1) Enc(m0)Enc(m1)=m0em1e=(m0m1)e=Enc(m0m1)


2. GM 加密方案

GM 加密方案由 Goldwasser 和 Micali 在 1982 年发表[2]^{[2]}[2],该方案只能对一个比特进行加密,具有异或同态性,实用性有限。

在了解 GM 方案之前需要先了解一些前置知识:Legendre 符号Jacobi 符号,简单介绍如下:

Legendre 符号:对于奇素数 ppp,对于小于 ppp 的正整数 aaa,其 Legendre 符号记为 (ap)\left(\frac{a}{p} \right)(pa),在本文中简记为 Lp(a)L_p(a)Lp(a)。当 aaa 为模 ppp 的二次剩余时,Lp(a)L_p(a)Lp(a)111,否则 Lp(a)L_p(a)Lp(a)000。(本文中只考虑 a<pa\lt pa<p 的情况)。

Jacobi 符号:对于奇正整数 nnn,对于小于 nnn 且与 nnn 互素的正整数 aaa,其 Jacobi 符号在本文中简记为 Jn(a)J_n(a)Jn(a)。若 nnn 的质因数分解为 n=p1e1p2e2⋯pkekn = p_1^{e_1} p_2^{e_2} \cdots p_k^{e_k}n=p1e1p2e2pkek,则 Jn(a)=∏i=1k(Lpi(a))eiJ_n(a) =\prod_{i=1}^{k} (L_{p_i}(a))^{e_i}Jn(a)=i=1k(Lpi(a))ei。当 nnn 为奇素数时,Jn(a)=Ln(a)J_n(a) = L_n(a)Jn(a)=Ln(a)

Jacobi 符号在模数 nnn 为奇素数时和 Legendre 符号一样可以用来判断 aaa 是否为二次剩余:当 Jn(a)=1J_n(a) = 1Jn(a)=1 时,aaa 一定是二次剩余。

当奇正整数 nnn 不为素数时,Jacobi 符号无法直接用来判断aaa 是否为二次剩余:当 Jn(a)=1J_n(a) = 1Jn(a)=1 时,aaa 可能不是二次剩余,将满足这种性质的 aaa 称为伪二次剩余

Jacobi 符号有如下几个性质:

  1. nnn 为奇素数时,Jn(a)=an−12 mod nJ_n(a) = a^{\frac{n-1}{2}} \ mod \ nJn(a)=a2n1 mod n

    证明:乘法群 Zn∗={1,2,3,⋯ ,n−1}Z_n^*=\{1, 2,3,\cdots,n-1\}Zn={1,2,3,,n1},设其一个生成元为 ggg,则 Zn∗={g0,g1,⋯ ,gn−2}Z_n^*=\{g^0,g^1,\cdots,g^{n-2}\}Zn={g0,g1,,gn2}gn−1=1=g0g^{n-1}=1=g^0gn1=1=g0),对其中每个元素平方后可以得到二次剩余集合 {g0,g2,⋯ ,gn−3}\{g^0,g^2,\cdots, g^{n-3}\}{g0,g2,,gn3},即得到的每个二次剩余都是 ggg 的偶数次方。

    对于任意一个二次剩余 g2kg^{2k}g2k,在模 nnn 意义下可以验证 Jn(g2k)=(g2k)n−12=g(n−1)k=1J_n(g^{2k}) = (g^{2k})^{\frac{n-1}{2}} = g^{(n-1)k}=1Jn(g2k)=(g2k)2n1=g(n1)k=1

    对于任意一个二次非剩余 g2k+1g^{2k+1}g2k+1,在模 nnn 意义下可以验证 Jn(g2k+1)=(g2k+1)n−12=g(n−1)k⋅gn−12=gn−12J_n(g^{2k+1}) = (g^{2k+1})^{\frac{n-1}{2}} = g^{(n-1)k}\cdot g^{\frac{n-1}{2}}=g^{\frac{n-1}{2}}Jn(g2k+1)=(g2k+1)2n1=g(n1)kg2n1=g2n1。由于 gn−1=1g^{n-1} = 1gn1=1,则 gn−12=±1g^{\frac{n-1}{2}} = \pm 1g2n1=±1。考虑到生成元 ggg 的阶为 n−1n-1n1,这说明 gn−12≠1g^{\frac{n-1}{2}} \ne 1g2n1=1,因此 Jn(g2k+1)=gn−12=−1J_n(g^{2k+1}) = g^{\frac{n-1}{2}} = -1Jn(g2k+1)=g2n1=1

    综上所述,可以证明 Jn(a)=an−12 mod nJ_n(a) = a^{\frac{n-1}{2}} \ mod \ nJn(a)=a2n1 mod n 成立。

  2. nnn 为奇素数时,Jn(ab)=Jn(a)Jn(b)J_n(ab) = J_n(a)J_n(b)Jn(ab)=Jn(a)Jn(b)

    证明Jn(ab)=(ab)n−12=an−12⋅bn−12=Jn(a)Jn(b)J_n(ab) = (ab)^{\frac{n-1}{2}} = a^{\frac{n-1}{2}} \cdot b^{\frac{n-1}{2}} = J_n(a)J_n(b)Jn(ab)=(ab)2n1=a2n1b2n1=Jn(a)Jn(b)

  3. n=pqn=pqn=pq,其中 p,qp,qp,q 为大素数时,Jn(ab)=Jn(a)Jn(b)J_n(ab) = J_n(a)J_n(b)Jn(ab)=Jn(a)Jn(b)

    证明Jn(ab)=Jp(ab)⋅Jq(ab)=Jp(a)Jp(b)⋅Jq(a)Jq(b)=Jn(a)Jn(b)J_n(ab) = J_p(ab)\cdot J_q(ab) = J_p(a)J_p(b) \cdot J_q(a)J_q(b) = J_n(a)J_n(b)Jn(ab)=Jp(ab)Jq(ab)=Jp(a)Jp(b)Jq(a)Jq(b)=Jn(a)Jn(b)


2.1 密钥生成算法

  1. 选取两个不同的大素数 p,qp,qp,q,计算 n=pqn=pqn=pq,可以得到模 nnn 意义下的乘法群 Zn∗\mathbb{Z}^*_nZn(小于 nnn 且与 nnn 互素的正整数组成的集合)。

  2. 选取正整数 x∈Zn∗x\in \mathbb{Z}^*_nxZn 使得 xxx 是模 nnn 意义下的一个伪二次剩余。

  3. 公钥为 n,xn,xn,x,私钥为 p,qp,qp,q

2.2 加密算法

对于消息 m∈{0,1}m\in \{0,1\}m{0,1} ,随机选取 r∈Zn∗r\in \mathbb{Z}^*_nrZn,使用公钥加密得到密文 ccc 的过程如下:

c=Enc(m)=xm⋅r2 mod n c=Enc(m)=x^m\cdot r^2 \ mod \ n c=Enc(m)=xmr2 mod n

2.3 解密算法

对于密文 ccc ,记 cp=c mod pc_p = c \ mod \ pcp=c mod pcq=c mod qc_q = c \ mod \ qcq=c mod q,使用私钥解密得到明文消息 mmm 的过程如下:

  • Jp(cp)=1J_p(c_p)=1Jp(cp)=1Jq(cq)=1J_q(c_q)=1Jq(cq)=1 时,m=0m=0m=0
  • 其余情况,m=1m=1m=1

正确性

rp=r mod pr_p = r \ mod \ prp=r mod prq=r mod qr_q = r \ mod \ qrq=r mod q,则

  • m=0m=0m=0 时,c=r2c = r^2c=r2,此时 c=r2≡rp2c=r^2 \equiv r_p^2c=r2rp2 (mod pmod \ pmod p),即 cp≡rp2c_p \equiv r_p^2cprp2 (mod pmod \ pmod p),即 cpc_pcp 为模 ppp 二次剩余,则 Jp(cp)=1J_p(c_p)=1Jp(cp)=1。同理:Jq(cq)=1J_q(c_q)=1Jq(cq)=1

  • m=1m=1m=1 时,c=x⋅r2 mod nc = x \cdot r^2 \ mod \ nc=xr2 mod n,由于 xxx 不是模 nnn 的二次剩余,则 ccc不是nnn二次剩余。此时一定可以得到 cpc_pcp 不是模 ppp 的二次剩余,且 cqc_qcq 不是模 qqq 的二次剩余,即 Jp(cp)=Jq(cq)=−1J_p(c_p)=J_q(c_q)=-1Jp(cp)=Jq(cq)=1

    证明:可以计算出 Jn(c)=Jn(x)⋅Jn(r2)=1J_n(c) = J_n(x)\cdot J_n(r^2) = 1Jn(c)=Jn(x)Jn(r2)=1,从而得到 Jp(cp)Jq(cq)=Jn(c)=1J_p(c_p)J_q(c_q)=J_n(c)=1Jp(cp)Jq(cq)=Jn(c)=1,因此可以解出:Jp(cp)=Jq(cq)=1J_p(c_p)=J_q(c_q)=1Jp(cp)=Jq(cq)=1Jp(cp)=Jq(cq)=−1J_p(c_p)=J_q(c_q)=-1Jp(cp)=Jq(cq)=1

    Jp(cp)=Jq(cq)=1J_p(c_p)=J_q(c_q)=1Jp(cp)=Jq(cq)=1 时,即 ccc 为模 ppp 和模 qqq 的二次剩余,此时有 c≡tp2c \equiv t_p^2ctp2 (mod pmod \ pmod p) 和 c≡tq2c \equiv t_q^2ctq2 (mod qmod \ qmod q) 成立,根据中国剩余定理可以构造出模 nnn 意义下唯一的 ttt 满足 t≡tpt \equiv t_pttp (mod pmod \ pmod p) 且 t≡tqt \equiv t_qttq (mod qmod \ qmod q)。因此可以得到 c≡t2c \equiv t^2ct2 (mod pmod \ pmod p) 和 c≡t2c \equiv t^2ct2 (mod qmod \ qmod q) 成立,从而得到 c≡t2c \equiv t^2ct2 (mod nmod \ nmod n) 成立,说明 ccc 是模 nnn 意义下的二次剩余,出现矛盾。因此 Jp(cp)=Jq(cq)=−1J_p(c_p)=J_q(c_q)=-1Jp(cp)=Jq(cq)=1 得证。

安全性

GM 加密算法的安全性依赖于在不知道 p,qp,qp,q 具体取值的情况下,只根据 nnn 判断正整数 ccc 是否为模 pppqqq 的二次剩余是困难的

在密钥生成算法中,注意到 xxx 必须是模 nnn 意义下的一个伪二次剩余,即要求 Jn(x)=1J_n(x) = 1Jn(x)=1xxx 不为模 nnn 的二次剩余。这是出于正确性和安全性的考虑,原因如下:

  • xxx 为模 nnn 的二次剩余,显然密文 c=xm⋅r2c=x^m\cdot r^2c=xmr2 无论 mmm 取何值,ccc 都为模 nnn 意义下的二次剩余,则也为模 pppqqq 意义下的二次剩余,此时 Jp(cp)=1J_p(c_p)=1Jp(cp)=1Jq(cq)=1J_q(c_q)=1Jq(cq)=1 恒成立,就失去了解密手段

  • xxx 不为模 nnn 的二次剩余,但不要求 Jn(x)=1J_n(x) = 1Jn(x)=1,由于 Jacobi 符号的计算存在多项式时间内的算法,此时根据 c=xm⋅r2c=x^m\cdot r^2c=xmr2 可以在多项式时间内计算出 Jn(c)=Jn(xm)⋅Jn(r2)=Jn(xm)J_n(c)=J_n(x^m)\cdot J_n(r^2)=J_n(x^m)Jn(c)=Jn(xm)Jn(r2)=Jn(xm) 的取值,显然当 m=0m=0m=0 时,Jn(x)=1J_n(x) = 1Jn(x)=1,否则 Jn(x)≠1J_n(x) \ne 1Jn(x)=1。攻击方可以在多项式时间内根据 Jacobi 符号暴露出的信息获取明文 mmm 的取值,就失去了安全性

该方案满足语义安全性,因为每次加密都会随机选取 rrr,可以保证同一消息的多次重复加密结果不确定。

异或(模2加法)同态性

GM 加密方案具有异或同态性,在模 nnn 意义下,有:

Enc(m0)⋅Enc(m1)=x0m0⋅r02⋅x1m1⋅r12=x0m0⋅x1m1⋅(r0r1)2=Enc(m0⊕m1) Enc(m_0)\cdot Enc(m_1)=x_0^{m_0}\cdot r_0^2 \cdot x_1^{m_1} \cdot r_1^2 = x_0^{m_0}\cdot x_1^{m_1}\cdot(r_0r_1)^2 = Enc(m_0 \oplus m_1) Enc(m0)Enc(m1)=x0m0r02x1m1r12=x0m0x1m1(r0r1)2=Enc(m0m1)

根据 GM 加密方案的正确性,易证只有当 m0=m1m_0=m_1m0=m1 时,密文 c=Enc(m0⊕m1)c = Enc(m_0 \oplus m_1)c=Enc(m0m1) 才满足 Jp(cp)=1J_p(c_p)=1Jp(cp)=1Jq(cq)=1J_q(c_q)=1Jq(cq)=1


3. ElGamal 加密方案

ElGamal 加密方案由 T. ElGamal 于 1985 年发表[3]^{[3]}[3],该方案基于 Diffie-Hellman 密钥交换的思想,其安全性本质上依赖于离散对数问题难解。ElGamal 加密方案一般可以在循环群或椭圆曲线上实现,两种实现方式思想一样,本文只介绍在循环群上的加密方案。


3.1 密钥生成算法

对于大素数 ppp,有模 ppp 乘法循环群 Zp∗\mathbb{Z}_p^*Zp,设 ggg 为该群的一个生成元,随机取群中元素 gag^aga

公钥为 p,g,gap,g,g^ap,g,ga,私钥为 aaa

3.2 加密算法

对于消息 mmm,随机取小于 ppp 的正整数 bbb,则使用公钥加密得到密文 c=(c1,c2)c=(c_1,c_2)c=(c1,c2) 的过程如下:

(c1,c2)=Enc(m)=(gb,gab⋅m) mod p (c_1,c_2)=Enc(m)=(g^b,g^{ab}\cdot m) \ mod \ p (c1,c2)=Enc(m)=(gb,gabm) mod p

3.3 解密算法

对于密文 c=(c1,c2)c=(c_1,c_2)c=(c1,c2) ,使用私钥解密得到明文消息 mmm 的过程如下:

m=Dec(c)=c2⋅(c1a)−1 mod p m = Dec(c) = c_2\cdot (c_1^a)^{-1} \ mod \ p m=Dec(c)=c2(c1a)1 mod p


正确性

可以验证:c2⋅(c1a)−1=m⋅gab⋅(gab)−1=mc_2\cdot (c_1^a)^{-1} =m\cdot g^{ab} \cdot (g^{ab})^{-1} = mc2(c1a)1=mgab(gab)1=m (mod pmod \ pmod p)。

安全性

ElGamal 加密方案的安全性在于在已知 ggg 的情况下,公开 gag^agagabg^{ab}gab 难以求得 gbg^bgb,只要离散对数问题的求解是困难的,该加密方案就是安全的。

该方案同时满足语义安全性,因为每次加密都会随机选取 bbb,可以保证同一消息的多次重复加密结果不确定。

乘法同态性

ElGamal 加密方案具有乘法同态性,在模 ppp 意义下,有:

Enc(m0)⋅Enc(m1)=(gb0+b1,ga(b0+b1))⋅m0⋅m1=Enc(m0m1) Enc(m_0)\cdot Enc(m_1)= (g^{b_0+b_1},g^{a(b_0+b_1)}) \cdot m_0\cdot m_1 = Enc(m_0m_1) Enc(m0)Enc(m1)=(gb0+b1,ga(b0+b1))m0m1=Enc(m0m1)

4. Paillier 加密方案

Paillier 加密方案由 Pascal Paillier 在 1999 年发表[4]^{[4]}[4],后经过多次优化,是目前效率较高的加法同态加密方案。


4.1 密钥生成算法

  1. 选取两个不同的大素数 p,qp,qp,q,计算 n=pqn=pqn=pq,以及 λ=lcm(p−1,q−1)\lambda = lcm(p-1,q-1)λ=lcm(p1,q1)

  2. 随机选择 g∈Zn2∗g\in \mathbb{Z}_{n^2}^*gZn2,满足 gcd(gλ mod n2−1n,n)=1gcd(\frac{g^{\lambda} \ mod \ n^2 - 1}{n},n)=1gcd(ngλ mod n21,n)=1

  3. 公钥为 n,gn,gn,g,私钥为 λ\lambdaλ

几点个人理解

  • λ\lambdaλ 的选取目的是为了要满足方程 gλ≡1g^\lambda \equiv1gλ1 (mod nmod \ nmod n) ,并不一定非要取 λ=lcm(p−1,q−1)\lambda = lcm(p-1,q-1)λ=lcm(p1,q1)

    由欧拉定理可以得到 gφ(n)=g(p−1)(q−1)≡1g^{\varphi(n)} = g^{(p-1)(q-1)}\equiv1gφ(n)=g(p1)(q1)1 (mod nmod \ nmod n),取 λ=φ(n)\lambda = \varphi(n)λ=φ(n) 也是没问题的。

    这里取 λ=lcm(p−1,q−1)\lambda = lcm(p-1,q-1)λ=lcm(p1,q1) 的主要目的是为了减少计算量,因为 λ\lambdaλZn∗\mathbb{Z}_n^*Zn 里元素的最高阶,即 λ\lambdaλ 为满足 gx≡1g^x \equiv1gx1 (mod nmod \ nmod n) 中的 xxx 可取的最小值(可以用中国剩余定理证明),显然指数越小计算复杂度越小。

    事实上,RSA 加密方案中也可以使用 λ=lcm(p−1,q−1)\lambda = lcm(p-1,q-1)λ=lcm(p1,q1) 来替代 φ(n)\varphi(n)φ(n) 来优化计算。

  • ggg 的选取看上去很复杂,但实际上只是为了满足一些条件。考虑到 gλ≡1g^\lambda \equiv1gλ1 (mod nmod \ nmod n),即可以写成 gλ=1+kng^\lambda = 1+kngλ=1+kn 的形式,那么 gλ mod n2−1n=k\frac{g^{\lambda} \ mod \ n^2 - 1}{n} = kngλ mod n21=k。这里选取 ggg 的条件是满足 kkknnn 互素,因为在后面解密算法中要求 kkk 在模 nnn 意义下的逆元,不互素逆元不存在

    考虑到 ggg 作为公钥是公开的,因此在实际应用中可以直接取 g=1+ng=1+ng=1+n,就符合选取条件了。

4.2 加密算法

对于明文 m∈Znm\in \mathbb{Z}_nmZn,随机选择 r∈Zn∗r\in \mathbb{Z}_n^*rZn,使用公钥进行加密得到密文 ccc 的过程如下:

c=Enc(m)=gmrn mod n2 c = Enc(m)= g^mr^n \ mod \ n^2 c=Enc(m)=gmrn mod n2

当选择 g=1+ng=1+ng=1+n 时,对 (1+n)m(1+n)^m(1+n)m 在模 n2n^2n2 的意义下进行二项式展开,加密过程可以简化为:

c=(1+n)mrn mod n2=(1+mn)rn mod n2 c = (1+n)^mr^n \ mod \ n^2 = (1+mn)r^n \ mod \ n^2 c=(1+n)mrn mod n2=(1+mn)rn mod n2

4.3 解密算法

对于密文 ccc ,使用私钥解密得到明文消息 mmm 的过程如下:

m=Dec(c)=cλ mod n2−1n⋅(gλ mod n2−1n)−1 mod n m = Dec(c) = \frac{c^\lambda \ mod \ n^2 -1}{n} \cdot (\frac{g^\lambda \ mod \ n^2-1}{n})^{-1} \ mod \ n m=Dec(c)=ncλ mod n21(ngλ mod n21)1 mod n


正确性

不妨设 gλ mod n2=1+kng^\lambda \ mod \ n^2 = 1+kngλ mod n2=1+kn,可以计算出:

cλ mod n2=gmλ⋅rnλ=(1+kn)m⋅1=1+kmn c^\lambda \ mod \ n^2= g^{m\lambda}\cdot r^{n\lambda} = (1+kn)^m\cdot 1 = 1 + kmn cλ mod n2=gr=(1+kn)m1=1+kmn

其中 rnλ=1r^{n\lambda} = 1r=1 是因为 rλ=1r^\lambda = 1rλ=1 (mod nmod \ nmod n)。此时在模 nnn 意义下可以验证:

Dec(c)=cλ mod n2−1n⋅(gλ mod n2−1n)−1=km⋅k−1=m Dec(c) = \frac{c^\lambda \ mod \ n^2 -1}{n} \cdot (\frac{g^\lambda \ mod \ n^2-1}{n})^{-1} =km\cdot k^{-1} = m Dec(c)=ncλ mod n21(ngλ mod n21)1=kmk1=m

安全性

Paillier 加密方案的安全性依赖于复杂剩余判断问题,此处即判断一个数是模 n2n^2n2nnn 次剩余是困难的。

如果模 n2n^2n2nnn 次剩余判断是可以快速解决的,那么 Paillier 加密方案就不满足语义安全,即不满足在选择明文攻击(Chosen-Plaintext Attack,CPA)下的安全性。

简单理解就是当攻击方拥有两个明文 m0,m1m_0,m_1m0,m1 时,给出其中一个明文的密文 cbc_bcb,攻击方可以判断出该密文是由哪个明文加密而来的。

一个不严谨的证明:不妨设密文为 c0=gm0r0n mod n2c_0 = g^{m_0}r_0^n \ mod \ n^2c0=gm0r0n mod n2,攻击方可以计算 t0=c0⋅(gm0)−1=r0nt_0 = c_0\cdot (g^{m_0})^{-1}=r_0^nt0=c0(gm0)1=r0n 以及 t1=c0⋅(gm1)−1=gm0−m1⋅r0nt_1 = c_0\cdot (g^{m_1})^{-1}=g^{m_0-m_1}\cdot r_0^nt1=c0(gm1)1=gm0m1r0n。显然 t0t_0t0 是一个模 n2n^2n2nnn 次剩余,而 t1t_1t1 不是(或者大概率不是?没有证明过),攻击方如果可以快速判断 nnn 次剩余,就可以区分出密文由哪个明文加密而来的了。

加法同态性

Paillier 加密方案具有加法同态性,在模 n2n^2n2 意义下,有:

Enc(m0)⋅Enc(m1)=gm0r0n⋅gm1r1n=gm0+m1⋅(r0r1)n=Enc(m0+m1) Enc(m_0)\cdot Enc(m_1)= g^{m_0}r_0^n\cdot g^{m_1}r_1^n = g^{m_0+m_1}\cdot (r_0r_1)^n = Enc(m_0+m_1) Enc(m0)Enc(m1)=gm0r0ngm1r1n=gm0+m1(r0r1)n=Enc(m0+m1)

三、近似同态加密

本文主要介绍一个近似同态加密技术:BGN加密。

1. BGN 加密方案

BGN 加密方案由 Boneh、Goh 和 Nissim 在 2005 年发表[5]^{[5]}[5],该方案构造一个双线性映射,具有无限次加法同态和一次乘法同态操作。


1.1 密钥生成算法

  1. 选取两个不同的大素数 p,qp,qp,q,计算 n=pqn=pqn=pq

  2. 选择两个 nnn 阶循环群 G,G1G,G_1G,G1,取 gggGGG 的一个生成元,构造双线性映射 e:G×G→G1e: G \times G \rightarrow G_1e:G×GG1,满足:

    • 双线性∀a,b∈Zn\forall a,b \in \mathbb{Z}_na,bZn,有:e(ga,gb)=e(g,g)abe(g^a, g^b) = e(g, g)^{ab}e(ga,gb)=e(g,g)ab。也即 ∀u,v∈G\forall u,v \in Gu,vG,有:e(ua,vb)=e(u,v)abe(u^a, v^b) = e(u, v)^{ab}e(ua,vb)=e(u,v)ab

    • 非退化性e(g,g)≠1e(g, g)\ne 1e(g,g)=1。在 BGN 加密中还要求 e(g,g)e(g, g)e(g,g)G1G_1G1 的一个生成元。

    • 可计算性∀u,v∈G\forall u,v \in Gu,vG,存在高效算法计算 e(u,v)e(u,v)e(u,v)

  3. uuuGGG 的另一个生成元,计算 h=uqh = u^qh=uq,则 hhh 为群 GGG 中的 ppp 阶元素,即 hp=upq=un=1h^p=u^{pq}=u^n=1hp=upq=un=1。(模 nnn 意义下)

  4. 公钥为 n,G,G1,e,g,hn,G,G_1,e,g,hn,G,G1,e,g,h,私钥为 ppp

1.2 加密算法

对于明文 m∈Zkm\in \mathbb{Z}_kmZk,随机选择 r∈Znr\in \mathbb{Z}_nrZn,使用公钥进行加密得到密文 ccc 的过程如下:

c=Enc(m)=gmhr mod n c = Enc(m)= g^mh^r \ mod \ n c=Enc(m)=gmhr mod n

注意kkk 应当取一个较小的值才能进行解密,例如 m∈Z1={0,1}m\in \mathbb{Z}_1=\{0,1\}mZ1={0,1}

1.3 解密算法

对于密文 ccc ,使用私钥解密得到明文消息 mmm 的过程如下:

m=Dec(c)=loggpcp m = Dec(c) = log_{g^p}c^p m=Dec(c)=loggpcp

注意mmm 的取值空间较小时才能解密。


正确性

可以验证:

Dec(c)=loggpcp=loggp(gmphrp)=loggpgmp=m Dec(c) = log_{g^p}c^p = log_{g^p}(g^{mp}h^{rp})=log_{g^p}g^{mp} = m Dec(c)=loggpcp=loggp(gmphrp)=loggpgmp=m

由于离散对数的计算困难,只有mmm 的取值空间较小时可以通过枚举解出 mmm 的值。

安全性

BGN 加密方案只有在子群判定问题困难的情况下才是语义安全的,可以参考 Paillier 加密算法的安全性分析。BGN 加密采用 hrh^rhr 来混淆,如果能快速判断 hrh^rhr 是否属于 GGGppp 阶子群,那么攻击方就可以区分出密文由哪个明文加密而来。

加法同态性

BGN 加密方案具有加法同态性,类似于 Paillier 加密方案,在模 nnn 意义下,有:

Enc(m0)⋅Enc(m1)=gm0hr0⋅gm1hr1=gm0+m1⋅hr0+r1=Enc(m0+m1) Enc(m_0)\cdot Enc(m_1)= g^{m_0}h^{r_0}\cdot g^{m_1}h^{r_1} = g^{m_0+m_1}\cdot h^{r_0+r_1} = Enc(m_0+m_1) Enc(m0)Enc(m1)=gm0hr0gm1hr1=gm0+m1hr0+r1=Enc(m0+m1)

乘法同态性

BGN 加密方案具有一次乘法同态性,不妨设 h=uq=gaqh = u^q=g^{aq}h=uq=gaqg1=e(g,g)g_1=e(g,g)g1=e(g,g)h1=e(g,h)=e(g,gaq)=g1aqh_1=e(g,h)=e(g,g^{aq})=g_1^{aq}h1=e(g,h)=e(g,gaq)=g1aq。随机取 r∈Znr\in \mathbb{Z}_nrZn,则乘法同态操作为:

e(c0,c1)⋅h1r=e(gm0hr0,gm1hr1)⋅h1r=e(gm0+aqr0,gm1+aqr1)⋅h1r=g1m0m1+m0aqr1+m1aqr0+aaqqr0r1⋅h1r=g1m0m1⋅g1aq(m0r1+m1r0+aqr0r1)⋅h1r=g1m0m1⋅h1m0r1+m1r0+aqr0r1+r=EncG1(m0m1) \begin{align} e(c_0,c_1)\cdot h_1^r &=e(g^{m_0}h^{r_0}, g^{m_1}h^{r_1})\cdot h_1^r \nonumber \\ &=e(g^{m_0+aqr_0},g^{m_1+aqr_1})\cdot h_1^r \nonumber \\ &=g_1^{m_0m_1+m_0aqr_1+m_1aqr_0+aaqqr_0r_1} \cdot h_1^r \nonumber \\ &=g_1^{m_0m_1}\cdot g_1^{aq (m_0r_1+m_1r_0+aqr_0r_1)}\cdot h_1^r \nonumber \\ &=g_1^{m_0m_1}\cdot h_1^{m_0r_1+m_1r_0+aqr_0r_1 +r} \nonumber \\ &= Enc_{G_1}(m_0m_1) \nonumber \end{align} e(c0,c1)h1r=e(gm0hr0,gm1hr1)h1r=e(gm0+aqr0,gm1+aqr1)h1r=g1m0m1+m0aqr1+m1aqr0+aaqqr0r1h1r=g1m0m1g1aq(m0r1+m1r0+aqr0r1)h1r=g1m0m1h1m0r1+m1r0+aqr0r1+r=EncG1(m0m1)

最终可以获得群 G1G_1G1m0m1m_0m_1m0m1 的加密密文,由于乘法同态使用双线性映射将密文空间从 GGG 转移至 G1G_1G1,且该转移只能进行一次,因此乘法同态操作只有一次。值得注意的是在转移后仍然支持无限次加法同态操作。


下一部分将介绍 Bootstrapping 和 DGHV、BGV 全同态加密方案。

参考文献

  • [1] R. L. Rivest, A. Shamir, and L. Adleman, “A method for obtaining digital signatures and public-key cryptosystems,” Commun. ACM, vol. 21, no. 2, pp. 120–126, Feb. 1978.

  • [2] S. Goldwasser and S. Micali, “Probabilistic encryption & how to play mental poker keeping secret all partial information,” in Proceedings of the fourteenth annual ACM symposium on Theory of computing – STOC ’82, San Francisco, California, United States: ACM Press, 1982, pp. 365–377.

  • [3] T. Elgamal, “A public key cryptosystem and a signature scheme based on discrete logarithms,” IEEE Transactions on Information Theory, vol. 31, no. 4, pp. 469–472, Jul. 1985.

  • [4] P. Paillier, “Public-Key Cryptosystems Based on Composite Degree Residuosity Classes,” in Advances in Cryptology — EUROCRYPT ’99, J. Stern, Ed., Berlin, Heidelberg: Springer, 1999, pp. 223–238.

  • [5] D. Boneh, E.-J. Goh, and K. Nissim, “Evaluating 2-DNF Formulas on Ciphertexts,” in Theory of Cryptography, J. Kilian, Ed., Berlin, Heidelberg: Springer, 2005, pp. 325–341.


本文为作者在学习相关知识时的一种记录,便于以后的回顾。作者并没有系统地学习过密码学,因此在表述上可能会存在不严谨甚至出错的地方,文章仅供参考,欢迎大家与我交流,一起进步!

其他平台:

  • 知乎(Totoro):https://www.zhihu.com/people/totoro-14-60
  • B站(Totoro_134):https://space.bilibili.com/279377771
  • Github(Totoro134):https://github.com/Totoro134
  • 公众号(知识长生所)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐