paillier加密算法是一种公钥加密算法,基于复合剩余类的困难问题。满足加法同态,即密文相乘等于明文相加:D(E(m1)·E(m2))=m1+m2。这里详细介绍其加密解密是如何推导的,需要具备数论、代数系统、模运算的相关知识,同时理解起来可能需要多阅读几遍并加以思考。
先将密钥生成和加解密过程罗列便于直观看
截图来源于:https://blog.csdn.net/sinianluoye/article/details/82855059
加密过程
在进行加解密之前,必须先产生可以用来加密的公钥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·rn mod 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。
计算实例 |
公式 |
λ(77) = lcm(6, 10) = 30 L(565230mod 5929) = L(3928) L(3928) = (3928 – 1)/77 = 3927/77 = 51 |
定义 L(u) = (u – 1)/n 计算L(gλ(n)mod n2)= k |
图2:已知n2=5926,g=5652计算L(gλ(n) mod n2) |
gλ(n) mod n2的结果可以看作一个大于等于0,严格小于n2的数,因此 gλ(n) mod n2 -1 除以n之后的结果k大于等于0,严格小于n,也就是说k∈Zn。因为n=p·q,只要k mod n的结果不是p或q的倍数,k会有逆,所以k∈$ℤ^{*}_{n}$。这个性质是之前在加密阶段提到的g需要符和未定义的性质。如果 gλ(n) mod n2的结果模n的值k是p或q的倍数,这个g必须被丢弃。在发布g之前先检查g是否符合要求,如果不符合就舍弃重新选择。现在我们假设随机选择的g符合条件即g∈$ℤ^{*}_{n^{2}}$,g的阶∈$ℤ^{*}_{n^{2}}$,k不是p或q的倍数(k存在模n的逆),接下来就可以计算µ ≡ k-1mod n,如图3所示。在解密过程中,公钥(n, g)相同的情况下,计算得到的µ值总是相同的,也是必不可少的。
计算实例 |
公式 |
µ ≡ 51-1≡74 mod 77 |
计算 µ ≡ k-1mod n |
图3:µ,L(gλ(n) mod n2)在$ℤ^{*}_{n}$中的逆在 解密过程中非常重要。这里n=77,L(gλ(n) mod n2) |
所有人在解密过程中必须计算m ≡ L(gλ(n) mod n2)·µ mod n,如图4所示。
计算实例 |
公式 |
m ≡ L(462430≡ 4852mod 5929)·74 mod 77 m ≡ 63·74 ≡ 4662 ≡ 42 mod 77 |
m ≡ L(cλ(n) mod n2)·µ mod n |
图4:paillier加密系统解密过程。 这里n = 77, c ≡ 4624 mod n,µ ≡ 74 mod n |
加解密中的数学原理
为了理解解密过程,我们首先介绍一个公式
$ε_{g}:ℤ_{n} * ℤ^{*}_{n}\rightarrow ℤ^{*}_{n^{2}}$
$ε_{g}(x, y)\rightarrow g^{x}*y^{n} mod n^{2}$
定义εg(m, r) 是使用随机数对m进行加密的加密公式。回想一下在加密阶段选择g的时候,我们要求g模n2的阶必须是n的倍数。如果g符合这个条件,则εg是双射的。我们将引用下边的引理来证明这个结论。
引理:两个阶相同的有限集A、B构成的函数f:A$\rightarrow$ B是满射的当且仅当这个函数是单射的。
定理:如果g的阶是n的非零倍数,则对于 εg(x, y) ≡ gx·yn mod n2 来说εg是双射的。
证明:假设g的阶是n的非零倍数。我们知道|$ℤ^{*}_{n^{2}}$|=φ(n2) = n·φ(n)=| ℤn x $ℤ^{*}_{n}$|,意味着$ℤ^{*}_{n^{2}}$和 ℤn x $ℤ^{*}_{n}$拥有相同个数。基于上边的引理如果εg是单射的,它也是满射的。因此,我们证明了εg是单射的可以充分的证明它也是双射的。
假设 gx1·y1n≡gx2·y2n·mod n2。我们可以得到 gx1-x2·(y1/y2)n ≡ 1·mod n2。等式两边同时取λ(n)次幂,得到 gλ(n)·(x1-x2)·(y1/y2)n·λ(n) ≡ 1·mod n2。卡迈克尔定理表明$ℤ^{*}_{n^{2}}$中的元素,取λ(n)次幂模n与1同余。该定理同时也表明$ℤ^{*}_{n^{2}}$中的元素,取n·λ(n)次幂模n2与1同余。y1和y2-1都是$ℤ^{*}_{n^{2}}$中的元素,所以他们的乘积y1/y2也是$ℤ^{*}_{n^{2}}$中的元素,由此我们可以得到 (y1/y2)n·λ(n) ≡ 1·mod n2,所以 gλ(n)·(x1-x2)·(y1/y2)n·λ(n) ≡ gλ(n)·(x1-x2) ≡ 1·mod n2。
以上证明表示 λ(n)·(x1-x2) 是g的阶的倍数。最开始的时候我们已经假设g的阶是n的非零倍数,所以 λ(n)·(x1-x2) 也是n的倍数。由于 λ(n)·(x1-x2) 可以被n整除,并且GCD(λ(n), n)=1,我们可以得出n整除x1-x2或者说x1-x2模n与0同余。而且x1和x2是 ℤn中的元素,它们的模n同余可以保证他们是相等的。
让我们再回到方程式 gx1-x2·(y1/y2)n ≡ 1·mod n2,当x1=x2时,我们得到 (y1/y2)n ≡ 1·mod n2,继而y1n≡y2n。当y1与y2模n同余时,上式成立。
所以根据y1,y2 ∈ $ℤ^{*}_{n}$,我们得到了x1=x2。
这意味着,给出任何一个属于$ℤ^{*}_{n^{2}}$的元素w,当n选定之后,选择一个符合要求的g,加密结果εg(x, y)≡w mod n2是独一无二的。为了便于标注,我们指定εg(x, y) ≡ gx·yn≡ w mod n2,定义[w]g为ℤn中唯一与之对应的元素x, 即[w]g =x。
因为εg可以映射到$ℤ^{*}_{n^{2}}$中所有元素,而且g本身也是$ℤ^{*}_{n^{2}}$中的一个元素,因此我们可以找到$ℤ^{*}_{n^{2}}$中另一个阶是n的非零倍数的元素t能够通过相同计算得到g。
ℤn2中元素(1+n)的幂 |
基于(1+n)∈$ℤ^{*}_{n^{2}}$: (1+n)2≡1+2n+n2≡1+2n mod n2 (1+n)3≡1+3n+n3≡1+3n mod n2 (1+n)v≡1+v·n+[n的高次幂]≡1+v·n mod n2
|
图5:(1+n)v和1+v·n模n同余 |
如图5所示,(1+n)n≡1+n·n≡1 mod n2。很明显,n本身是n的一倍,也是(1+n)的阶,并且(1+n)n-1是它在$ℤ^{*}_{n^{2}}$中的逆(表明(1+n)∈$ℤ^{*}_{n^{2}}$)。(1+n)符合t要求的性质,所以我们可以计算[g](1+n)。也就是说g≡ε(1+n)(t,z)≡(1+n)t·zn mod n2,t=[g](1+n)。
当我们加密信息m时,密文 c≡εg(m, r) ≡ gm·rn mod n2,我们之前刚刚证明g可以表示为g≡ε(1+n)([g](1+n),z)≡(1+n)[g](1+n)·zn mod n2。使用g的表达式来代替g,我们可以得到:
c≡gm·rn≡[(1+n)[g](1+n)·zn]m·rn mod n2
≡(1+n)m[g](1+n)·zmn·rn mod n2
≡(1+n)m[g](1+n)·(zm·r)n mod n2
由z∈$ℤ^{*}_{n}$, 可知zm∈$ℤ^{*}_{n}$,由r∈$ℤ^{*}_{n}$,可知zm·r∈$ℤ^{*}_{n}$,所以
c≡ε(1+n)(m·[g](1+n), zm·r) mod n2
c可以表示为[c](1+n)≡m·[g](1+n),即m≡[c](1+n)·{[g](1+n)}-1 mod n([c](1+n)是ℤn中元素,所以模n2与模n同余)。
由上述结果可知,无论c为何值,[g](1+n)的逆是一个定值。解密c需要计算[c](1+n),并将结果与定值[g](1+n)的逆相乘并模n。在解密时,我们计算了µ ≡ L(gλ(n)mod n2)-1 mod n,并声明这是一个和m,c或者r都无关的对于解密来说很必要的定值。结合上述证明我们有了µ的另一种形式 µ≡(L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n)}-1 mod n。现在让我们看看密文如何回到明文。
gλ(n) mod n2:
gλ(n) ≡ [(1+n)[g](1+n)·zn]λ(n)·znλ(n) mod n2
因为z∈$ℤ^{*}_{n^{2}}$,由卡迈克尔定理可知znλ(n) ≡ 1 mod n2。可得:
gλ(n) ≡ (1+n)λ(n)[g](1+n) mod n2
≡1+λ(n)·[g](1+n)·n+[n的高次幂] mod n2
≡1+λ(n)·[g](1+n)·n mod n2
现在将gλ(n) mod n2 代入L(u)(L(u)=(u-1)/n):
L(gλ(n) mod n2)≡L(1+λ(n)·[g](1+n)·n)mod n
≡{1+λ(n)·[g](1+n)·n-1}/n mod n
≡{λ(n)·[g](1+n)·n}/n mod n
≡λ(n)·[g](1+n) mod n
所以 L(gλ(n)mod n2) ≡ λ(n)·[g](1+n) mod n,µ ≡ L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n)}-1 mod n,我们同样可以用卡迈克尔定理简化L(cλ(n)mod n2):
cλ(n) mod n2:
cλ(n)≡[(1+n)[c](1+n)·dn]λ(n) mod n2
≡[(1+n)[c](1+n)·dnλ(n) mod n2
≡(1+n)[c](1+n) mod n2
≡1+λ(n)·[c](1+n)·n+[n的高次幂] mod n2
≡1+λ(n)·[c](1+n)·n mod n2
所以:
L(cλ(n) mod n2)≡L(1+λ(n)·[c](1+n)·n) mod n
≡{1+λ(n)·[c](1+n)·n-1}/n mod n
≡{λ(n)·[c](1+n)·n}/n mod n
≡λ(n)·[c](1+n) mod n
可得:µ ≡ L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n) mod n,L(cλ(n) mod n2) ≡ λ(n)·[c](1+n) mod n。即L(cλ(n) mod n2)·µ ≡ λ(n)·[c](1+n)·λ(n)-1·[g](1+n)-1 ≡ [c](1+n)·[g](1+n)-1 ≡ m mod n。
我们注意到,对于给定公钥(n,g),µ总是相等的,只需要计算一次。意味着解密过程包含一个指数幂模n2,和固定值L(µ)相乘的结果模n。使得解密变成一个计算复杂度是指数幂模n2相对简单的过程。
paillier加密系统的加法同态
通过paillier加密系统加密的两个消息相乘的结果解密后得到的是两个消息相加的结果。
两个密文c1 ≡ gm1·r1n mod n2 , and c2 ≡ gm2·r2n mod n2
c1·c2≡ gm1·gm2·r1n ·r2n mod n2⇒ c1·c2 ≡gm1·gm2·r1n ·r2n ≡ gm1+m2·(r1·r2)nmod n2
r1和r2都是$ℤ^{*}_{n^{2}}$中元素,,因此r1·r2也属于$ℤ^{*}_{n^{2}}$,并且具有相同的性质,所以此处的值是r1还是r2亦或是ri并不重要,c1·c2可以看作是m=m1+m2加密的密文,c1·c2的解密结果为m。
总结
以上原理的讲解比较复杂与繁琐,这里总结一下上文中加解密推导的主要思路。
1.参数选择要求
2.加密实例
3.证明双射的条件
4.继而证明明文与密文是一一对应的
5.找到密文的原射,用以代入,可以推出一个解密得到的明文的表达式子
6.由于g也属于密文空间内,找到g的原射,把g用原射表示代入
7.把g的原射表达式代入µ,得到µ的另一种表达式
8.用正常的解密方式把之前的各种代换代入,得到和之前第5步找到的解密明文表达方式相等,证明解密方式是正确的。
如有我理解的不正确的地方,欢迎加以指正。