背景
对必要的数论知识需要补充的,需要先阅读 公钥密码体制-Paillier (一) 。
也可以先阅读维基上对 Paillier 的说明。
算法
密钥生成
- 随机选择两个大素数 p p p 和 q q q,保证 g c d ( p q , ( p − 1 ) ( q − 1 ) ) = 1 gcd(pq, (p-1)(q-1))=1 gcd(pq,(p−1)(q−1))=1;
- 计算 n = p q n=pq n=pq 和 λ ( n ) = l c m ( p − 1 , q − 1 ) \lambda(n)=lcm(p-1, q-1) λ(n)=lcm(p−1,q−1), l c m lcm lcm 是取最小公倍数;
- 在 Z n 2 ∗ \mathbb{Z_{n^2}^*} Zn2∗随机选择一个整数 g g g,即 g ∈ Z n 2 ∗ g\in\mathbb{Z}_{n^2}^* g∈Zn2∗,( Z n 2 ∗ \mathbb{Z}_{n^2}^* Zn2∗ 表示在 n 2 n^2 n2 剩余类中,与 n 2 n^2 n2 互素的数);
- 对于刚才选择的
g
g
g,要确保
n
n
n 可以整除
g
g
g 的阶。可以利用下面的模运算检验
g
g
g 是否合格:
μ
=
(
L
(
g
λ
m
o
d
n
2
)
)
−
1
m
o
d
n
\mu=(L(g^{\lambda}\,mod\,n^2))^{-1}\,mod\,n
μ=(L(gλmodn2))−1modn, 其中
L
(
x
)
=
x
−
1
n
L(x)=\frac{x-1}{n}
L(x)=nx−1。其实就是相当于检测
L
(
g
λ
m
o
d
n
2
)
L(g^{\lambda}\,mod\,n^2)
L(gλmodn2) 在模
n
n
n 的情况是否有逆元。如果选择的
g
g
g 可以保证可以被
n
n
n 整除,它其实是可以保证有逆元的要求的;
注意:公式 a b \frac{a}{b} ba,不是模运算乘法中的 a a a 乘以 b b b 的倒数,而是普通算法运算的 a a a 除以 b b b。 - 使用 ( n , g ) (n,g) (n,g) 作为公钥,使用 ( λ , μ ) (\lambda, \mu) (λ,μ) 作为私钥。
快速生成密钥
如果使用相同长度的
p
,
q
p,q
p,q,可以快速生成密钥。比如选
g
=
n
+
1
g=n+1
g=n+1,因为很明显
n
+
1
∈
Z
n
2
∗
n+1 \in \mathbb{Z}_{n^2}^*
n+1∈Zn2∗。
(
1
+
n
)
n
≡
1
+
n
∗
n
≡
1
m
o
d
n
2
(1+n)^n\equiv1+n*n\equiv1\,mod\,n^2
(1+n)n≡1+n∗n≡1modn2,
n
n
n 是 1+n 模
n
2
n^2
n2 的阶,
n
n
n 本身也是
n
n
n 的一倍。此时的
g
g
g 满足要求。
我们也可以算一下,
μ
=
(
L
(
g
λ
m
o
d
n
2
)
)
−
1
m
o
d
n
\mu=(L(g^{\lambda}\,mod\,n^2))^{-1}\,mod\,n
μ=(L(gλmodn2))−1modn。
由于
λ
(
n
)
=
ϕ
(
n
)
=
(
p
−
1
)
∗
(
q
−
1
)
\lambda(n) = \phi(n)=(p-1)*(q-1)
λ(n)=ϕ(n)=(p−1)∗(q−1),
g
=
n
+
1
g=n+1
g=n+1,所以
g
λ
m
o
d
n
2
=
(
1
+
n
)
λ
m
o
d
n
2
≡
(
1
+
λ
∗
n
)
m
o
d
n
2
=
1
+
λ
∗
n
g^{\lambda}\,mod\,n^2=(1+n)^\lambda\,mod\,n^2\equiv(1+\lambda*n)\,mod\,n^2=1+\lambda*n
gλmodn2=(1+n)λmodn2≡(1+λ∗n)modn2=1+λ∗n。(因为
1
+
λ
∗
n
1+\lambda*n
1+λ∗n 小于
n
2
n^2
n2)。
所以
L
(
g
λ
m
o
d
n
2
)
=
L
(
1
+
λ
∗
n
)
=
λ
L(g^{\lambda}\,mod\,n^2)=L(1+\lambda*n)=\lambda
L(gλmodn2)=L(1+λ∗n)=λ。
所以
μ
=
ϕ
(
n
)
−
1
m
o
d
n
\mu=\phi(n)^{-1}\,mod\,n
μ=ϕ(n)−1modn。即
u
u
u 为
ϕ
(
n
)
\phi(n)
ϕ(n) 在模
n
n
n 下的逆元。
加密
- 设明文为 m m m , m m m 满足 0 ≤ m ≤ n 0\leq\,m\leq\,n 0≤m≤n;
- 选择一个随机数 r r r,满足 0 < r < n 0 < r < n 0<r<n ,严格地说 r ∈ Z n ∗ r\in\mathbb{Z}_n^* r∈Zn∗;
- 计算密文: c = g m ∗ r n m o d n 2 c=g^m*r^n\,mod\,n^2 c=gm∗rnmodn2;
解密
- c c c 为要被解密的密文,其实 c ∈ Z n 2 ∗ c\in\,\mathbb{Z}_{n^2}^* c∈Zn2∗(可被证明);
- 计算明文为 m = L ( c λ m o d n 2 ) ∗ μ m o d n m=L(c^\lambda\,mod\,n^2)*\mu\,mod\,n m=L(cλmodn2)∗μmodn。
算法原理
背景
我们要先看看加密过程,从集合映射角度发生了什么事情。我们先看一下映射公式:
ε
g
:
Z
n
∗
Z
n
∗
→
Z
n
2
∗
\varepsilon_g:\mathbb{Z}_n*\mathbb{Z}_n^*\rightarrow\mathbb{Z}_{n^2}^*
εg:Zn∗Zn∗→Zn2∗
ε
g
(
x
,
y
)
→
g
x
∗
y
n
m
o
d
n
2
\varepsilon_g(x,y)\rightarrow\,g^x*y^n\,mod\,n^2
εg(x,y)→gx∗ynmodn2, (
x
∈
Z
n
,
y
∈
Z
n
∗
,
g
和
n
满
足
密
钥
生
成
时
的
要
求
)
x\in\mathbb{Z}_n, y\in\mathbb{Z}_n^*,g和n 满足密钥生成时的要求)
x∈Zn,y∈Zn∗,g和n满足密钥生成时的要求)
描述为,从
Z
n
\mathbb{Z}_n
Zn 集合中取一个元素
x
x
x, 从
Z
n
∗
\mathbb{Z}_n^*
Zn∗ 集合中取出一个元素
y
y
y,使用映射函数
g
x
∗
y
n
m
o
d
n
2
g^x*y^n\,mod\,n^2
gx∗ynmodn2 映射到集合
Z
n
2
∗
{Z}_{n^2}^*
Zn2∗ 中。
可以证明,当
g
g
g 满足模
n
2
n^2
n2 的阶是
n
n
n 的整数倍时,上述映射是双射的。
引理:两个具有相同阶的有限集合 A, B,构成的函数
f
:
A
→
B
f:A\rightarrow\,B
f:A→B是双身的,当且仅当这个函数是单身的。
证明:由于
∣
Z
n
2
∗
∣
=
ϕ
(
n
2
)
=
n
∗
ϕ
(
n
)
=
∣
Z
n
∗
Z
n
∗
∣
|\mathbb{Z}_{n^2}^*|=\phi(n^2)=n*\phi(n)=|\mathbb{Z}_n*\mathbb{Z}_n^*|
∣Zn2∗∣=ϕ(n2)=n∗ϕ(n)=∣Zn∗Zn∗∣,这说明两个集合具有相同的阶。所以我们只用证明映射函数是单射的。即不同
x
,
y
x,y
x,y 对使用映射函数计算后得到不同值。
假设若存在,
x
1
,
y
1
,
x
2
,
y
2
x_1,y_1,x_2,y_2
x1,y1,x2,y2,使
g
x
1
y
1
n
=
g
x
2
y
2
n
m
o
d
n
2
g^{x_1}y_1^n\,=g^{x_2}y_2^n\,mod\,n^2
gx1y1n=gx2y2nmodn2(两对数映射到相同的数)。那么
g
x
1
−
x
2
(
y
1
y
2
)
n
=
1
m
o
d
n
2
g^{x_1-x_2}(\frac{y_1}{y_2})^n=1\,mod\,n^2
gx1−x2(y2y1)n=1modn2 (因为可以证明
g
x
y
n
g^xy^n
gxyn 与
n
2
n^2
n2 互质,即存在乘法逆元)。于是
g
λ
(
x
1
−
x
2
)
(
y
1
y
2
)
λ
n
=
1
m
o
d
n
2
g^{\lambda(x_1-x_2)}(\frac{y_1}{y_2})^{\lambda\\n}=1\,mod\,n^2
gλ(x1−x2)(y2y1)λn=1modn2,根据 卡迈克尔函数的性质 ,
(
y
1
y
2
)
λ
n
=
1
m
o
d
n
2
(\frac{y_1}{y_2})^{\lambda\\n}=1\,mod\,n^2
(y2y1)λn=1modn2(
y
1
,
y
2
−
1
y_1,y_2^{-1}
y1,y2−1 都是
Z
n
2
∗
\mathbb{Z}_{n^2}^*
Zn2∗ 的元素,所以乘积也和
n
2
n^2
n2 互质),因此
g
λ
(
x
1
−
x
2
)
=
1
m
o
d
n
2
g^{\lambda(x_1-x_2)}=1\,mod\,n^2
gλ(x1−x2)=1modn2。这说明
λ
∗
(
x
1
−
x
2
)
\lambda*(x_1-x_2)
λ∗(x1−x2) 是
g
g
g 的阶的倍数,又由于
g
g
g 的阶是
n
n
n 的整数倍,所以
n
∣
λ
∗
(
x
1
−
x
2
)
n|\lambda*(x_1-x_2)
n∣λ∗(x1−x2),又因为
g
c
d
(
λ
,
n
)
=
1
gcd(\lambda, n) = 1
gcd(λ,n)=1 且
x
1
,
x
2
∈
Z
x_1,x_2\in\mathbb{Z}
x1,x2∈Z,所以
x
1
=
x
2
x_1=x_2
x1=x2。代入上面的式子得到
(
y
1
y
2
)
n
=
1
m
o
d
n
2
(\frac{y_1}{y_2})^n=1\,mod\,n^2
(y2y1)n=1modn2,那么说明
y
1
y
2
\frac{y_1}{y_2}
y2y1 的阶
k
k
k 可以整除
n
n
n 即
k
∣
n
k|n
k∣n,又因为
k
∣
λ
k|\lambda
k∣λ,
g
c
d
(
λ
,
n
)
=
1
gcd(\lambda,n) =1
gcd(λ,n)=1,所以说
k
=
1
k=1
k=1。只有
y
1
=
y
2
y_1=y_2
y1=y2 时,上式才可能成立。
所以说不同的
x
,
y
x,y
x,y 对使用映射函数计算后得到不同值。即映射是单身的,又因为两个集合阶数相同,所以它们是双射的。
这说明,当选择了一个符号条件的
g
g
g 后,给定任何一个属于
Z
n
2
∗
\mathbb{Z}_{n^2}^*
Zn2∗ 的元素
w
w
w ,使用上述的映射函数,只有一组
(
x
,
y
)
(x,y)
(x,y) 与之对应。
我们定义一个符号
[
w
]
g
=
x
[w]_g=x
[w]g=x,表示,在使用符合条件的
g
g
g 的情况下,表示与
w
w
w 对应的
Z
n
\mathbb{Z}_n
Zn 元素组成的集合里的值。
由于
g
∈
Z
n
2
∗
g\in\mathbb{Z}_{n^2}^*
g∈Zn2∗,所以
g
g
g 应该也有个与之对应的元素,又如“快速生成密钥”一节所说,
n
+
1
n+1
n+1 也是满足上述条件的一个
g
,
g^,
g, (此处的
g
,
g^,
g, 特意区分开),所以符合条件的
g
g
g 总是可以被表示为
g
=
ε
(
n
+
1
)
(
t
,
z
)
=
(
n
+
1
)
t
z
n
m
o
d
n
2
,
t
=
[
g
]
(
n
+
1
)
g=\varepsilon_{(n+1)}(t,z)=(n+1)^tz^n\,mod\,n^2,t=[g]_{(n+1)}
g=ε(n+1)(t,z)=(n+1)tznmodn2,t=[g](n+1)(n+1 相当于了生成元)。
加密过程
c
≡
g
m
r
n
m
o
d
n
2
c\equiv\,g^mr^n\,mod\,n^2
c≡gmrnmodn2
≡
[
(
n
+
1
)
t
z
n
)
]
m
r
n
m
o
d
n
2
\,\,\,\,\equiv[(n+1)^tz^n)]^mr^n\,mod\,n^2
≡[(n+1)tzn)]mrnmodn2
解密过程
证明:
m
=
L
(
c
λ
m
o
d
n
2
)
∗
μ
m
o
d
n
m=L(c^\lambda\,mod\,n^2)*\mu\,mod\,n
m=L(cλmodn2)∗μmodn;
先计算
c
λ
≡
(
g
m
r
n
)
λ
m
o
d
n
2
≡
g
m
λ
∗
r
n
λ
m
o
d
n
2
c^\lambda\,\equiv(g^mr^n)^\lambda\,mod\,n^2\equiv\,g^{m\lambda}*r^{n\lambda}\,mod\,n^2
cλ≡(gmrn)λmodn2≡gmλ∗rnλmodn2,由卡迈克尔定理可以
r
n
λ
≡
1
m
o
d
n
2
r^{n\lambda}\equiv1\,mod\,n^2
rnλ≡1modn2,所以
c
λ
≡
g
m
λ
m
o
d
n
2
c^\lambda\,\equiv\,g^{m\lambda}\,mod\,n^2
cλ≡gmλmodn2;
代入
g
g
g,可得
c
λ
≡
[
(
n
+
1
)
t
z
n
)
]
m
λ
m
o
d
n
2
≡
(
n
+
1
)
t
m
λ
∗
z
n
m
λ
m
o
d
n
2
≡
(
n
+
1
)
t
m
λ
m
o
d
n
2
≡
(
1
+
t
λ
m
n
)
m
o
d
n
2
c^\lambda\equiv[(n+1)^tz^n)]^{m\lambda}\,mod\,n^2\equiv(n+1)^{tm\lambda}*z^{nm\lambda}\,mod\,n^2\equiv(n+1)^{tm\lambda}\,mod\,n^2\equiv(1+t\lambda{}mn)\,mod\,n^2
cλ≡[(n+1)tzn)]mλmodn2≡(n+1)tmλ∗znmλmodn2≡(n+1)tmλmodn2≡(1+tλmn)modn2
代入
L
(
x
)
L(x)
L(x) 中有
L
(
c
λ
m
o
d
n
2
)
=
t
λ
m
m
o
d
n
L(c^\lambda\,mod\,n^2)=t\lambda{m}\, mod\,n
L(cλmodn2)=tλmmodn。
再计算
μ
=
(
L
(
g
λ
m
o
d
n
2
)
)
−
1
m
o
d
n
\mu=(L(g^{\lambda}\,mod\,n^2))^{-1}\,mod\,n
μ=(L(gλmodn2))−1modn。
g
λ
m
o
d
n
2
≡
[
(
n
+
1
)
t
z
n
)
]
λ
m
o
d
n
2
≡
(
1
+
t
λ
n
)
m
o
d
n
2
g^\lambda\,mod\,n^2\equiv[(n+1)^tz^n)]^\lambda\,mod\,n^2\equiv(1+t\lambda{n})\,mod\,n^2
gλmodn2≡[(n+1)tzn)]λmodn2≡(1+tλn)modn2,即
u
≡
(
t
λ
)
−
1
m
o
d
n
u\equiv(t\lambda)^{-1}\,mod\,n
u≡(tλ)−1modn,
所以
L
(
c
λ
m
o
d
n
2
)
∗
μ
m
o
d
n
=
m
∗
t
λ
∗
(
t
λ
)
−
1
m
o
d
n
=
m
L(c^\lambda\,mod\,n^2)*\mu\,mod\,n =m*t\lambda*(t\lambda)^{-1} mod\,n=m
L(cλmodn2)∗μmodn=m∗tλ∗(tλ)−1modn=m。
证毕。
同态性质
同态加法
两个密文的乘积将解密为对应的明文之和。
证明:
由上面证明可知
D
(
E
(
m
,
r
)
)
=
m
D(E(m,r))=m
D(E(m,r))=m,即
D
(
g
m
r
n
m
o
d
n
2
)
=
m
D(g^mr^n\,mod\,n^2)=m
D(gmrnmodn2)=m。
D
(
E
(
m
1
,
r
1
)
∗
E
(
m
2
,
r
2
)
m
o
d
n
2
)
=
D
(
g
m
1
r
1
n
∗
g
m
2
r
2
n
m
o
d
n
2
)
=
D
(
g
m
1
+
m
2
∗
(
r
1
r
2
)
n
m
o
d
n
2
)
=
m
1
+
m
2
D(E(m_1,r_1)*E(m_2,r_2)\,mod\,n^2) = D(g^{m_1}r_1^n*g^{m_2}r_2^n\,mod\,n^2)=D(g^{m_1+m_2}*(r_1r_2)^n\,mod\,n^2)=m_1+m_2
D(E(m1,r1)∗E(m2,r2)modn2)=D(gm1r1n∗gm2r2nmodn2)=D(gm1+m2∗(r1r2)nmodn2)=m1+m2。
另外该加密算法还有其它性质。
后记
Paillier 加密算法利用了陷门函数的性质,即根据
x
x
x 计算出
w
w
w 比较简单,但反向计算困难,除非知道
λ
(
n
)
\lambda(n)
λ(n),但这需要
n
n
n 的分解,众所周知,大数的素数分解是个难题。
该算法的明文空间大小为
n
n
n,密文空间大小为
n
∗
ϕ
(
n
)
n*\phi(n)
n∗ϕ(n)。