Paillier 算法
Paillier 算法
Paillier 是 Pascal Paillier 在 1999 年提出的概率型公钥密码体制。它最重要的工程价值是加法同态:不解密也能在密文域完成明文加法和明文标量乘。
在联邦学习、安全聚合、电子投票和安全多方计算中,Paillier 常被用来保护中间统计量或梯度。它不是全同态加密,不能直接完成两个密文对应明文的乘法。
一句话概括
Paillier 把明文放在模 nnn 的加法群里,把密文放在模 n2n^2n2 的乘法群里:
m∈Zn,c∈Zn2∗ m \in \mathbb{Z}_n,\qquad c \in \mathbb{Z}_{n^2}^{*} m∈Zn,c∈Zn2∗
密文相乘会对应到明文相加:
D(E(m1)E(m2))≡m1+m2(modn) D(E(m_1)E(m_2)) \equiv m_1+m_2 \pmod n D(E(m1)E(m2))≡m1+m2(modn)
这也是 Paillier 适合做密文聚合的根本原因。
数学基础
明文、随机数和密文空间
设 ppp、qqq 是两个大素数:
n=pq n=pq n=pq
明文空间通常取为:
M=Zn \mathcal{M}=\mathbb{Z}_n M=Zn
随机数从可逆剩余类中选取:
r∈Zn∗ r\in \mathbb{Z}_n^{*} r∈Zn∗
密文在模 n2n^2n2 下计算:
C⊆Zn2∗ \mathcal{C}\subseteq \mathbb{Z}_{n^2}^{*} C⊆Zn2∗
Paillier 的加密形式为:
c=gmrn mod n2 c=g^m r^n \bmod n^2 c=gmrnmodn2
其中 ggg 是公钥中的生成元,rrr 提供概率性。即使同一个 mmm 被重复加密,只要 rrr 不同,得到的 ccc 也会不同。
困难假设
Paillier 的语义安全性通常建立在判定性复合剩余类假设上。直观地说,给定 z∈Zn2∗z\in \mathbb{Z}_{n^2}^{*}z∈Zn2∗,判断它是否存在某个 yyy 使得:
z≡yn(modn2) z\equiv y^n \pmod{n^2} z≡yn(modn2)
在不知道 ppp、qqq 的情况下被认为是困难的。这个问题称为判定性复合剩余类问题,常记为 DCR 问题。
标准算法流程
密钥生成
- 选择两个大素数 ppp、qqq,并计算:
n=pq n=pq n=pq
- 计算 Carmichael 函数:
λ=lcm(p−1,q−1) \lambda=\operatorname{lcm}(p-1,q-1) λ=lcm(p−1,q−1)
- 选择 g∈Zn2∗g\in \mathbb{Z}_{n^2}^{*}g∈Zn2∗,要求下式在模 nnn 下存在逆元:
L(gλ mod n2) L(g^\lambda\bmod n^2) L(gλmodn2)
其中辅助函数定义为:
L(u)=u−1n L(u)=\frac{u-1}{n} L(u)=nu−1
- 计算:
μ=(L(gλ mod n2))−1 mod 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∈Zn∗ r\in \mathbb{Z}_n^{*} r∈Zn∗
计算密文:
c=E(m;r)=gmrn mod n2 c=E(m;r)=g^m r^n \bmod n^2 c=E(m;r)=gmrnmodn2
解密
给定密文 ccc,先计算:
u=cλ mod n2 u=c^\lambda \bmod n^2 u=cλmodn2
再恢复明文:
m=L(u)μ mod n m=L(u)\mu \bmod n m=L(u)μmodn
也就是:
m=L(cλ mod n2)μ mod n m=L(c^\lambda\bmod n^2)\mu \bmod n m=L(cλmodn2)μmodn
常用优化:取 g=n+1g=n+1g=n+1
工程实现里经常直接选:
g=n+1 g=n+1 g=n+1
这时由二项式定理可得:
(n+1)m≡1+mn(modn2) (n+1)^m \equiv 1+mn \pmod{n^2} (n+1)m≡1+mn(modn2)
因此加密公式可以化简为:
c=(1+mn)rn mod n2 c=(1+mn)r^n \bmod n^2 c=(1+mn)rnmodn2
私钥参数也可以化简。因为:
L((n+1)λ mod n2)≡λ(modn) L((n+1)^\lambda\bmod n^2)\equiv \lambda \pmod n L((n+1)λmodn2)≡λ(modn)
所以:
μ=λ−1 mod n \mu=\lambda^{-1}\bmod n μ=λ−1modn
这个优化把 gm mod n2g^m\bmod n^2gmmodn2 的大模幂变成一次乘加,对加密端非常友好。它成立的前提是:
gcd(λ,n)=1 \gcd(\lambda,n)=1 gcd(λ,n)=1
实践中通常会在选取 ppp、qqq 时检查:
gcd(n,(p−1)(q−1))=1 \gcd(n,(p-1)(q-1))=1 gcd(n,(p−1)(q−1))=1
同态性质
密文乘法对应明文加法
设:
c1=gm1r1n mod n2 c_1=g^{m_1}r_1^n \bmod n^2 c1=gm1r1nmodn2
c2=gm2r2n mod n2 c_2=g^{m_2}r_2^n \bmod n^2 c2=gm2r2nmodn2
则:
c1c2≡gm1+m2(r1r2)n(modn2) c_1c_2\equiv g^{m_1+m_2}(r_1r_2)^n \pmod{n^2} c1c2≡gm1+m2(r1r2)n(modn2)
所以:
D(c1c2)≡m1+m2(modn) D(c_1c_2)\equiv m_1+m_2 \pmod n D(c1c2)≡m1+m2(modn)
也就是:
D(E(m1)E(m2))≡m1+m2(modn) D(E(m_1)E(m_2))\equiv m_1+m_2 \pmod n D(E(m1)E(m2))≡m1+m2(modn)
密文幂对应明文标量乘
对任意整数 kkk:
ck≡gkm(rk)n(modn2) c^k\equiv g^{km}(r^k)^n \pmod{n^2} ck≡gkm(rk)n(modn2)
因此:
D(E(m)k)≡km(modn) D(E(m)^k)\equiv km \pmod n D(E(m)k)≡km(modn)
在联邦学习聚合中,密文加法和标量乘足以表达许多求和型统计量。
负数和定点数编码
Paillier 原生明文是模 nnn 的非负整数。实际系统要处理负数和浮点数时,通常先做编码。
负数可以用模空间高位表示。例如把整数 xxx 编码为:
EncInt(x)=x mod n \operatorname{EncInt}(x)=x\bmod n EncInt(x)=xmodn
解码时可设阈值:
DecInt(y)={y,0≤y<n2y−n,n2≤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
浮点数一般用定点数缩放。给定缩放因子 SSS:
x~=⌊Sx⌉ \tilde{x}=\lfloor Sx\rceil x~=⌊Sx⌉
密文域完成加法后再除以 SSS 还原近似值。
解密正确性证明
Paillier 解密里最容易绕的地方是:密文里明明混入了随机数 rrr,为什么做一次 cλ mod n2c^\lambda\bmod n^2cλmodn2 再套 LLL 函数,就能把明文 mmm 取出来。
先把密文写成:
c=gmrn mod n2 c=g^m r^n \bmod n^2 c=gmrnmodn2
设:
a=L(gλ mod n2) a=L(g^\lambda\bmod n^2) a=L(gλmodn2)
密钥生成要求 aaa 在模 nnn 下存在逆元,并令:
μ=a−1 mod n \mu=a^{-1}\bmod n μ=a−1modn
随机因子会消失
因为 r∈Zn∗r\in\mathbb{Z}_n^*r∈Zn∗,而 λ=lcm(p−1,q−1)\lambda=\operatorname{lcm}(p-1,q-1)λ=lcm(p−1,q−1) 是 Zn∗\mathbb{Z}_n^*Zn∗ 的 Carmichael 指数,所以:
rλ≡1(modn) r^\lambda\equiv 1 \pmod n rλ≡1(modn)
于是存在整数 kkk,使得:
rλ=1+kn r^\lambda=1+kn rλ=1+kn
再利用 [[02-Area/07-算法/00-基本算法/01-二项式定理|二项式定理]]:
rnλ=(rλ)n=(1+kn)n≡1(modn2) r^{n\lambda}=(r^\lambda)^n=(1+kn)^n\equiv 1 \pmod{n^2} rnλ=(rλ)n=(1+kn)n≡1(modn2)
也就是说,随机因子 rnr^nrn 在提升到 λ\lambdaλ 次方之后,会在模 n2n^2n2 下变成 111。
明文因子会线性化
因为 g∈Zn2∗g\in\mathbb{Z}_{n^2}^*g∈Zn2∗,所以 g mod n∈Zn∗g\bmod n\in\mathbb{Z}_n^*gmodn∈Zn∗,同样有:
gλ≡1(modn) g^\lambda\equiv 1 \pmod n gλ≡1(modn)
因此 gλ mod n2g^\lambda\bmod n^2gλmodn2 一定可以写成:
gλ mod n2=1+an g^\lambda\bmod n^2=1+an gλmodn2=1+an
其中 a=L(gλ mod n2)a=L(g^\lambda\bmod n^2)a=L(gλmodn2)。于是:
(gλ)m≡(1+an)m≡1+man(modn2) (g^\lambda)^m\equiv (1+an)^m\equiv 1+man \pmod{n^2} (gλ)m≡(1+an)m≡1+man(modn2)
套用 LLL 函数恢复明文
把两部分合起来:
cλ≡(gmrn)λ≡(gλ)mrnλ≡1+man(modn2) 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λ mod n2)=(1+man)−1n≡ma(modn) 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 mod n\mu=a^{-1}\bmod nμ=a−1modn:
L(cλ mod n2)μ≡ma⋅a−1≡m(modn) 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λ mod n2)μ mod n D(c)=L(c^\lambda\bmod n^2)\mu\bmod n D(c)=L(cλmodn2)μmodn
确实能恢复明文 mmm。如果采用 g=n+1g=n+1g=n+1,则 a≡λ(modn)a\equiv\lambda\pmod na≡λ(modn),所以前面常用优化里的 μ=λ−1 mod n\mu=\lambda^{-1}\bmod nμ=λ−1modn 只是这个证明的一个特例。
硬件实现视角
Paillier 的主要开销集中在模幂和大整数模乘。标准加密需要计算:
rn mod n2 r^n\bmod n^2 rnmodn2
解密需要计算:
cλ mod n2 c^\lambda\bmod n^2 cλmodn2
如果 nnn 是 204820482048 位,则 n2n^2n2 对应约 409640964096 位模数。也就是说,Paillier 的底层模乘位宽通常是同安全级 RSA 的两倍左右。
采用 g=n+1g=n+1g=n+1 后,加密端仍然要做一次 rn mod n2r^n\bmod n^2rnmodn2,但省掉了 gm mod n2g^m\bmod n^2gmmodn2。解密端仍然是大模幂,是硬件加速的重点。
常见优化包括:
- 用 Montgomery 模乘实现连续模乘。
- 用滑动窗口或固定窗口方法减少模乘次数。
- 对解密端利用 CRT,把模 n2n^2n2 运算拆到与 p2p^2p2、q2q^2q2 相关的更小模数上。
- 对批量加密场景预计算 rn mod n2r^n\bmod n^2rnmodn2。
优缺点
优点:
- 支持天然的加法同态,适合安全求和与梯度聚合。
- 加密具有概率性,相同明文多次加密会得到不同密文。
- 数学结构简洁,工程实现和安全分析都比较成熟。
缺点:
- 只支持加法同态,不能直接完成密文之间的乘法。
- 密文模数是 n2n^2n2,带来明显的存储和带宽膨胀。
- 大整数模幂开销高,尤其在批量联邦学习场景中容易成为瓶颈。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)