前言

现在,我们非常高兴地宣布,我们在定义( https://github.com/nucypher/umbral-doc/blob/master/umbral-doc.pdf )和实现( https://github.com/nucypher/pyUmbral )Umbral的过程中已经到达了一个重要的里程碑。Umbral是一个门限代理(Threshold Proxy)重加密方案,可以在NuCypher KMS( https://blog.nucypher.com/nucypher-kms-decentralized-key-management-system-7783cdaad39e )中实现。
Umbral允许经安全授权的解密权限,可以在任意数量的公共网络参与者之间实现私人的数据共享。这一过程是在不向中间实体透露加密密钥的前提下实现的。
Umbral的特性在于其分裂密钥机制,由于它采用传统的代理重加密方案,所以重加密过程是通过一组节点进行的,而不仅仅是通过单个节点进行分配。
为了进行上述任务,Umbral需要指定一个人数,作为允许进行重加密操作的最少节点数量。这样一来,凭据就会在这些节点之中被拆分,非常类似于Shamir秘密共享的原理,只不过重加密的密钥是其中的一部分,而不是共享的私钥。
“Umbral”这个名字源于西班牙语的“门槛”一词,强调了该方案的分裂密钥特性,该特性在NuCypher KMS的分布式架构中发挥了核心作用。
我们的密码系统是以Python语言实现的,称为pyUmbral( https://github.com/nucypher/pyUmbral )。它使用Cryptography.io( http://cryptography.io/ )和OpenSSL( https://www.openssl.org/ )构建,是一款开源的即用型代理重新加密工具包。

关于代理重加密

代理重加密(PRE,https://blog.nucypher.com/proxy-re-encryption-playground-in-python-3bc66170b9bf)是一组算法,它允许半可信代理将密文从一个加密转换到另一个加密,而无需接触到底层明文的任何内容。为此,Alice(原始数据拥有者)创建了一个称为“重加密密钥”的特殊密钥,允许代理转换密文,从而使Bob可以在被称为“重加密”的过程中打开它们。
代理重加密非常适合用于在要与多方共享加密的数据使用场景( https://www.nics.uma.es/pub/papers/nunez2017proxy.pdf ),就不需要再与收件人共享私有的密钥,也不需要为每个收件人都加密整个消息后再进行代理。该加密让用户仅需要进行一次加密操作,随后可以根据收件人的公钥对其进行授权。这样一来,就不必要求所有数据所有者都同时在线,并且还可以轻松撤消某人的访问权限,也可以根据指定的条件来管理访问(例如,限制访问时间)。

Umbral:一种新的代理重加密方案

借助于Umbral,Alice(数据拥有者)可以通过由一组N个半可信代理执行的重新加密过程,将解密的权限授权给Bob(在NuCypher KMS的术语中,称为“Ursulas”)。当这些代理(至少为M个,至多为N个)通过执行重加密操作参与进来时,Bob能够使用自己的私钥解密出原始邮件。Umbral是门限密码系统(Threshold Cryptosystem)的一种,因为重新加密过程必须要N个Ursula中的M个参与其中。
根据另一个技术说明中所述,Umbral受到了ECIES( https://en.wikipedia.org/wiki/Integrated_Encryption_Scheme )和BBS98( https://link.springer.com/chapter/10.1007/BFb0054122 )代理重加密方案的启发,并且进行了一些改进。其中包括,使用了非交互式零知识(NIZK)证明来验证重加密的正确性,以确保KMS节点不会进行欺骗。Umbral的门限功能使用了Shamir秘密共享的思路,让重加密过程成为一个分布式的过程。
在技术文档中,可以查阅更详细的Umbral规范。

pyUmbral

如果没有进行适当的实例化,那么我们的密码系统就不会那么有价值了。pyUmbral是我们第一个Umbral的具体实现,它使用Python编写,并且开源。其加密使用了椭圆曲线密码学算法(特别是曲线secp256k1)和ChaCha20+Poly1305作为认证加密的原语,全部由Cryptography.io的OpenSSL绑定提供。从另一个方面看,pyUmbral不仅是Umbral的一个实现,还未执行基本椭圆曲线运算提供了一个非常出色且简单的框架,也促进了其他基于ECC密码系统的原型设计。
使用pyUmbral的方法非常简单,只需要几步,首先为Alice和Bob创建密钥:

from umbral import pre, keys# Generate umbral keys for Alice.
alices_private_key = keys.UmbralPrivateKey.gen_key()
alices_public_key = alices_private_key.get_pubkey()
# Generate umbral keys for Bob.
bobs_private_key = keys.UmbralPrivateKey.gen_key()
bobs_public_key = bobs_private_key.get_pubkey()

现在,任何知道Alice公钥的人都可以为她加密一条消息,就像典型的公钥加密过程一样,她可以使用她的私钥对其进行解密:

# Encrypt data with Alice's public key.
plaintext = b'Proxy Re-encryption is cool!'
ciphertext, capsule = pre.encrypt(alices_public_key, plaintext)# Decrypt data with Alice's private key.
cleartext = pre.decrypt(capsule, alices_private_key,ciphertext, alices_public_key)

请注意,加密的结果是生成一个密文和一个胶囊(Capsule)。使用Umbral,批量的数据会通过新密钥的对称密码进行加密,从而产生密文,而胶囊中则包含了在解密期间重新生成新密钥的必要信息,前提是需要提供有效的私钥。对于有兴趣的读者来说,这是一个典型的关键封装机制。
到目前为止,我们还没有看到代理重加密的过程。我们首先生成一组名为“kfrags”的重加密密钥片段,它们允许将密文的解密权限由Alice分配给Bob。由于Umbral是一个门限密码系统,所以我们需要指定分片总数(N)和所需门限(M)。

# Alice generates split re-encryption keys for Bob with "M of N".
kfrags = pre.split_rekey(alices_private_key, bobs_public_key, 10, 20)

在NuCypher KMS网络中,kfrags将被分配到网络的节点之中,因此Bob不得不与几个Ursulas进行通信,才可以获得整个重加密。在本文的例子中,我们将在本地进行简单的重加密:

# Ursula re-encrypts the capsule to obtain a cfrag.
# Bob attaches the cfrags to the capsule.
for kfrag in kfrags:cfrag = pre.reencrypt(kfrag, capsule)
capsule.attach_cfrag(cfrag)

最终,Bob只需要用他的私钥解密结果:

# Bob activates and opens the capsule.
cleartext = pre.decrypt(capsule, bobs_private_key,ciphertext, alices_public_key)

下面是一个关于pyUmbral的演示视频:
https://youtu.be/M8IZ1MTOd24

参考资料

PyUmbral实现参考:https://github.com/nucypher/pyUmbral
Umbral技术文档:https://github.com/nucypher/umbral-doc/blob/master/umbral-doc.pdf

Umbral:新型分散式密钥管理系统的代理重加密方案相关推荐

  1. UMBRAL:阈值代理重加密方案

    UMBRAL github link Overview Umbral是遵循密钥封装机制(KEM)方法的阈值代理重新加密方案. 它受到ECIES-KEM 和BBS98代理重新加密方案的启发. 使用Umb ...

  2. 隐私计算--代理重加密

    目录 代理重加密 传统公钥PRE算法流程 代理重加密的应用 参考: https://blog.csdn.net/qq_38232598/article/details/108929661? https ...

  3. 代理重加密和大火的NuCypher

    近来,很多人问起我知不知道代理重加密,或知不知道NuCypher(音:妞塞福呃),在朋友圈也看到有朋友分享或评论相关内容.彭博社的一篇文章把NuCypher和PolkaDot.Cosmos以及Nerv ...

  4. 使用代理重加密+PlatONE,来保证数据可信、安全地共享

    在制造.医药等行业中,有着大量沉睡的数据.利用这些数据,将有潜力推动技术创新或解密生命科学.但同时,这些数据中涉及商业机密和用户隐私保护,在不可信环境下实现安全的数据共享一直是一个难题,传统中心化方案 ...

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

    欢迎关注公众号:区块链之美, 致力于区块链技术研究,传播区块链技术和解决方案.区块链应用落地.区块链行业动态等. 1. 代理重加秘的应用介绍 由于大部分的云服务供应商并不能完全值得信任,云服务供应商可 ...

  6. 基于代理重加密技术的安全云盘

    介绍 代理重加密(proxy re encrytion) Proxy re-encryption (PRE) is a type of public-key encryption (PKE) that ...

  7. 代理重加密(Proxy Re-encryption)

    代理重加密就是委托可信第三方或是半诚实代理商将自己公钥加密的密文转化为可用另一方私钥解开的密文从而实现密码共享 现实世界中绝大多数提供云计算服务的公司没有什么诚信可言,你不能保证它会用你的数据做什么, ...

  8. 代理重加密 Proxy Re-Encryption

    好久没来了,把前段时间写的都贴上来... 1.研究背景 作用:密文云数据动态共享 基于用户数据隐私性考虑,用户存放在云端的数据都是加密形式存在的.而云环境中存在着大量数据共享的场景.由于数据拥有者对云 ...

  9. 代理重加密-入门学习笔记(四)

    代理重加密(PRE)(重密码学!) 原文: https://blog.csdn.net/Black_BearB/article/details/81228030 1.基本思想-流程结算 在云计算中,云 ...

最新文章

  1. 聊一聊:下班后的消息,要不要回?
  2. 【时序数据处理】pandas某些列由于n个数据导致的,通过Series生成Dataframe
  3. python加法器_[python bottle] 网页加法器
  4. Python练习:星号三角形 I
  5. python实现简单爬虫百度首页_python实现简单爬虫功能的示例
  6. 《程序猿的搬砖生活》九、那些伙伴和生活,既是人生也是回忆
  7. Android 屏幕适配方案
  8. vue项目中常见的跨域问题解决
  9. 手机浏览器自动打开快应用?
  10. 用TW8836驱动ST7701S TTL屏调试记录
  11. 经常打电话的人用什么耳机好?通话质量好的蓝牙耳机推荐
  12. 累死你的不是工作,而是工作方式
  13. 文件传输协议FTP/TFTP/SSH/SCP——应用层
  14. isSymmetric
  15. 牛客OR36 链表的回文结构
  16. Java将图片处理成背景透明的圆形图片
  17. 兰州大学本科生发表31篇论文引关注!本人及校方回应
  18. shiro权限管理基本原理和实现的整理
  19. 基于微信预约挂号小程序毕业设计毕设作品(3)后台功能
  20. 数据仓库-BI商业智能

热门文章

  1. 海马玩模拟器(Droid4X)
  2. 基于PI双闭环解耦控制的三相SVPWM电压型逆变器(2)--控制器设计
  3. linux docker重启nginx,记录一次docker导致宿主机重启故障解决方法
  4. ceph 查找 rbd image 存储位置
  5. 盐城大数据产业园人才公寓_5亿!高新区正邦大数据产业园开工!配套人才公寓…...
  6. 两化融合贯标有什么好处
  7. 【私有git】使用docker搭建gitlab-ce中文社区版服务器
  8. 阿里技术实战:数十万云服务器如何高效运维?
  9. 服务器硬件、部署LNMP动态网站 案例
  10. Python模拟电脑按键