同态加密之Paillier算法
Posted 林立可
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同态加密之Paillier算法相关的知识,希望对你有一定的参考价值。
同态加密之Paillier算法
0,背景介绍
同态加密,即原来在明文上的运算操作,经过同态加密后在密文上同样可以进行。一般有半同态和全同态加密之分:
-
半同态加密 (Partial Homomorphic Encryption, PHE):只支持某些特定的运算法则 f ,PHE 的优点是原理简单、易实现,缺点是仅支持一种运算(加法或乘法);
-
层次同态加密(Liveled HE,LHE):一般支持有限次数的加密算法,LHE 的优点是同时支持加法和乘法,并且因为出现时间比 PHE 晚,所以技术更加成熟、一般效率比 FHE 要高很多、和 PHE 效率接近或高于 PHE,缺点是支持的计算次数有限。
-
全同态加密 (Fully Homomorphic Encryption, FHE):支持无限次的任意运算法则 f,FHE 有以下类别:基于理想格的 FHE 方案、基于 LWE/RLWE 的 FHE 方案等等。FHE 的优点是支持的算子多并且运算次数没有限制,缺点是效率很低,目前还无法支撑大规模的计算。
第一个满足加法和乘法同态的同态加密方法直到2009年才由Craig Gentry提出。目前来说,全同态加密算法性能较差,应用较少。比较常用的是半同态加密算法,实现方式有 RSA (乘法同态)、Elgamal、Paillier (加法同态)等。
1,Paillier算法介绍
密钥生成
- 随机选择两个质数 p 和 q 满足 gcd(pq,(p-1)(q-1)) =1,这个条件保证了 p 和 q 的长度相等;
- 计算 N=pq 和 λ=lcm(p−1,q−1),其中 lcm 表示最小公倍数;
- 随机选择 g∈Z∗N^2,满足 g c d ( L ( g λ m o d N 2 ) , N ) = 1 gcd(L(g^λ mod N^2),N)=1 gcd(L(gλmodN2),N)=1,后面会发现这里的 g=n+1。其中 Z 表示整数,下标表示该整数集合里有多少个元素;L(x)= x − 1 N \\fracx-1N Nx−1, μ = ( L ( g λ m o d N 2 ) ) − 1 m o d N μ = (L(g^λ mod N^2))^-1 \\mod N μ=(L(gλmodN2))−1modN;
- 公钥为 (N,g);
- 私钥为(λ,μ)。
加密过程
对于任意明文消息 m ∈ Z N m∈Z_N m∈ZN,任意选择一随机数 r ∈ Z N ∗ r∈Z_N^* r∈ZN∗,计算得到密文 c :
c = E ( m ) = g m r N m o d N 2 c=E(m)=g^mr^N \\mod N^2 c=E(m)=gmrNmodN2
解密过程
对于密文$ c∈Z_N2*$,计算得到明文 m :
m = D ( c ) = L ( c λ m o d N 2 ) L ( g λ m o d N 2 ) m o d N = L ( c λ m o d N 2 ) ∗ μ m o d N m=D(c)=\\fracL(c^λ mod N^2) L(g^λmod N^2) \\mod N=L(c^λ mod N^2)*μ \\mod N m=D(c)=L(gλmodN2)L(cλmodN2)modN=L(cλmodN2)∗μmodN
加法同态的性质
对于任意明文 m 1 , m 2 ∈ Z N m1,m2∈Z_N m1,m2∈ZN和任意 r 1 , r 2 ∈ Z N ∗ r1,r2∈Z_N^* r1,r2∈ZN∗,对应密文 c 1 = E [ m 1 , r 1 ] , c 2 = E [ m 2 , c 2 ] c1=E[m1,r1],c2=E[m2,c2] c1=E[m1,r1],c2=E[m2,c2]满足:
c 1 ⋅ c 2 = E [ m 1 , r 1 ] ⋅ E [ m 2 , r 2 ] = g m 1 + m 2 ⋅ ( r 1 ⋅ r 2 ) N m o d N 2 c_1 \\cdot c_2=E\\left[m_1, r_1\\right] \\cdot E\\left[m_2, r_2\\right]=g^m_1+m_2 \\cdot\\left(r_1 \\cdot r_2\\right)^N \\bmod N^2 c1⋅c2=E[m1,r1]⋅E[m2,r2]=gm1+m2⋅(r1⋅r2)NmodN2
解密后得到:
D [ c 1 ⋅ c 2 ] = D [ E [ m 1 , r 1 ] ⋅ E [ m 2 , r 2 ] m o d N 2 ] = m 1 + m 2 m o d N D\\left[c_1 \\cdot c_2\\right]=D\\left[E\\left[m_1, r_1\\right] \\cdot E\\left[m_2, r_2\\right] \\bmod N^2\\right]=m_1+m_2 \\bmod N D[c1⋅c2]=D[E[m1,r1]⋅E[m2,r2]modN2]=m1+m2modN
即我们得到了: c 1 ∗ c 2 = m 1 + m 2 c1*c2=m1+m2 c1∗c2=m1+m2。密文乘等于明文加。
通过分析发现,密文乘时,含有的明文是在指数上相加的,所以解密后就可以得到明文相加结果。
为什么叫加法同态呢?我们一般希望密文计算的结果和我们明文计算的结果相同,所以对于密文上是如何计算的不做要求。这时我们在明文上实现了加法的目的,就叫它加法同态。由此还扩展出了同态加和标量乘的性质。
算法理论
由上式结论不难知道: μ = λ − 1 μ=λ^-1 μ=λ−1(g=n+1)。此外,还有 r λ n m o d N 2 = 1 r^λn\\mod N^2=1 rλnmodN2=1。
具体算法理论证明,参见:Paillier Cryptosystem理论与实践
2,pyhtotn—paillier算法演示
我们使用了 Python 实现的 paillier 算法来演示一些性质。你可以使用如下命令安装对应库:
pip install phe
具体使用可以参考:https://python-paillier.readthedocs.io/en/latest/usage.html
下面,我们使用 phe 演示 paillier 的同态加和标量乘的性质:
from phe import paillier # 开源库
import time # 做性能测试
# 测试paillier参数
print("默认私钥大小:",paillier.DEFAULT_KEYSIZE) #2048
# 生成公私钥
public_key,private_key = paillier.generate_paillier_keypair()
# 测试需要加密的数据
message_list = [3.1415926,100,-4.6e-12]
# 加密操作
time_start_enc = time.time()
encrypted_message_list = [public_key.encrypt(m) for m in message_list]
time_end_enc = time.time()
print("加密耗时ms:",time_end_enc-time_start_enc)
# 解密操作
time_start_dec = time.time()
decrypted_message_list 经典同态加密算法Paillier解读 - 原理实现和应用