使用damgard-jurik密码系统的阈值变量的同态加密。

damgard-jurik的Python项目详细描述


Damgard Jurik

Damgard-Jurik同态加密系统门限变量的一种实现。

目录

安装

需要Python3.6+。

pip install damgard-jurik

或者,代码可以克隆并在本地安装,如下所示。

git clone https://github.com/cryptovoting/damgard-jurik.git
cd damgard-jurik
pip install -e .

注意-e标志将指示pip将包安装为“可编辑”。也就是说,当在开发过程中对包的任何部分进行更改时,这些更改将立即在激活的python环境中在系统范围内可用。

此包的所有要求都应添加到setup.py

公钥和私钥

在这个存储库中实现的damgard jurik的阈值变体中,密钥对由单个公钥和使用Shamir's secret sharing拆分为多个组件的私钥组成。公钥对消息进行加密,而私钥的共享部分都参与解密,而无需重新构造私钥。因此,在私钥股份的持有人之间分配信任。

在这个实现中,公钥是带加密函数的PublicKey对象,而私钥共享是带解密函数的PrivateKeyShare对象,该解密函数使用私钥的共享部分执行解密。一个PrivateKeyRing对象持有一组PrivateKeyShares,并包含一个解密函数,该函数调用每个PrivateKeyShare的解密函数,并将结果合并以获得最终解密。

密钥生成

要生成PublicKey和相应的PrivateKeyRing,请运行以下命令:

fromdamgard_jurikimportkeygenpublic_key,private_key_ring=keygen(n_bits=64,s=1,threshold=3,n_shares=3)

keygen的参数如下:

  • n_bits:公钥和私钥共享中使用的加密位数。
  • s:公钥参数n被提升到的指数(其中n = p * q是两个n_bits-位素数pq的乘积)。明文是空间Z_n^s = {0, 1, ..., n^s - 1}中的整数。
  • threshold:解密加密消息所需的最小私钥共享数。
  • n_shares:要生成的私钥共享数。

加密和解密

加密和解密分别作为PublicKey类和PrivateKeyRing类的方法实现。

例如:

m=42c=public_key.encrypt(m)m_prime=private_key_ring.decrypt(c)# m_prime = 42

m这样的明文只是python整数,而像c这样的密文(加密明文)是EncryptedNumber类的实例。EncryptedNumber对象包含对明文的加密以及对用于加密明文的PublicKey的引用。

另外,PublicKeyPrivateKingRing类具有加密和解密整数列表的方便方法,如下所示。

m_list=[42,33,100]c_list=public_key.encrypt_list(m_list)m_prime_list=private_key_ring.decrypt_list(c_list)# m_prime_list = [42, 33, 100]

同态运算

由于damgard-jurik密码系统的附加同态性质,密文可以以这样的方式组合以获得相关明文之和的加密。此外,密文可以与未加密整数组合,以获得相关的明文和未加密整数的乘积。为了方便起见,EncryptedNumber类重写了+-*/运算符来实现这些操作。

例如:

m_1,m_2=42,33c_1,c_2=public_key.encrypt(m_1),public_key.encrypt(m_2)c=c_1+c_2m_prime=private_key_ring.decrypt(c)# m_prime = 75 = 42 + 33
m,s=42,2c=public_key.encrypt(m)c_prime=c*sm_prime=private_key_ring.decrypt(c_prime)# m_prime = 84 = 42 * 2

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么javaassist仅在项目中使用lambda时加载Entitymanager时抛出无效的常量类型:18   java如何识别用户是否在Alexa中首次启动技能?   java maven:如何防止插件更新   java StringBuilder将null追加为“null”   在java中,我可以在画布上绘制画布吗?   java如何在JRadioButton上垂直对齐文本和图像?   java“类是对象的集合”。这个定义是对的还是错的?   java如何用其他字符替换字符串中的1个或多个字符?   Java的HashSet<Double>及其子集的hashcode的唯一性   对象ArrayList的java并发修改错误   多线程Java线程:让EDT函数等待长时间运行的函数离开EDT   java如何重写方法,将一个实例变量和一个局部变量相加,从而生成一个数据类型为Double的新变量?