Paillier 算法

Paillier 是 Pascal Paillier 在 1999 年提出的概率型公钥密码体制。它最重要的工程价值是加法同态:不解密也能在密文域完成明文加法和明文标量乘。

在联邦学习、安全聚合、电子投票和安全多方计算中,Paillier 常被用来保护中间统计量或梯度。它不是全同态加密,不能直接完成两个密文对应明文的乘法。

一句话概括

Paillier 把明文放在模 n n n 的加法群里,把密文放在模 n 2 n^2 n2 的乘法群里:

m ∈ Z n , c ∈ Z n 2 ∗ m \in \mathbb{Z}_n,\qquad c \in \mathbb{Z}_{n^2}^{*} mZn,cZn2

密文相乘会对应到明文相加:

D ( E ( m 1 ) E ( m 2 ) ) ≡ m 1 + m 2 ( m o d n ) D(E(m_1)E(m_2)) \equiv m_1+m_2 \pmod n D(E(m1)E(m2))m1+m2(modn)

这也是 Paillier 适合做密文聚合的根本原因。

数学基础

明文、随机数和密文空间

p p p q q q 是两个大素数:

n = p q n=pq n=pq

明文空间通常取为:

M = Z n \mathcal{M}=\mathbb{Z}_n M=Zn

随机数从可逆剩余类中选取:

r ∈ Z n ∗ r\in \mathbb{Z}_n^{*} rZn

密文在模 n 2 n^2 n2 下计算:

C ⊆ Z n 2 ∗ \mathcal{C}\subseteq \mathbb{Z}_{n^2}^{*} CZn2

Paillier 的加密形式为:

c = g m r n   m o d   n 2 c=g^m r^n \bmod n^2 c=gmrnmodn2

其中 g g g 是公钥中的生成元, r r r 提供概率性。即使同一个 m m m 被重复加密,只要 r r r 不同,得到的 c c c 也会不同。

困难假设

Paillier 的语义安全性通常建立在判定性复合剩余类假设上。直观地说,给定 z ∈ Z n 2 ∗ z\in \mathbb{Z}_{n^2}^{*} zZn2,判断它是否存在某个 y y y 使得:

z ≡ y n ( m o d n 2 ) z\equiv y^n \pmod{n^2} zyn(modn2)

在不知道 p p p q q q 的情况下被认为是困难的。这个问题称为判定性复合剩余类问题,常记为 DCR 问题。

标准算法流程

密钥生成

  1. 选择两个大素数 p p p q q q,并计算:

n = p q n=pq n=pq

  1. 计算 Carmichael 函数:

λ = lcm ⁡ ( p − 1 , q − 1 ) \lambda=\operatorname{lcm}(p-1,q-1) λ=lcm(p1,q1)

  1. 选择 g ∈ Z n 2 ∗ g\in \mathbb{Z}_{n^2}^{*} gZn2,要求下式在模 n n n 下存在逆元:

L ( g λ   m o d   n 2 ) L(g^\lambda\bmod n^2) L(gλmodn2)

其中辅助函数定义为:

L ( u ) = u − 1 n L(u)=\frac{u-1}{n} L(u)=nu1

  1. 计算:

μ = ( L ( g λ   m o d   n 2 ) ) − 1   m o d   n \mu=\left(L(g^\lambda\bmod n^2)\right)^{-1}\bmod n μ=(L(gλmodn2))1modn

公钥和私钥分别为:

pk ⁡ = ( n , g ) \operatorname{pk}=(n,g) pk=(n,g)

sk ⁡ = ( λ , μ ) \operatorname{sk}=(\lambda,\mu) sk=(λ,μ)

加密

给定明文:

0 ≤ m < n 0\le m<n 0m<n

随机选择:

r ∈ Z n ∗ r\in \mathbb{Z}_n^{*} rZn

计算密文:

c = E ( m ; r ) = g m r n   m o d   n 2 c=E(m;r)=g^m r^n \bmod n^2 c=E(m;r)=gmrnmodn2

解密

给定密文 c c c,先计算:

u = c λ   m o d   n 2 u=c^\lambda \bmod n^2 u=cλmodn2

再恢复明文:

m = L ( u ) μ   m o d   n m=L(u)\mu \bmod n m=L(u)μmodn

也就是:

m = L ( c λ   m o d   n 2 ) μ   m o d   n m=L(c^\lambda\bmod n^2)\mu \bmod n m=L(cλmodn2)μmodn

常用优化:取 g = n + 1 g=n+1 g=n+1

工程实现里经常直接选:

g = n + 1 g=n+1 g=n+1

这时由二项式定理可得:

( n + 1 ) m ≡ 1 + m n ( m o d n 2 ) (n+1)^m \equiv 1+mn \pmod{n^2} (n+1)m1+mn(modn2)

因此加密公式可以化简为:

