Skip to content

多密钥的公钥加密方案 BCP

类似于 Paillier, 这个方案是为了后面的 MPC 服务的。

BCP 是一种基于 Paillier 结构的双陷门公钥加密系统。它允许系统拥有一个主密钥(Master Key)和一个用户私钥(User Private Key)。

1. Setup

由可信第三方或分布式协议生成公共参数和主密钥:

  1. 选择两个大素数 p,q ,计算 n=pq
  2. 计算 λ=lcm(p1,q1)=gcd(p1,q1)(p1)(q1)
  3. 选择生成元 gZn2,使得 g 的阶是 n 的倍数(通常需满足 gcd(L(gλmodn2),n)=1
  4. 计算 μ=L(gλmodn2)1modn
    • 其中函数 L(x)=x1n
  • 公共参数 (Params): (n,n2,g)
  • 主密钥 (MK): (p,q,λ,μ)

2. KeyGen

用户生成自己的公私钥对:

  1. 用户随机选择私钥 aZn2
  2. 计算公钥 h=gamodn2
  • 用户公钥 (PK): h
  • 用户私钥 (SK): a

3. Encrypt

给定明文 mZn 和用户公钥 h

  1. 随机选择随机数 rZn2
  2. 计算 A=grmodn2
  3. 计算 B=hr(1+mn)modn2
  • 密文 (Ciphertext): C=(A,B)

解密

BCP 方案支持两种解密方式。

方式一:使用用户私钥解密 (Exponent Decryption)

持有私钥 a 的用户可以直接解密:

m=L(BAamodn2)

证明: 展开 BA

BAa=hr(1+mn)(gr)amodn2=(ga)r(1+mn)gramodn2=gar(1+mn)garmodn2=1+mnmodn2

应用 L(x) 函数:

L(1+mn)=(1+mn)1n=mnn=m

证毕。

方式二:使用主密钥解密 (Factor Decryption)

持有主密钥 (p,q,λ,μ) 的一方(如监管者或 MPC 协议中的计算方)可以在不知道用户私钥 a 的情况下解密。

核心性质: 对于任意 xZn2,有 xλ=1modn。 在模 n2 下,有 Carmichael 定理的推广:

xλ=1+nL(xλ)modn2
证明

Carmichael 定理:

对于任意 xZn2,有 xλ(p1,q1)=1modn,这是显然的, λ(p1,q1)=ϕ(n)gcd(p1,q1)

故而有 xλ=1+knmodn2,其中 0k<n

所以 L(xλ)=1+kn1n=kmodn,证毕。

算法步骤:

  1. 恢复随机数 rmodnr=L(Aλ)μmodn
  2. 恢复私钥 amodna=L(hλ)μmodn
  3. 计算中间项:term=L(Bλ)μmodn
  4. 消除随机性:Δ=termarmodn
  5. 恢复明文:m=ΔL(gλ)λ1modn

详细证明:

Step 1: 展开 L(Aλ)

Aλ=(gr)λ=(gλ)r=(1+nL(gλ))r=1+nrL(gλ)modn2

所以:

L(Aλ)=rL(gλ)modn

乘以 μ=L(gλ)1 后:

r=rL(gλ)L(gλ)1=rmodn

Step 2: 展开 L(hλ) 同理,因为 h=ga

L(hλ)=aL(gλ)modna=amodn

Step 3: 展开 L(Bλ)

Bλ=(hr(1+mn))λ=(gar)λ(1+mn)λ=(gλ)ar(1+mnλ)=(1+nL(gλ))ar(1+nmλ)modn2=(1+narL(gλ))(1+nmλ)modn2=1+n(arL(gλ)+mλ)modn2

所以:

L(Bλ)=arL(gλ)+mλmodn

乘以 μ 得到 term

term=(arL(gλ)+mλ)μ=ar+mλμmodn

Step 4: 计算 Δ

Δ=termar=(ar+mλμ)(a)(r)modn=mλμmodn

Step 5: 恢复 m 代码中最后计算 m=ΔL(gλ)λ1。 代入 Δ

mcalc=(mλμ)L(gλ)λ1=m(λλ1)(μL(gλ))=m11=mmodn

证毕。