paillier同态加密Python测试中的异常解决历程记录
- 本文的加法同态加密是用 Python 实现,所使用的第三方包为
phe
;
目录
paillier同态加密Python实现中的异常解决历程记录
关于同态加密的背景及原理,读者可参考高人的文章:
Python 实现
测试代码
from phe import paillier
import time
print('默认密钥长度:', paillier.DEFAULT_KEYSIZE)
pub_key, pri_key = paillier.generate_paillier_keypair(n_length=2048)
message_list = [22.3253, 2333, -2.22e-29]
# encryption
start_time = time.time()
encrypted_msg_list = [pub_key.encrypt(m) for m in message_list] # 异常点
end_time = time.time()
print('加密耗时:', end_time - start_time)
# decryption
time_start = time.time()
decrypted_msg_list = [pri_key.decrypt(c) for c in encrypted_msg_list]
time_end = time.time()
print('解密耗时:', time_end - time_start)
# 同态测试(加法、乘法)
a, b, c = encrypted_msg_list
a_sum = a + 5
a_sub = a - 3
b_mul = b * 1
c_div = c / -10.0
print('a:', a.ciphertext())
print('a_sum:', a_sum.ciphertext())
print("a + 5 =", pri_key.decrypt(a_sum))
print("a - 3 =", pri_key.decrypt(a_sub))
print("b * 1 =", pri_key.decrypt(b_mul))
print("c / -10.0 =", pri_key.decrypt(c_div))
# cipher + cipher
print((pri_key.decrypt(a) + pri_key.decrypt(b)) == pri_key.decrypt(a + b))
print((pri_key.decrypt(a) - pri_key.decrypt(b)) == pri_key.decrypt(a - b))
# print((pri_key.decrypt(a) * pri_key.decrypt(b)) == pri_key.decrypt(a * b)) # Err -- multiply not supported
异常
示意图
异常显示,第三方包
gmpy2
中不存在方法模块gmpy2.mod(a, b)
;
查询gmpy2
文档
发现对应功能的方法模块名已经变成
gmpy2.t_mod()
;于是追溯到
phe
内的util.py
文件,将其中的gmpy2.mod()
改为gmpy2.t_mod()
;
![]()
再次运行时,问题解决;
![]()
每一个不曾起舞的日子,都是对生命的辜负。