代理重加密(Proxy Re-Encryption)技术原理和Java代码实现

1. 代理重加秘的应用介绍

由于大部分的云服务供应商并不能完全值得信任,云服务供应商可能会在未经用户允许的情况下,擅自泄露用户的隐私数据或重要文件。

解决这个问题最直接的方法是数据加密,对于涉及用户隐私或含有敏感信息的数据文件,将数据加密后上传是一种普遍的保证数据机密性的方法 ,这样数据上传者只需保管好解***即可。但是云计算服务中存在大量的需要共享数据的应用需求,对于这种简单的数据加密上传方式,由于加密文件只能被用户自行解密,这样的数据加密文件并不能通过云服务器来分享给他人,为此这便需要一种密码方案,使得能对存储在云服务器上的密文进行安全有效的转换。

显然,传统的加密或数字签名方案并不具有密文转换功能,而代理重加密(ProxyReEncryptionPRE)(Proxy Re-Encryption,PRE)技术是一种可以对密文进行安全转换的加密方法,PRE 技术可以将用户 A 用自己公钥加密上传的密文转换成另一种形式的密文,使得用户 B 可以用自己私钥对转换后的密文进行解密,并且在整个转换过程中不会泄露任何对应的明文信息,因此 PRE 对于云计算是天然的应用,可以保证云端数据的安全访问与共享。

由于 PRE 能对密文进行安全转换这一特性,PRE 技术被深入地研究以及在云环境中充分发挥着其实用价值。目前 PRE 技术已广泛应用于云计算环境下的众多领域之中,如访问控制 、分布式文件系统 、加密邮件转发系统 、垃圾邮件过滤系统等 。

2. 业务需求分析

基于数据分享场景,用户B想获取用户A在云上的加密数据,A不能与B直接通信,只能通过中间商云平台;A不能将加密数据的秘钥发给云平台,由云平台再转发给B,这样云平台就知道A的保密数据;要求不能像CP-ABE那样,而是要求通过“请求+确认”方式获取A的数据,即B在每次想获取A的数据时,要想A申请,只有A同意了以后B才能获取并查看数据。

3. PRE概念

PRE 是一种对密文进行安全转换的加密技术,在 19981998 年欧密会上,Blaze 等首次提出了代理重加密的概念 。在代理重加密中,基于授权人(delegator)公钥加密的密文可以被转换为另一种密文,且保持对应明文不变,被转换后的密文可以由被授权人(delegate)的私钥进行解密。该密文转换过程由一个半可信的代理者(proxy)执行,在执行该过程前,代理者需要持有一个由授权人到被授权人的转换**,该转换**一般由授权人事先生成并交给代理者。同时在密文转换的整个过程中,代理者无法获取关于该密文对应明文的任何信息。

4.传统公钥PRE算法流程

在介绍之前,先解释一个概念多跳性(Multihop)(Multi-hop):多跳性是指一个密文可以被不同的转换**连续进行多次转换,并且对应的明文保持不变。与其相对的是单跳性,即原始密文只能被转换一次。

一个传统 PKI 环境下的单向多跳代理重加密方案包含下列算法[1]^{[1]}

  • (1) 钥生成算法 KeyGen(par)(pk;sk)******(par) \to (pk;sk):输入系统公开参数 par,该算法输出(pk,sk)(pk,sk)作为一个用户的公私钥对。

  • (2) 加密算法 Enc(par,M,pk)C(0)Enc(par, M , pk ) \to C _{(0)} :输入系统公开参数 par,消息空间中的明文 M ,某一用户的公钥 pk ,该算法输出由公钥 pk 加密的密文 C(0)C_{ (0)} ,其中0 表示密文 C 未被重加密过, C(0)C_{ (0)} 又被称作原始密文。

  • (3) 转换**生成算法 ReKeyGen(par,ski,pkj)rkijReKeyGen(par, sk _i , pk_ j ) \to rk_{i\to j}:输入系统公开参数par,授权用户的私钥 skisk_i,被授权用户的公钥pkjpk_j ,该算法输出转换** rkijrk_{i\to j}用于从授权用户到被授权用户之间的单向重加密。

  • (4) 重加密算法 ReEnc(par,rkij,Ci(n))Cj(n+1)ReEnc(par, rk_{i\to j} , C_{i(n)})\to C _{j(n+1)} :输入系统公开参数 par,用户 pkipk_i 到用户 pkjpk_j 的转换** rkijrk_{i\to j} ,及用户 pkipk_i 下的密文 Ci(n)C_{i(n)} ,其中 nn 表示密文 Ci(n)C_{i(n)} 被重加密的次数。该算法输出用户 pkjpk j 下的密文 Cj(n+1)C j(n+1),该密文Cj(n+1)C_{j(n+1)} 已进行过 n+1n+1 次重加密,或 \bot 表示密文 Ci(n)C_{i(n)} 不合法。

  • (5) 解密算法 Dec2(par,ski,Ci(n))MDec_2 (par, sk_i , C_{i(n)})\to M :输入输入系统公开参数 par,用户私钥 skisk_i ,及用户 pkipk_i 下的密文 Ci(n)C_{i(n)} 。该算法输出对应的明文 M ,或 \bot 表示密文Ci(n)C_{i(n)} 不合法。

该方案的算法还需满足一致性,即对于任意一组公共参数 par,任意明文空间中的消息 M ,任意用户公私钥对 (pki;ski)(pk i ;sk i )(pkj;skj)(pk j ;sk j ),下列等式成立:
Dec(par,ski,Enc(par,M,pki))=MDec(par, sk_i ,Enc(par, M , pk_i )) = M

Dec(par,skj,ReEnc(par,ReKeyGen(par,ski,pkj),Ci(n)))=MDec(par, sk_j ,ReEnc(par,ReKeyGen(par, sk_i , pk_j ), C_{i(n)} )) = M


PRE流程动图[4]^{[4]},如下所示:
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现

5.基于随机预言机模型的PRE算法实现[2]^{[2]}

代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
代理重加密(Proxy Re-Encryption)技术原理和Java代码实现

6. GitHub上关于PRE有参考价值的实现

  • Java:PRE java-sdk,参考地址[3]。
  • Go:goRecrypt,参考地址[2]。

这两种实现方案均采用的是随机预言机模型,在GitHub上有关于用RSA+AES方案,在生成rkijrk_{i\to j}步骤有漏洞,谨慎参考。

参考文献

[1] 王燚 . 基于身份的代理重加密及其应用研究[D]。
[2] https://github.com/SherLzp/goRecrypt
[3] https://github.com/geghamjivanyan/java-sdk
[4] https://blog.****.net/qq_26816591/article/details/83656988