公钥密码体制-Paillier (二)

背景

对必要的数论知识需要补充的,需要先阅读 公钥密码体制-Paillier (一)
也可以先阅读维基上对 Paillier 的说明。

算法

密钥生成

  1. 随机选择两个大素数 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,(p1)(q1))=1
  2. 计算 n = p q n=pq n=pq λ ( n ) = l c m ( p − 1 , q − 1 ) \lambda(n)=lcm(p-1, q-1) λ(n)=lcm(p1,q1) l c m lcm lcm 是取最小公倍数;
  3. Z n 2 ∗ \mathbb{Z_{n^2}^*} Zn2随机选择一个整数 g g g,即 g ∈ Z n 2 ∗ g\in\mathbb{Z}_{n^2}^* gZn2,( Z n 2 ∗ \mathbb{Z}_{n^2}^* Zn2 表示在 n 2 n^2 n2 剩余类中,与 n 2 n^2 n2 互素的数);
  4. 对于刚才选择的 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)=nx1。其实就是相当于检测 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
  5. 使用 ( n , g ) (n,g) (n,g) 作为公钥,使用 ( λ , μ ) (\lambda, \mu) (λ,μ) 作为私钥。

快速生成密钥

如果使用相同长度的 p , q p,q pq,可以快速生成密钥。比如选 g = n + 1 g=n+1 g=n+1,因为很明显 n + 1 ∈ Z n 2 ∗ n+1 \in \mathbb{Z}_{n^2}^* n+1Zn2 ( 1 + n ) n ≡ 1 + n ∗ n ≡ 1   m o d   n 2 (1+n)^n\equiv1+n*n\equiv1\,mod\,n^2 (1+n)n1+nn1modn2 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)=(p1)(q1) 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 下的逆元。

加密

  1. 设明文为 m m m m m m 满足 0 ≤   m ≤   n 0\leq\,m\leq\,n 0mn
  2. 选择一个随机数 r r r,满足 0 < r < n 0 < r < n 0<r<n ,严格地说 r ∈ Z n ∗ r\in\mathbb{Z}_n^* rZn
  3. 计算密文: c = g m ∗ r n   m o d   n 2 c=g^m*r^n\,mod\,n^2 c=gmrnmodn2

解密

  1. c c c 为要被解密的密文,其实 c ∈   Z n 2 ∗ c\in\,\mathbb{Z}_{n^2}^* cZn2(可被证明);
  2. 计算明文为 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}^* εgZnZnZn2
ε 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)gxynmodn2, ( x ∈ Z n , y ∈ Z n ∗ , g 和 n 满 足 密 钥 生 成 时 的 要 求 ) x\in\mathbb{Z}_n, y\in\mathbb{Z}_n^*,g和n 满足密钥生成时的要求) xZn,yZn,gn)
描述为,从 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 gxynmodn2 映射到集合 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:AB是双身的,当且仅当这个函数是单身的。
证明:由于 ∣ 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)=ZnZn,这说明两个集合具有相同的阶。所以我们只用证明映射函数是单射的。即不同 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 gx1x2(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λ(x1x2)(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,y21 都是 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λ(x1x2)=1modn2。这说明 λ ∗ ( x 1 − x 2 ) \lambda*(x_1-x_2) λ(x1x2) g g g 的阶的倍数,又由于 g g g 的阶是 n n n 的整数倍,所以 n ∣ λ ∗ ( x 1 − x 2 ) n|\lambda*(x_1-x_2) nλ(x1x2),又因为 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,x2Z,所以 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 kn,又因为 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}^* gZn2,所以 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)tznmodn2t=[g](n+1)(n+1 相当于了生成元)。

加密过程

c ≡   g m r n   m o d   n 2 c\equiv\,g^mr^n\,mod\,n^2 cgmrnmodn2
     ≡ [ ( 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)λmodn2gmλ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=mtλ(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(gm1r1ngm2r2nmodn2)=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)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值