c = ( 1 + m n ) r n   m o d   n 2 c=(1+mn)r^n \bmod n^2 c=(1+mn)rnmodn2

私钥参数也可以化简。因为:

L ( ( n + 1 ) λ   m o d   n 2 ) ≡ λ ( m o d n ) L((n+1)^\lambda\bmod n^2)\equiv \lambda \pmod n L((n+1)λmodn2)λ(modn)

所以:

μ = λ − 1   m o d   n \mu=\lambda^{-1}\bmod n μ=λ1modn

这个优化把 g m   m o d   n 2 g^m\bmod n^2 gmmodn2 的大模幂变成一次乘加,对加密端非常友好。它成立的前提是:

gcd ⁡ ( λ , n ) = 1 \gcd(\lambda,n)=1 gcd(λ,n)=1

实践中通常会在选取 p p p q q q 时检查:

gcd ⁡ ( n , ( p − 1 ) ( q − 1 ) ) = 1 \gcd(n,(p-1)(q-1))=1 gcd(n,(p1)(q1))=1

同态性质

密文乘法对应明文加法

设:

c 1 = g m 1 r 1 n   m o d   n 2 c_1=g^{m_1}r_1^n \bmod n^2 c1=gm1r1nmodn2

c 2 = g m 2 r 2 n   m o d   n 2 c_2=g^{m_2}r_2^n \bmod n^2 c2=gm2r2nmodn2

则:

c 1 c 2 ≡ g m 1 + m 2 ( r 1 r 2 ) n ( m o d n 2 ) c_1c_2\equiv g^{m_1+m_2}(r_1r_2)^n \pmod{n^2} c1c2gm1+m2(r1r2)n(modn2)

所以:

D ( c 1 c 2 ) ≡ m 1 + m 2 ( m o d n ) D(c_1c_2)\equiv m_1+m_2 \pmod n D(c1c2)m1+m2(modn)

也就是:

D ( E ( m 1 ) E ( m 2 ) ) ≡ m 1 + m 2 ( m o d n ) D(E(m_1)E(m_2))\equiv m_1+m_2 \pmod n D(E(m1)E(m2))m1+m2(modn)

密文幂对应明文标量乘

对任意整数 k k k

c k ≡ g k m ( r k ) n ( m o d n 2 ) c^k\equiv g^{km}(r^k)^n \pmod{n^2} ckgkm(rk)n(modn2)

因此:

D ( E ( m ) k ) ≡ k m ( m o d n ) D(E(m)^k)\equiv km \pmod n D(E(m)k)km(modn)

在联邦学习聚合中,密文加法和标量乘足以表达许多求和型统计量。

负数和定点数编码

Paillier 原生明文是模 n n n 的非负整数。实际系统要处理负数和浮点数时,通常先做编码。

负数可以用模空间高位表示。例如把整数 x x x 编码为:

EncInt ⁡ ( x ) = x   m o d   n \operatorname{EncInt}(x)=x\bmod n EncInt(x)=xmodn

解码时可设阈值:

