- 本文的加法同态加密是用 Python 实现,所使用的第三方包为
phe
;
目录
paillier同态加密Python实现中的异常解决历程记录
Python 实现
测试代码
异常
关于同态加密的背景及原理,读者可参考高人的文章:
同态加密之Paillier算法_林立可的博客-CSDN博客_paillier同态加密之Paillier算法0,背景介绍同态加密,即原来在明文上的运算操作,经过同态加密后在密文上同样可以进行。一般有半同态和全同态加密之分:半同态加密 (Partial Homomorphic Encryption, PHE):只支持某些特定的运算法则 f ,PHE 的优点是原理简单、易实现,缺点是仅支持一种运算(加法或乘法);层次同态加密(Liveled HE,LHE):一般支持有限次数的加密算法,LHE 的优点是同时支持加法和乘法,并且因为出现时间比 PHE 晚,所以技术更加成熟、一https://blog.csdn.net/qq_40589204/article/details/116310125?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-6-116310125-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-6-116310125-null-null.nonecase
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
文档
每一个不曾起舞的日子,都是对生命的辜负。