modify code style

This commit is contained in:
sangge-rockpi 2024-04-14 06:18:42 +00:00
parent b2354738fe
commit 4f62e02b88

View File

@ -2,10 +2,12 @@ import random
from collections.abc import Mapping
from encoding import EncodedNumber
from util import invert, powmod, getprimeover
from visualize import show_name_args
DEFAULT_KEYSIZE = 1024 # 定义默认的二进制数长度
@show_name_args
def generate_paillier_keypair(
private_keyring=None, n_length=DEFAULT_KEYSIZE
): # 生成公钥和私钥的函数
@ -33,6 +35,7 @@ def generate_paillier_keypair(
return public_key, private_key # 返回公钥和私钥
@show_name_args
class PaillierPublicKey(object): # 定义公钥类
def __init__(self, n):
self.g = n + 1
@ -42,7 +45,9 @@ class PaillierPublicKey(object): # 定义公钥类
def __repr__(self): # 用于打印出该类的对象
public_key_hash = hex(hash(self))[2:]
return "<PaillierPublicKey {}>".format(public_key_hash[:10]) # 返回表示对象的字符串
return "<PaillierPublicKey {}>".format(
public_key_hash[:10]
) # 返回表示对象的字符串
def __eq__(self, other): # 用于比较两个对象是否相等,并返回比较结果
return self.n == other.n
@ -53,11 +58,15 @@ class PaillierPublicKey(object): # 定义公钥类
def get_n_and_g(self): # 获取该公钥的 n 和 g 的值
return self.n, self.g
def raw_encrypt(self, plaintext, r_value=None): # 用于返回加密后的密文,其中r_value可给随机数赋值
def raw_encrypt(
self, plaintext, r_value=None
): # 用于返回加密后的密文,其中r_value可给随机数赋值
if not isinstance(plaintext, int): # 判断plaintext是否是整数
raise TypeError("明文不是整数,而是: %s" % type(plaintext))
if self.n - self.max_int <= plaintext < self.n: # 对于非常大的明文,使用特殊的计算方法进行加密:
if (
self.n - self.max_int <= plaintext < self.n
): # 对于非常大的明文,使用特殊的计算方法进行加密:
neg_plaintext = self.n - plaintext # = abs(plaintext - nsquare)
neg_ciphertext = (self.n * neg_plaintext + 1) % self.nsquare
nude_ciphertext = invert(neg_ciphertext, self.nsquare)
@ -85,7 +94,9 @@ class PaillierPublicKey(object): # 定义公钥类
encoding = EncodedNumber.encode(self, value, precision)
return self.encrypt_encoded(encoding, r_value)
def encrypt_encoded(self, encoding, r_value): # 将已编码的数值对象转换为加密后的数值对象,并可以选择进行混淆处理
def encrypt_encoded(
self, encoding, r_value
): # 将已编码的数值对象转换为加密后的数值对象,并可以选择进行混淆处理
obfuscator = r_value or 1 # 为随机数r_value,没有则默认为1
ciphertext = self.raw_encrypt(encoding.encoding, r_value=obfuscator)
encrypted_number = EncryptedNumber(self, ciphertext, encoding.exponent)
@ -143,7 +154,9 @@ class PaillierPrivateKey(object): # 私钥
"参数应该是EncryptedNumber," " 参数不能为: %s" % type(encrypted_number)
)
if self.public_key != encrypted_number.public_key: # 如果公钥与加密数字的公钥不一致
if (
self.public_key != encrypted_number.public_key
): # 如果公钥与加密数字的公钥不一致
raise ValueError("加密信息不能被不同的公钥进行加密!")
if Encoding is None: # 将Encoding设置为未赋值的EncodedNumber变量
@ -214,8 +227,12 @@ class PaillierPrivateKeyring(Mapping): # 私钥环类,并继承了Mapping类
def add(self, private_key): # 向私钥环中添加私钥
if not isinstance(private_key, PaillierPrivateKey): # 对要添加的私钥进行判断
raise TypeError("私钥应该是PaillierPrivateKey类型, " "而不是 %s" % type(private_key))
self.__keyring[private_key.public_key] = private_key # 将该公钥和对用的私钥一块儿加入到私钥环中
raise TypeError(
"私钥应该是PaillierPrivateKey类型, " "而不是 %s" % type(private_key)
)
self.__keyring[private_key.public_key] = (
private_key # 将该公钥和对用的私钥一块儿加入到私钥环中
)
def decrypt(self, encrypted_number): # 对密文进行解密
relevant_private_key = self.__keyring[
@ -242,7 +259,9 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
): # 如果公钥不是PaillierPublicKey
raise TypeError("公钥必须是PaillierPublicKey")
def __add__(self, other): # 运算符重载,重载为EncryptedNumber与(EncryptedNumber/整数/浮点数)的加法
def __add__(
self, other
): # 运算符重载,重载为EncryptedNumber与(EncryptedNumber/整数/浮点数)的加法
if isinstance(other, EncryptedNumber):
return self._add_encrypted(other)
elif isinstance(other, EncodedNumber):
@ -256,7 +275,9 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
def __mul__(self, other): # 运算符重载,重载为EncryptedNumber与(整数/浮点数)的乘法
# 判断other对象是否是EncryptedNumber,如果是:
if isinstance(other, EncryptedNumber):
raise NotImplementedError("EncryptedNumber 与 EncryptedNumber 之间不能相乘!")
raise NotImplementedError(
"EncryptedNumber 与 EncryptedNumber 之间不能相乘!"
)
if isinstance(other, EncodedNumber):
encoding = other
@ -269,7 +290,9 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
def __rmul__(self, other): # 反乘,处理整数/浮点数与EncryptedNumber之间的乘法
return self.__mul__(other)
def __sub__(self, other): # 运算符重载,重载为EncryptedNumber与(EncryptedNumber/整数/浮点数)的减法
def __sub__(
self, other
): # 运算符重载,重载为EncryptedNumber与(EncryptedNumber/整数/浮点数)的减法
return self + (other * -1)
def __rsub__(self, other): # 处理整数/浮点数与EncryptedNumber之间的减法
@ -310,9 +333,13 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
self, new_exp
): # 返回一个指数较低但大小相同的数(即返回一个同值的,但指数较低的EncryptedNumber
if new_exp > self.exponent:
raise ValueError("新指数值 %i 应比原指数 %i 小! " % (new_exp, self.exponent))
raise ValueError(
"新指数值 %i 应比原指数 %i 小! " % (new_exp, self.exponent)
)
multiplied = self * pow(EncodedNumber.BASE, self.exponent - new_exp) # 降指数后的乘积
multiplied = self * pow(
EncodedNumber.BASE, self.exponent - new_exp
) # 降指数后的乘积
multiplied.exponent = new_exp # 降指数后的新指数
return multiplied
@ -349,7 +376,9 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
b.encoding, 1
) # 用公钥加密b.encoding后的标量
sum_ciphertext = a._raw_add(a.ciphertext(False), encrypted_scalar) # 进行相加操作
sum_ciphertext = a._raw_add(
a.ciphertext(False), encrypted_scalar
) # 进行相加操作
return EncryptedNumber(a.public_key, sum_ciphertext, a.exponent)
def _add_encrypted(self, other): # 对EncodedNumber与EncodedNumber加法加密
@ -396,8 +425,12 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
result = 0 # 将初始值设置为0
for i in args:
if not isinstance(i, (int, float, EncryptedNumber)):
raise TypeError("期望密文应该是int/float/EncryptedNumber型, 而不是 %s" % type(i))
if isinstance(i, int or float): # 如果是 int 或 float 明文型,则先将明文加密在进行运算
raise TypeError(
"期望密文应该是int/float/EncryptedNumber型, 而不是 %s" % type(i)
)
if isinstance(
i, int or float
): # 如果是 int 或 float 明文型,则先将明文加密在进行运算
result += self.public_key.encrypt(i)
else:
result += i # 第一次循环:标量与密文相加;后面的循环,密文与密文相加
@ -424,7 +457,9 @@ class EncryptedNumber(object): # 浮点数或整数的Pailier加密
args[2]: 给第一个参数设置的权值
"""
total_weight = sum(args[2::2]) # 计算权值的总和(使用切片操作从参数列表中取出索引为参数权值的元素)
total_weight = sum(
args[2::2]
) # 计算权值的总和(使用切片操作从参数列表中取出索引为参数权值的元素)
if total_weight != 1:
raise TypeError("加权平均算法的权值设置错误!请重新设置!")
else:
@ -482,7 +517,9 @@ if __name__ == "__main__": # 主函数
x_encrypted = Public_Key.encrypt(x) # 加密后的x
y_encrypted = Public_Key.encrypt(y) # 加密后的y
z_encrypted = Public_Key.encrypt(z) # 加密后的z
t_encrypted = x_encrypted + y_encrypted * 0.5 # 在x,y保密的情况下计算t,得到加密后的t(t_encrypted)
t_encrypted = (
x_encrypted + y_encrypted * 0.5
) # 在x,y保密的情况下计算t,得到加密后的t(t_encrypted)
# x_encrypted = x_encrypted.increment() # 自增
# y_encrypted = y_encrypted.decrement() # 自减