背景
对必要的数论知识需要补充的,需要先阅读 公钥密码体制-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