跳转到主要内容

NuCypher的Umbral代理重新加密实现

项目描述

PyPI Package latest release CircleCI build status Commits since latest release Documentation Status Discord

pyUmbral是Umbral门限代理重新加密方案的参考实现。它是开源的,使用Python编写,并使用OpenSSLCryptography.io

使用Umbral,Alice(数据所有者)可以通过一组半信任代理或“Ursulas”执行的重新加密过程,将任何加密为她的密文解密权限委托给Bob。当这些代理中的一部分达到阈值时,Bob能够将这些独立的重新加密组合起来,并使用他的私钥解密原始消息。

docs/source/.static/umbral.svg

pyUmbral是nucypher背后的加密引擎,nucypher是一个代理重新加密网络,旨在为去中心化系统提供隐私。

用法

密钥生成

与任何公钥加密系统一样,用户需要一个公钥和私钥对。此外,委托访问其数据(如本例中的Alice)的用户还需要一个签名密钥对。

from umbral import SecretKey, Signer

# Generate Umbral keys for Alice.
alices_secret_key = SecretKey.random()
alices_public_key = alices_secret_key.public_key()

alices_signing_key = SecretKey.random()
alices_signer = Signer(alices_signing_key)
alices_verifying_key = alices_signing_key.public_key()

# Generate Umbral keys for Bob.
bobs_secret_key = SecretKey.random()
bobs_public_key = bobs_secret_key.public_key()

加密

现在让我们使用Alice的公钥来加密数据。调用 pre.encrypt 返回密文和胶囊。请注意,任何拥有Alice公钥的人都可以执行此操作。

由于数据是用Alice的公钥加密的,因此Alice可以用她的私钥打开胶囊并解密密文。

from umbral import encrypt, decrypt_original

# Encrypt data with Alice's public key.
plaintext = b'Proxy Re-Encryption is cool!'
capsule, ciphertext = encrypt(alices_public_key, plaintext)

# Decrypt data with Alice's private key.
cleartext = decrypt_original(alices_secret_key, capsule, ciphertext)

重新加密密钥片段

当Alice想要授予Bob访问权限以打开她的加密消息时,她会创建重新加密密钥片段,或“kfrags”,然后将这些片段发送给N个代理或Ursulas

from umbral import generate_kfrags

# Alice generates "M of N" re-encryption key fragments (or "KFrags") for Bob.
# In this example, 10 out of 20.
kfrags = generate_kfrags(delegating_sk=alices_secret_key,
                         receiving_pk=bobs_public_key,
                         signer=alices_signer,
                         threshold=10,
                         shares=20)

重新加密

Bob请求几个Ursulas重新加密胶囊,以便他可以打开它。每个Ursula使用Alice提供的kfrag对胶囊进行重新加密,从而获得“胶囊片段”,或cfrag

Bob从几个Ursulas那里收集生成的cfrags。Bob必须至少收集到threshold个cfrags才能激活胶囊。

from umbral import reencrypt

# Several Ursulas perform re-encryption, and Bob collects the resulting `cfrags`.
cfrags = list()           # Bob's cfrag collection
for kfrag in kfrags[:10]:
    cfrag = pre.reencrypt(capsule=capsule, kfrag=kfrag)
    cfrags.append(cfrag)    # Bob collects a cfrag

Bob解密

最后,Bob通过附加至少threshold个cfrags来激活胶囊,然后解密重新加密的密文。

from umbral import decrypt_reencrypted

bob_cleartext = pre.decrypt_reencrypted(receiving_sk=bobs_secret_key,
                                        delegating_pk=alices_public_key,
                                        capsule=capsule,
                                        cfrags=cfrags,
                                        ciphertext=ciphertext)
assert bob_cleartext == plaintext

有关更详细的用法示例,请参阅文档目录。

快速安装

要安装pyUmbral,只需使用pip

$ pip3 install umbral

或者,您可以检出存储库并从中安装。NuCypher团队使用pipenv来管理pyUmbral的依赖关系。推荐的安装步骤如下

$ sudo pip3 install pipenv
$ pipenv install

安装后,您可以通过运行pipenv shell在当前终端会话中激活项目虚拟环境。

有关pipenv的更多信息,请参阅此处官方文档:https://docs.pipenv.org/

学术论文

Umbral方案学术论文和加密规范可在GitHub上找到。

“Umbral:一种门限代理重新加密方案”由David Nuñez撰写https://github.com/nucypher/umbral-doc/blob/master/umbral-doc.pdf

支持与贡献

安全

如果您发现任何nucypher代码中的漏洞,请通过security@nucypher.com发送相关发现信息。我们将与研究人员合作,协调合作伙伴和用户之间的漏洞披露,以确保成功缓解漏洞。

在整个报告过程中,我们期望研究人员遵守可能根据披露严重程度而变化的禁令期。这确保我们有时间修复任何问题,确定其他问题(如果有),并通知我们的用户。

有时漏洞的性质更为敏感,需要采取额外预防措施。我们很高兴与您合作,使用更安全的媒介,例如Signal。请发送电子邮件至security@nucypher.com,我们将协调一个我们都感到舒适的通信渠道。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

umbral-0.3.0.tar.gz (35.3 kB 查看哈希值)

上传时间 源代码

构建分发

umbral-0.3.0-py3-none-any.whl (39.0 kB 查看哈希值)

上传时间 Python 3

支持者