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

欢迎关注公众号:区块链之美, 致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。

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

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

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

显然,传统的加密或数字签名方案并不具有密文转换功能,而代理重加密 ( P r o x y R e − E n c r y p t i o n , P R E ) (Proxy Re-Encryption,PRE) (ProxyReEncryptionPRE)技术是一种可以对密文进行安全转换的加密方法,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 是一种对密文进行安全转换的加密技术,在 1998 1998 1998 年欧密会上,Blaze 等首次提出了代理重加密的概念 。在代理重加密中,基于授权人(delegator)公钥加密的密文可以被转换为另一种密文,且保持对应明文不变,被转换后的密文可以由被授权人(delegate)的私钥进行解密。该密文转换过程由一个半可信的代理者(proxy)执行,在执行该过程前,代理者需要持有一个由授权人到被授权人的转换密钥,该转换密钥一般由授权人事先生成并交给代理者。同时在密文转换的整个过程中,代理者无法获取关于该密文对应明文的任何信息。

4.传统公钥PRE算法流程

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

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

  • (1) 钥生成算法 K e y G e n ( p a r ) → ( p k ; s k ) KeyGen(par) \to (pk;sk) KeyGen(par)(pk;sk):输入系统公开参数 par,该算法输出 ( p k , s k ) (pk,sk) (pk,sk)作为一个用户的公私钥对。

  • (2) 加密算法 E n c ( p a r , M , p k ) → C ( 0 ) Enc(par, M , pk ) \to C _{(0)} Enc(par,M,pk)C(0) :输入系统公开参数 par,消息空间中的明文 M ,某一用户的公钥 pk ,该算法输出由公钥 pk 加密的密文 C ( 0 ) C_{ (0)} C(0) ,其中0 表示密文 C 未被重加密过, C ( 0 ) C_{ (0)} C

  • 16
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
代理加密是一种加密方式,它通过使用代理服务器来加密通信内容,从而实现更加安全的通信。在 Java 8 中,可以使用代理模式来实现代理加密。 首先,需要创建一个代理类,实现 `java.lang.reflect.InvocationHandler` 接口。该接口只有一个方法 `invoke`,需要在该方法中对方法调用进行拦截和加密处理。可以使用一些加密算法,如 AES 等来加密通信内容。 接下来,在需要进行代理加密的地方,创建一个代理对象,调用 `java.lang.reflect.Proxy` 类的 `newProxyInstance` 方法。该方法需要传入三个参数:类加载器、接口数组和代理类实例。在 `invoke` 方法中,可以将方法调用转发给实际的对象,并在返回结果之前进行加密处理。 以下是一个简单的示例代码: ``` import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class ProxyEncryption implements InvocationHandler { private Object target; public ProxyEncryption(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 使用 AES 加密算法加密通信内容 SecretKeySpec keySpec = new SecretKeySpec("password".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedData = cipher.doFinal(((String) args[0]).getBytes()); // 转发方法调用给实际对象,并返回加密结果 return method.invoke(target, new String(encryptedData)); } public static void main(String[] args) { // 创建实际对象 SomeService service = new SomeServiceImpl(); // 创建代理对象,并将方法调用转发给实际对象 SomeService proxy = (SomeService) Proxy.newProxyInstance( ProxyEncryption.class.getClassLoader(), new Class<?>[] { SomeService.class }, new ProxyEncryption(service)); // 调用代理对象方法,实现代理加密 System.out.println(proxy.encryptData("some data")); } } interface SomeService { String encryptData(String data); } class SomeServiceImpl implements SomeService { @Override public String encryptData(String data) { return "encrypted: " + data; } } ``` 在上面的示例代码中,`ProxyEncryption` 类实现了 `java.lang.reflect.InvocationHandler` 接口,并在 `invoke` 方法中使用 AES 加密算法加密通信内容。在 `main` 方法中,创建实际对象 `SomeServiceImpl`,并使用 `Proxy.newProxyInstance` 方法创建一个代理对象 `SomeService`,将方法调用转发给实际对象 `SomeServiceImpl`,实现代理加密。 注意,这里的加密算法只是一个简单的示例,实际应用中需要根据具体的需求选择更加安全的加密算法,并且需要对加密过程进行更加细致的设计和实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值