paillier加密算法是一种公钥加密算法,基于复合剩余类的困难问题。满足加法同态,即密文相乘等于明文相加:D(E(m1)·E(m2))=m1+m2。这里详细介绍其加密解密是如何推导的,需要具备数论、代数系统、模运算的相关知识,同时理解起来可能需要多阅读几遍并加以思考。
先将密钥生成和加解密过程罗列便于直观看
加密过程
在进行加解密之前,必须先产生可以用来加密的公钥n和g。n是两个大小相近的两个大素数的乘积:n=p·q。g是$ℤ_{n^{2}}$中的半随机数,同时g的阶必须在$ℤ^{*}_{n^{2}}$中并且能被n整除。由于g必须符合一些特殊性质(我们将在解密部分提出)所以$ℤ^{*}_{n^{2}}$中会有很少一部分元素不能用作g,意味着g是一个半随机数。为了简单计算,我们先选取两个小素数p=7,q=11计算得到n=p·q=77。从$ℤ^{*}_{n^{2}}$中选择g(g的阶必须是$ℤ^{*}_{n^{2}}$中元素并且是n的倍数。除此之外,g需要满足的另一个性质将会在解密时详细描述),在这里我们先选择5652作为g。因为g模n2的阶是2310且是77的倍数,并且在$ℤ^{*}_{n^{2}}$中。那么g所需要的包括未清楚定义的所有性质将会被满足。至此,我们找到了用来实际加解密运算过程的公钥(n,g)。随着公钥发布,任何人都能使用公钥加密数据并将密文传给私钥持有者。整个过程可用图一表示。
计算实例
公式
明文m=42
随机数r=23
c ≡ (5652)42·(23)77mod 5929
≡ (4019)(606) ≡ 4624 mod 5929
创建明文消息m,m∈ℤn
随机选择非零整数 r∈$ℤ^{*}_{n}$
计算密文c ≡ gm·rnmod n2
图1:n = 77, g = 5652时paillier系统加密
c是加密信息,私钥持有者解密时无需了解r的值。
解密过程
在已知p,q和g的情况下,任何人都可以将收到的加密消息c解密。我们注意到在已知p,q的情况下,卡迈克尔公式λ(n) = lcm[(p – 1)(q – 1)]很容易计算。我们也注意到,如果g ∈ $ℤ_{n^{2}}$,就像我们之前选作公钥的g,卡迈克尔定理保证gλ(n) ≡ 1 mod n成立。卡迈克尔定理表明如果两个整数a和n互质,那么关系式 aλ(n)≡ 1 mod n。因为g是模n2的单元,显然与n2互质,意味着g与n也是互质的。在这个基础上,卡迈克尔定理成立。解密时,忽略密文c的值,对于所有使用公钥对(n, g)进行的解密,计算gλ(n)mod n2都是必要的。gλ(n)mod n2计算得到的值是$ℤ_{n^{2}}$中的一个元素,由卡迈克尔定理可知,该值 ≡ 1 mod n。如果我们从结果值中减1得到的值可以被n整除。计算过程如图2