paillier密码加解密实现(python)

Paillier(帕累尔密码)

原理

image-20230417152609934

加解密脚本

from random import randint
from gmpy2 import gcd, powmod, invert, lcm
from Crypto.Util.number import getPrime

L = lambda x, n: (x - 1) // n


def paillier_keygen(bits: int = 1024):
    p = getPrime(bits // 2)
    q = getPrime(bits // 2)
    n = p * q
    lam = lcm(p - 1, q - 1)
    g = randint(1, n * n - 1)
    t = L(powmod(g, lam, n ** 2), n)
    while gcd(t, n) != 1:
        g = randint(1, n * n - 1)
        t = L(powmod(g, lam, n ** 2), n)
    mu = invert(t, n)
    return n, g, lam, mu

def paillier_encrypt(m: int, n: int, g: int) -> int:
    r = randint(1, n - 1)
    while gcd(r, n) != 1:
        r = randint(1, n - 1)
    mod = n * n
    c = powmod(g, m, mod) * powmod(r, n, mod) % mod
    return c

def paillier_decrypt(c: int, n: int, g: int, lam: int, mu: int) -> int:
    m = L(powmod(c, lam, n ** 2), n) * mu % n
    return m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bestkasscn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值