DecInt ⁡ ( y ) = { y , 0 ≤ y < n 2 y − n , n 2 ≤ y < n \operatorname{DecInt}(y)= \begin{cases} y, & 0\le y < \frac{n}{2} \\ y-n, & \frac{n}{2}\le y < n \end{cases} DecInt(y)={y,yn,0y<2n2ny<n

浮点数一般用定点数缩放。给定缩放因子 S S S

x ~ = ⌊ S x ⌉ \tilde{x}=\lfloor Sx\rceil x~=Sx

密文域完成加法后再除以 S S S 还原近似值。

解密正确性证明

Paillier 解密里最容易绕的地方是:密文里明明混入了随机数 r r r,为什么做一次 c λ   m o d   n 2 c^\lambda\bmod n^2 cλmodn2 再套 L L L 函数,就能把明文 m m m 取出来。

先把密文写成:

c = g m r n   m o d   n 2 c=g^m r^n \bmod n^2 c=gmrnmodn2

设:

a = L ( g λ   m o d   n 2 ) a=L(g^\lambda\bmod n^2) a=L(gλmodn2)

密钥生成要求 a a a 在模 n n n 下存在逆元,并令:

μ = a − 1   m o d   n \mu=a^{-1}\bmod n μ=a1modn

随机因子会消失

因为 r ∈ Z n ∗ r\in\mathbb{Z}_n^* rZn,而 λ = lcm ⁡ ( p − 1 , q − 1 ) \lambda=\operatorname{lcm}(p-1,q-1) λ=lcm(p1,q1) Z n ∗ \mathbb{Z}_n^* Zn 的 Carmichael 指数,所以:

r λ ≡ 1 ( m o d n ) r^\lambda\equiv 1 \pmod n rλ1(modn)

于是存在整数 k k k,使得:

r λ = 1 + k n r^\lambda=1+kn rλ=1+kn

再利用 [[02-Area/07-算法/00-基本算法/01-二项式定理|二项式定理]]:

r n λ = ( r λ ) n = ( 1 + k n ) n ≡ 1 ( m o d n 2 ) r^{n\lambda}=(r^\lambda)^n=(1+kn)^n\equiv 1 \pmod{n^2} r=(rλ)n=(1+kn)n1(modn2)

也就是说,随机因子 r n r^n rn 在提升到 λ \lambda λ 次方之后,会在模 n 2 n^2 n2 下变成 1 1 1

明文因子会线性化

因为 g ∈ Z n 2 ∗ g\in\mathbb{Z}_{n^2}^* gZn2,所以 g   m o d   n ∈ Z n ∗ g\bmod n\in\mathbb{Z}_n^* gmodnZn,同样有:

g λ ≡ 1 ( m o d n ) g^\lambda\equiv 1 \pmod n gλ1(modn)

因此 g λ   m o d   n 2 g^\lambda\bmod n^2 gλmodn2 一定可以写成:

g λ   m o d   n 2 = 1 + a n g^\lambda\bmod n^2=1+an gλmodn2=1+an

其中 a = L ( g λ   m o d   n 2 ) a=L(g^\lambda\bmod n^2) a=L(gλmodn2)。于是:

( g λ ) m ≡ ( 1 + a n ) m ≡ 1 + m a n ( m o d n 2 ) (g^\lambda)^m\equiv (1+an)^m\equiv 1+man \pmod{n^2} (gλ)m(1+an)m1+man(modn2)

套用 L L L 函数恢复明文

把两部分合起来:

c λ ≡ ( g m r n ) λ ≡ ( g λ ) m r n λ ≡ 1 + m a n ( m o d n 2 ) c^\lambda \equiv (g^m r^n)^\lambda \equiv (g^\lambda)^m r^{n\lambda} \equiv 1+man \pmod{n^2} cλ(gmrn)λ(gλ)mr1+man(modn2)

所以:

L ( c λ   m o d   n 2 ) = ( 1 + m a n ) − 1 n ≡ m a ( m o d n ) L(c^\lambda\bmod n^2) =\frac{(1+man)-1}{n} \equiv ma \pmod n L(cλmodn2)=n(1+man)1ma(modn)

最后乘上 μ = a − 1   m o d   n \mu=a^{-1}\bmod n μ=a1modn

L ( c λ   m o d   n 2 ) μ ≡ m a ⋅ a − 1 ≡ m ( m o d n ) L(c^\lambda\bmod n^2)\mu \equiv ma\cdot a^{-1} \equiv m \pmod n L(cλmodn2)μmaa1m(modn)

这就证明了解密公式:

D ( c ) = L ( c λ   m o d   n 2 ) μ   m o d   n D(c)=L(c^\lambda\bmod n^2)\mu\bmod n D(c)=L(cλmodn2)μmodn

确实能恢复明文 m m m。如果采用 g = n + 1 g=n+1 g=n+1,则 a ≡ λ ( m o d n ) a\equiv\lambda\pmod n aλ(modn),所以前面常用优化里的 μ = λ − 1   m o d   n \mu=\lambda^{-1}\bmod n μ=λ1modn 只是这个证明的一个特例。

硬件实现视角

Paillier 的主要开销集中在模幂和大整数模乘。标准加密需要计算:

r n   m o d   n 2 r^n\bmod n^2 rnmodn2

解密需要计算:

c λ   m o d   n 2 c^\lambda\bmod n^2 cλmodn2

如果 n n n 2048 2048 2048 位,则 n 2 n^2 n2 对应约 4096 4096 4096 位模数。也就是说,Paillier 的底层模乘位宽通常是同安全级 RSA 的两倍左右。

采用 g = n + 1 g=n+1 g=n+1 后,加密端仍然要做一次 r n   m o d   n 2 r^n\bmod n^2 rnmodn2,但省掉了 g m   m o d   n 2 g^m\bmod n^2 gmmodn2。解密端仍然是大模幂,是硬件加速的重点。

常见优化包括:

  • 用 Montgomery 模乘实现连续模乘。
  • 用滑动窗口或固定窗口方法减少模乘次数。
  • 对解密端利用 CRT,把模 n 2 n^2 n2 运算拆到与 p 2 p^2 p2 q 2 q^2 q2 相关的更小模数上。
  • 对批量加密场景预计算 r n   m o d   n 2 r^n\bmod n^2 rnmodn2

优缺点

优点:

  • 支持天然的加法同态,适合安全求和与梯度聚合。
  • 加密具有概率性,相同明文多次加密会得到不同密文。
  • 数学结构简洁,工程实现和安全分析都比较成熟。

缺点:

  • 只支持加法同态,不能直接完成密文之间的乘法。
  • 密文模数是 n 2 n^2 n2,带来明显的存储和带宽膨胀。
  • 大整数模幂开销高,尤其在批量联邦学习场景中容易成为瓶颈。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