Skip to content

代理重加密 ​

Proxy Re-encryption(PRE)

假设Sender原本有一个信息是加密给 Alice 的,但是这时 A 不在,A 可以告诉一个代理 Proxy,让其把这个信息重新加密给 Bob,而 Proxy 并不知道这个信息的内容。对于 P 来说,他只知道 RKEY (Re-encryption Key),而不知道 A 和 B 的私钥。

基于Elgamal的双向代理重加密 - 1 ​

双向代理,既可以从 A 重加密给 B,也可以从 B 重加密给 A。

这个方案是多跳的,既可以经过多次的代理重加密。

Set-up ​

  • 生成安全素数 p=2q+1, 在子群 Zq 中选取生成元 g

Keygen ​

  • 选取随机数 a,b∈Zq 作为 A 和 B 的私钥
  • 计算公钥 pkA=gamodp 和 pkB=gbmodp

Re-keygen ​

  • 入参有两个,既A和B的私钥
  • 对于从 A 到 B 的重加密,计算 rkA→B=ba−1modp
  • 同样的,对于从 B 到 A 的重加密,计算 rkB→A=ab−1modp

Enc ​

和ElGamal一致

  • 选取随机数 k∈Zq
  • 对于明文 m∈Zp
  • 假设现在要加密给 A
  • 计算密文 C=(C1,C2)=(gkmodp,m∗pkAkmodp)
  • 既 C=(gkmodp,m∗gakmodp)

对于A, Dec和ElGamal一致,故而不在此赘述

Re-Enc ​

  • Proxy 拿到密文 C=(C1,C2) 和重加密密钥 rkA→B

  • 计算新的密文 C′=(C1′,C2′)=(C1,C2rkA→Bmodp)

  • 既:(gkmodp,m∗pkAk∗ba−1modp)=(gkmodp,m∗pkBkmodp)

  • (ga)k∗ba−1=gbk

  • 此时显然,B 可以使用自己的私钥 b 来解密新的密文 C′

基于Elgamal的双向代理重加密 - 2 ​

但是显然,在pratical上,上面这种rkeygen的方式显然是有问题的,故而有下面这种变换

Re-keygen ​

  • 对于 A, 要生成 rkA→B
  • rk=ska/H(pkBska)modq, 既 rk=aH(gba)
  • 发送rk给Proxy

Re-Enc ​

  • 计算 C′=(C1′,C2′)=(C1rk,C2)
  • 既: (gk∗aH(gba),m∗gak)

Dec ​

  • 对于 B 来说,显然只需知道A的公钥和自己的私钥,即可计算出 H(pkAskb)=H(gab)
  • 然后计算: m=C2/C1H(pkAskb)modp 即可得到消息 m

基于配对的单向代理重加密 ​

对于一个传统的Elgamal密文:(gr,gar∗m),我们其实很自然的可以想到将密文转换一下形式,将A的公钥和信息解绑:

(gar,gr∗m)

这样,A仍然可以使用自己的私钥 a 来解密这个密文,只需计算 (gar)1a 即可

再结合一下配对,就有了如下方案

Set-up ​

  • 选取群 Zr,G,GT,以及双线性映射 e:G×G→GT
  • 选取生成元 g∈G,生成元 gT=e(g,g)

Keygen ​

  • 对于A,选取随机数 a∈Zr 作为私钥,计算公钥 pkA=ga
  • 对于B,选取随机数 b∈Zr 作为私钥,计算公钥 pkB=gb

Enc ​

依旧是先加密给 A

  • 选取随机数 r∈Zr
  • 计算 C1=pkAr=gar
  • 计算 C2=gTr∗m=e(g,g)r∗m, m∈GT
  • 发送密文 C=(C1,C2)

Dec ​

对于A来说,显然:

  • 计算 gr=C11a
  • 再计算 e(g,gr)=e(g,g)r 即可

Re-keygen ​

  • 计算 rkA→B=gb/a=pkB1/a
  • In pratical: 先计算 inv=g−a, 再计算 rkA→B=invb

Re-Enc ​

  • C2 保持不变
  • 计算 C1′=e(C1,rkA→B)=e(gar,gb/a)=e(g,g)br
  • 发送新的密文 C′=(C1′,C2)

Dec2 ​

对于B来说,显然:

  • 计算 e(g,g)r=(C1′)1b=e(g,g)br∗1b
  • 再计算 m=C2/e(g,g)r 即可