python环境下paillier同态密码库踩坑记录

前言

为了使用一个paillier库,我在一个个坑里断断续续摸爬滚打了两天,好在成功上岸。作为一个刚刚接触python不久的菜鸟,本篇不讨论如何修轮子造轮子的问题,仅仅作为芸芸众菜记录一下我遇到的环境上的问题,如何解决,原因是什么。这些不仅是我的记录,也希望它能帮助遇到同样问题的你节省时间。感谢StackOverflow和CSDN上同侪的指点,如果有你们觉得更好的解决方案,欢迎分享和讨论~

1. Paiilier库和Python版本的选择(非常重要)

文中会涉及一些工具的文档,但由于年久失修等因素,按照文档一步步走就是在踩我踩过的坑。因此无论和这些官档玩得多么开心,请记得回来看一看或者至少看完再去。

Let’s start from here: python-paillier docs
在安装phe(Partially Homomorphic Encryption)库之前,注意文档中的提示:文档给的提示
所以python版本>=3.3就可以了吗?并不是。我们接着要去PyPI单独看一下phe的安装说明:phe(插一句,PyPI真的是个非常好用的和python相关的各种包的安装集合地)

注意这里👇在安装phe之前它推荐安装gmpy2,虽然不是必须的,但gmpy2做大数计算和精确计算以及提高计算效率都很有帮助。
phe安装说明中对于gmpy2的描述
我觉得此非必须为必须,因为装完所有的东西之后,我们需要一些demo来跑一跑,这些demo大多没有例外都是依赖gmpy2的。

说到gmpy2,这是一个简单的东西吗?不,现有的gmpy2并不支持在python3.5以后的环境中运行

  • 19
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
当然可以!以下是一个使用Python编写的Paillier同态加密算法的简单实现: ```python import random import math def generate_keypair(keysize): p = generate_prime(keysize // 2) q = generate_prime(keysize // 2) n = p * q g = n + 1 l = (p - 1) * (q - 1) mu = multiplicative_inverse(l, n) public_key = (n, g) private_key = (l, mu) return public_key, private_key def generate_prime(keysize): while True: num = random.randrange(2**(keysize-1), 2**keysize) if is_prime(num): return num def is_prime(num): if num < 2: return False for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True def multiplicative_inverse(a, n): t = 0 newt = 1 r = n newr = a while newr != 0: quotient = r // newr t, newt = newt, t - quotient * newt r, newr = newr, r - quotient * newr if r > 1: raise ValueError("a is not invertible") if t < 0: t = t + n return t def encrypt(public_key, plaintext): n, g = public_key while True: r = random.randint(1, n) if math.gcd(r, n) == 1: break c = (pow(g, plaintext, n**2) * pow(r, n, n**2)) % (n**2) return c def decrypt(private_key, ciphertext): l, mu = private_key n = l * mu - 1 c = pow(ciphertext, l, n**2) plaintext = (L(c, n) * mu) % n return plaintext def L(x, n): return (x - 1) // n # 示例用法 plaintext1 = 42 plaintext2 = 17 # 生成密钥对 public_key, private_key = generate_keypair(1024) # 加密 ciphertext1 = encrypt(public_key, plaintext1) ciphertext2 = encrypt(public_key, plaintext2) # 同态加法(加密结果相乘) ciphertext_sum = (ciphertext1 * ciphertext2) % (public_key[0]**2) # 解密 decrypted_sum = decrypt(private_key, ciphertext_sum) print("加密前的数据:", plaintext1, plaintext2) print("加密后的数据:", ciphertext1, ciphertext2) print("解密后的结果:", decrypted_sum) ``` 这只是一个简单的实现,如果需要更完整和安全的Paillier同态加密算法,建议使用现有的加密或深入了解该算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值