使用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
对象持有一组PrivateKeyShare
s,并包含一个解密函数,该函数调用每个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
-位素数p
和q
的乘积)。明文是空间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
的引用。
另外,PublicKey
和PrivateKingRing
类具有加密和解密整数列表的方便方法,如下所示。
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