python游乐场门票
代理重新加密是一组算法,该算法允许不受信任的代理将密文从使用一个密钥加密的密文转换为使用另一个密钥的密文,而无需了解有关基础纯文本的任何知识。 代理重新加密算法通常用作公共密钥加密,其中使用公共-私有密钥对分别加密和解密数据。
作为类,代理重新加密非常适合您要与多方共享加密数据的用例。 代理重新加密可以让您一次加密数据,然后根据收件人的公共密钥委派访问权限,而不是与收件人天真地共享您的私钥(不安全)或为每个收件人N次加密整个消息。 这消除了数据所有者在线的要求,并且还简化了访问权限的撤销。
![](https://i-blog.csdnimg.cn/blog_migrate/cd6ed7ad8f0c03f37539dbf9bf7efe2a.png)
代理重新加密算法有两种主要形式:交互式和非交互式。 交互式版本委派对私钥的访问,而非交互式版本则委派对公钥的访问。
今天,我们在GitHub上发布了一种更简单的算法 (也是第一个发明的)的实现。 它基于椭圆曲线。 对于加密和解密,它类似于在椭圆曲线素数字段上运行的ElGamal,并且是一种交互式算法,需要了解收件人的私钥。
安装
该库是用Python编写的。 它需要`libssl-dev`和`libgmp-dev`。 它是charm加密库中相同算法的稍有改进的版本,具有简化的安装过程,线程安全且更适合实际使用。
要在Linux(Debian,Ubuntu,Mint)中安装:
sudo apt-get install build-essential # Compilers etc
sudo apt-get install python3 # Written for Python3.x
sudo apt-get install python3-dev libssl-dev libgmp-dev # Dependencies to compile C extensions
在Mac上:
brew install python3
brew install gmp
现在我们已经摆脱了依赖关系,您可以安装`nucypher-pre-python`库。 我建议在`virtualenv`中进行。
git clone https://github.com/nucypher/nucypher-pre-python.git
cd nucypher-pre-python
pip3 install -e .
在ipython终端而不是标准python中尝试它也很方便。
现在,让我们开始使用该库!
In [1]: from npre import bbs98
我们需要初始化重新加密对象:
In [2]: pre = bbs98.PRE()
在BBS98算法中,有一个共享的非秘密随机数,它定义了重新加密算法的参数。 该数字与曲线名称(默认为“ secp256k1”)一起生成并保存在类实例中。
发送方和接收方都必须使用相同的参数进行初始化。 为此,我们可以序列化和反序列化“ pre”对象(反序列化发生在另一台机器上)。 如果您在本地运行本教程(以及发送方和接收方功能),则没有必要:
In [3]: backup = pre.serialize()
In [4]: backup
Out[4]: b'\x82\xa5curve\xcd\x02\xca\xa1g\xda\x00.1:A8LQod5lJgbCnh3vQd+RGSe3qDrhw8n8Ju8uZ7dpzKB+'
In [5]: pre = bbs98.PRE.deserialize(backup)
现在,让我们为数据的所有者爱丽丝和收件人的鲍勃生成密钥对`(sk,pk)`:
In [6]: sk_a = pre.gen_priv(dtype=bytes)
In [7]: pk_a = pre.priv2pub(sk_a)
In [8]: sk_b = pre.gen_priv(dtype=bytes)
In [9]: pk_b = pre.priv2pub(sk_b)
这里的“ sk”表示“秘密密钥”,而“ pk”表示“公共密钥”。
让我们看看这些键实际上是什么:
In [10]: sk_a
Out[10]: b'0:JKwy+rxGu+BvaZ0cKgV/alsfYfhZoVNm63CrCvL/faI='
In [11]: pk_a
Out[11]: b'1:A5NZVIEGQgao/knbwDbR4cNaxHQwkJCRWUJDCm8vQCJe'
In [12]: sk_b
Out[12]: b'0:otOz8XATKx1rX+Ypp+/2NDw2ej7n+TUx8rBTKRm7KtI='
In [13]: pk_b
Out[13]: b'1:A9gOmE39Kwuhpbafylfm3d+3y7FLRnupV8pcTYDg0xTl'
现在,让我们加密一些东西:
In [14]: msg = b'Hello world'
In [15]: emsg = pre.encrypt(pk_a, msg)
In [16]: emsg
Out[16]: b'\x92\xda\x00.1:Aw3nUfn9bNTfCtG0KPkaugzDGKlN3a/Gq0MH3uaAMBkp\xda\x00.1:A3qkvzG47dt5xiODccILFPbLw8CaTZsPlUbJoKbegl/T'
让我们看看是否可以解密此消息:
In [17]: pre.decrypt(sk_a, emsg)
Out[17]: b'Hello world'
如果我们尝试使用鲍勃的密钥解密怎么办?
In [18]: pre.decrypt(sk_b, emsg)
Out[18]: b'\x94_\xf3W\xb5aX8'
当然不行!
现在,让我们转换要为Bob加密的数据。 为此,我们生成了一个重新加密密钥:
In [19]: re_ab = pre.rekey(sk_a, sk_b)
并转换消息。 转换可以由既不知道“ sk_a”也不知道“ sk_b”的远程代理完成:
In [20]: emsg_b = pre.reencrypt(re_ab, emsg)
In [21]: emsg_b
Out[21]: b'\x92\xda\x00.1:AyafJONHL/ZgrkwKFzFQtEnr8Em5k9hxP/ICzAGCNm4I\xda\x00.1:A3qkvzG47dt5xiODccILFPbLw8CaTZsPlUbJoKbegl/T'
我们可以解密重新加密的消息吗?
In [22]: pre.decrypt(sk_b, emsg_b)
Out[22]: b'Hello world'
因此,我们将原始为Alice加密的消息重新加密为Bob。 但是要委派对Bob的访问权限,Alice需要知道他的秘密密钥“ sk_b”。 绝对不理想! 是否可以避免此要求并改用Bob的公钥?
一种解决方案是使用其他代理重新加密算法,例如AFGH。
但是有一种方法可以使用当前算法来实现。 当爱丽丝授权访问鲍勃时,她可以生成一个临时密钥“ sk_e”并产生一个重新加密密钥“ rk_ae”。 然后,她用Bob的公钥pk_b加密sk_e,产生e_b。
代理将被同时赋予rk_e和e_b。 当鲍勃连接时,代理服务器会将其交给他“ e_b”。 然后,Bob可以从中提取出“ pk_e”,并用它来解密来自代理的加密消息。
可以自由使用该库,但要安全:此特定实现尚未经过安全审核,目前仅用于教育目的:-)
翻译自: https://hackernoon.com/proxy-re-encryption-playground-in-python-3bc66170b9bf
python游乐场门票