基于python实现的paillier算法例子(极简)

参考:经典同态加密算法Paillier解读 - 原理、实现和应用

        文中对Pailler进行了详细的解读并分享了相关源代码链接:python-phe同台算法库

        举了一个简单的例子:

2.3 Paillier算法

这里代码中lam = λ  mu=μ,由以上计算过程获得

Alice将 n 和g 封装成公钥 public-key = (n, g)
将λ和μ封装成私钥: private-key = (λ, μ)

执行前我们需要安装gmpy2库

!pip install gmpy2

加密:

Bob需要对明文进行加密,即获取了Alice发来的公钥public-key = (n, g)

import gmpy2

p = 11 #大素数
q = 19 #大素数
n = 209 #乘积
lam = 90 #最小公倍数
g = 147 #随机整数
mu = 153 

#明文m 以及 随机数r已经定义
m = 8
r = 3
n_square = pow(n, 2) # n_square = 43681
c = gmpy2.mod(pow(g, m)*pow(r, n), n_square) # c =  32948
print(c)
#输出结果 32948 即加密结果

解密

c = 32948
m  = gmpy2.mod(L(gmpy2.mod(pow(c, lam), n_square), n) * mu, n) # m = 8

在这里,代码中有一个L函数,原文并没有写出来。

此函数在计算μ时实际上会用到,但原文没有进行函数计算,而是直接得出了μ的值。

然而,解密时仍然需要用到,下面附上。

函数L代码实现非常简单:

def L(x,n):
    return (x - 1) / n

至此,简单的Paillier算法示例结束。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Paillier加密算法是一种公钥加密算法,它的安全性基于一个难以解决的数学问题——大整数的离散对数问题。在这种算法中,任何人都可以生成公钥和私钥,公钥可以用于加密,私钥可以用于解密。Paillier加密算法的特点是可以实现同态加密,即对密文进行加法和乘法操作,得到的结果仍然是密文。 以下是Python实现Paillier加密算法的示例代码: ```python import random import math def lcm(a, b): return abs(a*b) // math.gcd(a, b) def generate_keypair(p, q, g): n = p * q lam = lcm(p-1, q-1) #选择一个随机数g,使得g的阶为λ(n),即g^λ(n) mod n = 1 if pow(g, lam, n*n) != 1: raise ValueError('g is not a generator.') #选择随机数L,使得L是λ(n)的倍数 L = (pow(g, lam, n*n) - 1) // n #计算μ值,使得μ=(L^-1) mod n mu = pow(L, -1, n) return (n, g), (lam, mu) def encrypt(public_key, plain_text): n, g = public_key #选择一个随机数r,使得r<n r = random.randint(1, n-1) #计算密文c = (g^m * r^n) mod n^2 c = (pow(g, plain_text, n*n) * pow(r, n, n*n)) % (n*n) return c def decrypt(private_key, public_key, cipher_text): lam, mu = private_key n, g = public_key #计算L(c^λ(n) mod n^2) mod n L = (pow(cipher_text, lam, n*n) - 1) // n #计算明文m=((L*μ) mod n) plain_text = (L * mu) % n return plain_text ``` 以上代码中,generate_keypair函数用于生成公钥和私钥,encrypt函数用于加密,decrypt函数用于解密。其中,p和q是两个大质数,g是模n的一个原根。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmartBeeL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值