Paillier 算法
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}^{*} m∈Zn,c∈Zn2∗
密文相乘会对应到明文相加:
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^{*} r∈Zn∗
密文在模 n 2 n^2 n2 下计算:
C ⊆ Z n 2 ∗ \mathcal{C}\subseteq \mathbb{Z}_{n^2}^{*} C⊆Zn2∗
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}^{*} z∈Zn2∗,判断它是否存在某个 y y y 使得:
z ≡ y n ( m o d n 2 ) z\equiv y^n \pmod{n^2} z≡yn(modn2)
在不知道 p p p、 q q q 的情况下被认为是困难的。这个问题称为判定性复合剩余类问题,常记为 DCR 问题。
标准算法流程
密钥生成
- 选择两个大素数 p p p、 q q q,并计算:
n = p q n=pq n=pq
- 计算 Carmichael 函数:
λ = lcm ( p − 1 , q − 1 ) \lambda=\operatorname{lcm}(p-1,q-1) λ=lcm(p−1,q−1)
- 选择 g ∈ Z n 2 ∗ g\in \mathbb{Z}_{n^2}^{*} g∈Zn2∗,要求下式在模 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)=nu−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 0≤m<n
随机选择:
r ∈ Z n ∗ r\in \mathbb{Z}_n^{*} r∈Zn∗
计算密文:
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)m≡1+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,(p−1)(q−1))=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} c1c2≡gm1+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} ck≡gkm(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,y−n,0≤y<2n2n≤y<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 μ=a−1modn
随机因子会消失
因为 r ∈ Z n ∗ r\in\mathbb{Z}_n^* r∈Zn∗,而 λ = lcm ( p − 1 , q − 1 ) \lambda=\operatorname{lcm}(p-1,q-1) λ=lcm(p−1,q−1) 是 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} rnλ=(rλ)n=(1+kn)n≡1(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}^* g∈Zn2∗,所以 g m o d n ∈ Z n ∗ g\bmod n\in\mathbb{Z}_n^* gmodn∈Zn∗,同样有:
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)m≡1+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λ)mrnλ≡1+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)−1≡ma(modn)
最后乘上 μ = a − 1 m o d n \mu=a^{-1}\bmod n μ=a−1modn:
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)μ≡ma⋅a−1≡m(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,带来明显的存储和带宽膨胀。
- 大整数模幂开销高,尤其在批量联邦学习场景中容易成为瓶颈。
更多推荐


所有评论(0)