Skip to content

代理重加密

Proxy Re-encryption(PRE)

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

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

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

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

Set-up

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

Keygen

  • 选取随机数 a,bZq 作为 AB 的私钥
  • 计算公钥 pkA=gamodppkB=gbmodp

Re-keygen

  • 入参有两个,既AB的私钥
  • 对于从 AB 的重加密,计算 rkAB=ba1modp
  • 同样的,对于从 BA 的重加密,计算 rkBA=ab1modp

Enc

和ElGamal一致

  • 选取随机数 kZq
  • 对于明文 mZp
  • 假设现在要加密给 A
  • 计算密文 C=(C1,C2)=(gkmodp,mpkAkmodp)
  • C=(gkmodp,mgakmodp)

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

Re-Enc

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

  • 计算新的密文 C=(C1,C2)=(C1,C2rkABmodp)

  • 既:(gkmodp,mpkAkba1modp)=(gkmodp,mpkBkmodp)

  • (ga)kba1=gbk

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

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

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

Re-keygen

  • 对于 A, 要生成 rkAB
  • rk=ska/H(pkBska)modq, 既 rk=aH(gba)
  • 发送rkProxy

Re-Enc

  • 计算 C=(C1,C2)=(C1rk,C2)
  • 既: (gkaH(gba),mgak)

Dec

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

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

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

(gar,grm)

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

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

Set-up

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

Keygen

  • 对于A,选取随机数 aZr 作为私钥,计算公钥 pkA=ga
  • 对于B,选取随机数 bZr 作为私钥,计算公钥 pkB=gb

Enc

依旧是先加密给 A

  • 选取随机数 rZr
  • 计算 C1=pkAr=gar
  • 计算 C2=gTrm=e(g,g)rm, mGT
  • 发送密文 C=(C1,C2)

Dec

对于A来说,显然:

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

Re-keygen

  • 计算 rkAB=gb/a=pkB1/a
  • In pratical: 先计算 inv=ga, 再计算 rkAB=invb

Re-Enc

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

Dec2

对于B来说,显然:

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