Paillier 加法同态加密算法详细介绍

这篇具有很好参考价值的文章主要介绍了Paillier 加法同态加密算法详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Paillier 加法同态加密算法详细介绍

1. 概述

Paillier 同态加密算法是一种非对称加密算法,由 Pascal Paillier 在 1999 年提出。它的独特之处在于其同态特性,即能在加密数据上直接进行运算而无需解密。这使得它在数据隐私保护、安全多方计算等领域有着广泛的应用。

2. 原理

Paillier 加密算法主要包括三个部分:密钥生成、加密和解密。

2.1 密钥生成

  1. 选择两个大素数 p p p q q q: 这两个数越大,算法越安全。
  2. 计算 n = p × q n = p \times q n=p×q: 这是公钥的一部分。
  3. 计算 λ: λ 是 Carmichael’s totient 函数的输出,即 最小公倍数 lcm ( p − 1 , q − 1 ) \text{lcm}(p-1, q-1) lcm(p1,q1)
  4. 选择一个整数 g: g 的选取应满足 g ∈ Z n 2 ∗ g \in \mathbb{Z}_{n^2}^* gZn2

公钥为 ( n , g ) (n, g) (n,g),私钥为 λ \lambda λ

2.2 加密

对于一个明文消息 m m m,加密过程如下:

  1. 选择一个随机数 r r r: r r r 是一个随机数,满足 r ∈ Z n ∗ r \in \mathbb{Z}_n^* rZn
  2. 计算密文 c c c: 使用公钥 ( n , g ) (n, g) (n,g) 计算 c = g m × r n m o d    n 2 c = g^m \times r^n \mod n^2 c=gm×rnmodn2

2.3 解密

对于一个密文 c c c,解密过程如下:

  1. 计算 u = c λ m o d    n 2 u = c^\lambda \mod n^2 u=cλmodn2
  2. 计算 L ( u ) L(u) L(u): 其中 L L L 是一个特定的函数,定义为 L ( x ) = x − 1 n L(x) = \frac{x-1}{n} L(x)=nx1
  3. 计算原始消息 m m m: 使用私钥 λ \lambda λ 和预先计算的 L ( g λ m o d    n 2 ) L(g^\lambda \mod n^2) L(gλmodn2) 的模逆元素,计算 m = L ( u ) × modinv ( L ( g λ m o d    n 2 ) , n ) m o d    n m = L(u) \times \text{modinv}(L(g^\lambda \mod n^2), n) \mod n m=L(u)×modinv(L(gλmodn2),n)modn

3. Paillier 加密算法的解密过程

假设我们有密文 c c c,公钥 ( n , g ) (n, g) (n,g) 和私钥 λ \lambda λ。明文消息为 m m m,随机数 r r r 用于加密过程。

3.1 加密过程回顾

加密过程定义为:

c = g m ⋅ r n m o d    n 2 c = g^m \cdot r^n \mod n^2 c=gmrnmodn2

3.2 解密步骤
  1. 计算 u u u

    首先计算 u = c λ m o d    n 2 u = c^\lambda \mod n^2 u=cλmodn2。由于 c = g m r n c = g^m r^n c=gmrn,我们有:

    u = ( g m r n ) λ m o d    n 2 u = (g^m r^n)^\lambda \mod n^2 u=(gmrn)λmodn2

  2. 利用 Carmichael 函数的性质

    由于 λ = lcm ( p − 1 , q − 1 ) \lambda = \text{lcm}(p-1, q-1) λ=lcm(p1,q1),根据 Carmichael 函数的性质,对于任意 a ∈ Z n ∗ a \in \mathbb{Z}_n^* aZn

    a λ ≡ 1 m o d    n a^\lambda \equiv 1 \mod n aλ1modn

    这意味着对于 r n r^n rn,有:

    ( r n ) λ ≡ 1 m o d    n 2 (r^n)^\lambda \equiv 1 \mod n^2 (rn)λ1modn2(把 r λ = k n + 1 r^\lambda = kn+1 rλ=kn+1带入展开)

  3. 分析 u u u 的表达式

    通过将 g m g^m gm r n r^n rn 分开,我们可以重写 u u u 如下:

    u = ( g m ) λ ⋅ ( r n ) λ m o d    n 2 u = (g^m)^\lambda \cdot (r^n)^\lambda \mod n^2 u=(gm)λ(rn)λmodn2

    我们可以将 u u u 简化为:

    u = ( g m ) λ ⋅ 1 m o d    n 2 u = (g^m)^\lambda \cdot 1 \mod n^2 u=(gm)λ1modn2

    u = ( k n + 1 ) m m o d    n 2 u = (kn+1)^m \mod n^2 u=(kn+1)mmodn2

  4. 应用 L L L 函数

    接下来,我们应用 L L L 函数到 u u u 上。定义 L ( x ) = x − 1 n L(x) = \frac{x - 1}{n} L(x)=nx1,我们得到:

    L ( u ) = L ( ( k n + 1 ) m m o d    n 2 ) = [ ( k n + 1 ) m m o d    n 2 ] − 1 n = ( 1 + m ⋅ k n m o d    n 2 ) − 1 n = k m m o d    n 2 L(u) = L((kn+1)^m\mod n^2) = \frac{[(kn+1)^m\mod n^2] - 1}{n}=\frac{(1+m \cdot kn \mod n^2)-1}{n}=km \mod n^2 L(u)=L((kn+1)mmodn2)=n[(kn+1)mmodn2]1=n(1+mknmodn2)1=kmmodn2

  5. 计算模逆元素 μ \mu μ

    在 Paillier 加密算法中,模逆元素 μ \mu μ是解密过程的关键部分。它是基于 g g g的一个特定幂的 L L L函数值的模逆元素。

    • 计算 L ( g λ m o d    n 2 ) L(g^\lambda \mod n^2) L(gλmodn2)

      首先,我们计算 g λ g^\lambda gλ m o d    n 2 \mod n^2 modn2下的结果,然后应用 L L L函数。根据 L L L函数的定义( L ( x ) = x − 1 n L(x) = \frac{x - 1}{n} L(x)=nx1),我们有:

      L ( g λ m o d    n 2 ) = ( g λ m o d    n 2 ) − 1 n = ( 1 + k n m o d    n 2 ) − 1 n L(g^\lambda \mod n^2) = \frac{(g^\lambda \mod n^2) - 1}{n} =\frac{(1+kn \mod n^2) - 1}{n} L(gλmodn2)=n(gλmodn2)1=n(1+knmodn2)1

    • 计算 μ \mu μ

      接下来,我们计算 L ( g λ m o d    n 2 ) L(g^\lambda \mod n^2) L(gλmodn2)的模逆元素 μ \mu μ

      μ = modinv ( L ( g λ m o d    n 2 ) , n ) \mu = \text{modinv}(L(g^\lambda \mod n^2), n) μ=modinv(L(gλmodn2),n)

      μ = [ ( 1 + k n m o d    n 2 ) − 1 n ] − 1 = ( k m o d    n 2 ) − 1 m o d    n \mu = [\frac{(1+kn \mod n^2) - 1}{n}]^{-1}=(k\mod n^2)^{-1}\mod n μ=[n(1+knmodn2)1]1=(kmodn2)1modn

    现在,计算原始消息 m m m

    m = L ( u ) × μ m o d    n m = L(u) \times \mu \mod n m=L(u)×μmodn

    因此,通过计算 L ( u ) × μ m o d    n L(u) \times \mu \mod n L(u)×μmodn,我们可以从加密后的 c c c中恢复出原始的明文消息 m m m

4. 同态特性

Paillier 算法的主要特性是它的同态性质。具体来说,它支持同态加法和数乘操作:

  • 同态加法: 对于两个密文 c 1 c_1 c1 c 2 c_2 c2,其解密结果等同于它们对应明文的和的加密,即 D ( E ( m 1 ) × E ( m 2 ) m o d    n 2 ) = m 1 + m 2 D(E(m_1) \times E(m_2) \mod n^2) = m_1 + m_2 D(E(m1)×E(m2)modn2)=m1+m2
  • 同态加法(加密消息与明文整数): 加密一个消息 m m m,然后将这个加密的结果与 g k m o d    n 2 g^k \mod n^2 gkmodn2(其中 g g g 是公钥的一部分)相乘。解密这个乘积将得到 m m m k k k 的和,即 D ( E ( m ) × g k m o d    n 2 ) = m + k m o d    n \text{D}(E(m) \times g^k \mod n^2) = m + k \mod n D(E(m)×gkmodn2)=m+kmodn
  • 同态数乘: 对于一个密文 c c c 和一个明文数 k k k,其解密结果等同于密文对应明文的 k k k 倍的加密,即 D ( E ( m ) k m o d    n 2 ) = k × m D(E(m)^k \mod n^2) = k \times m D(E(m)kmodn2)=k×m

5. 安全性保障

Paillier 算法的安全性主要依赖于大数分解的困难性。当选择的素数 p p p q q q 足够大时,要破解该算法需要解决一个非常困难的数学问题——大数分解问题。因此,在实际应用中,应确保 p p p q q q 的选取足够安全。

6. 结论

Paillier 加密算法由于其同态特性,在多方安全计算、数据隐私保护、云计算安全等领域有着重要应用。例如,在电子投票系统中,可以保证投票的隐私性和可验证性;在数据分析中,可以对加密数据进行处理而无需暴露原始数据。

Paillier 同态加密算法提供了一种在加密状态下进行计算的能力,对于保护数据隐私和安全性有着重要意义。尽管其计算过程相对复杂,但它的安全性和独特的同态特性使其在现代加密应用中占有一席之地。文章来源地址https://www.toymoban.com/news/detail-827889.html

7. 代码

import random
from sympy import isprime, mod_inverse


def generate_prime_candidate(length):
    """ 随机生成一个指定长度的奇数 """
    p = random.getrandbits(length)  # 获取一个指定长度的随机位
    p |= (1 << length - 1) | 1  # 确保最高位和最低位为1,从而生成一个奇数
    return p


def generate_large_prime(length):
    """ 生成一个指定长度的大素数 """
    p = 4  # 初始化一个非素数
    while not isprime(p):  # 循环直到找到一个素数
        p = generate_prime_candidate(length)  # 生成一个候选素数
    return p


def lcm(x, y):
    """ 计算两个数的最小公倍数 """
    greater = max(x, y)  # 找到x和y中的较大值
    while True:  # 循环直到找到最小公倍数
        if greater % x == 0 and greater % y == 0:  # 检查是否是公倍数
            return greater
        greater += 1


def generate_keypair(p, q):
    """ 生成Paillier公钥和私钥 """
    n = p * q  # 计算n,Paillier算法的核心参数
    g = n + 1  # 简单选择g为n + 1
    lambda_val = lcm(p - 1, q - 1)  # 计算lambda,使用最小公倍数
    return ((n, g), lambda_val)


def encrypt(pk, m):
    """ 使用公钥pk加密消息m, m < n """
    n, g = pk
    r = random.randint(1, n)  # 随机选择一个数r
    c = pow(g, m) * pow(r, n) % n ** 2  # 计算密文
    return c


def decrypt(pk, sk, c):
    """ 使用私钥sk解密密文c """
    n, g = pk
    lambda_val = sk

    # 计算 u = c^lambda mod n^2
    u = pow(c, lambda_val, n ** 2)

    # 计算 L(u)
    L_u = (u - 1) // n

    # 预先计算 L(g^lambda mod n^2) 的模逆元素
    L_g_lambda_inv = mod_inverse((pow(g, lambda_val, n ** 2) - 1) // n, n)

    # 还原原始消息
    return (L_u * L_g_lambda_inv) % n


def paillier_homomorphic_addition(pk, c1, c2):
    """
    实现Paillier同态加法
    :param c1: 加密的数字m1的密文
    :param c2: 加密的数字m2的密文
    :param n: 公钥的一部分
    :return: 同态加法的结果,即加密的m1+m2
    """
    n, g = pk
    return c1 * c2 % (n ** 2)


p = generate_large_prime(8)
q = generate_large_prime(8)
public_key, private_key = generate_keypair(p, q)
# 加密消息
plaintext1 = 500
plaintext2 = 621
ciphertext1 = encrypt(public_key, plaintext1)
print('密文:', ciphertext1)
print('明文:', decrypt(public_key, private_key, ciphertext1))
ciphertext2 = encrypt(public_key, plaintext2)
print('密文:', ciphertext2)
print('明文:', decrypt(public_key, private_key, ciphertext2))
ciphertext3 = paillier_homomorphic_addition(public_key, ciphertext1, ciphertext2)
print(f'同态明文{plaintext1}+{plaintext2}={plaintext1 + plaintext2}')
print('同态密文:', ciphertext3)
print('同态明文:', decrypt(public_key, private_key, ciphertext3))

print(decrypt(public_key, private_key, ciphertext1 * public_key[1] ** 100))

输出
密文: 411415825
明文: 500
密文: 397559680
明文: 621
同态明文500+621=1121
同态密文: 699397600
同态明文: 1121
600

到了这里,关于Paillier 加法同态加密算法详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【密码学基础】半/全同态加密算法基础学习笔记

    定义:只支持乘法或加法中的一种的同态加密。同态加密指的是允许直接对密文进行计算,密文计算结果解密后与明文直接计算结果相同。 Paillier加解密过程 Paillier的同态性 明文加法 = 密文乘法 明文乘法 = 密文指数幂 Paillier的安全性 基于大整数分解困难问题 相比Paillier,

    2024年02月13日
    浏览(37)
  • 密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)

    SM1、SM2、SM3和SM4 为了保障商用密码的安全性,国家密码局制定了一系列密码标准,包括:SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC) 等。 SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法。 SM2、SM9是非对称算法。 SM3是哈希算法。 SM1、SM7算法不公开,调用该算法时,

    2024年02月03日
    浏览(28)
  • 【网络安全】数据加密标准(DES算法)详细介绍( 分组密码、Feistel密码结构、轮函数、子密钥生成算法)

    将被加密明文划分成一个一个的分组,输入n比特明文分组,输出n比特密文分组。 若映射可逆,具有 x n ! x^n! x n ! 种替换可能性。 如以下示例,每个4比特输入唯一映射为另一个4比特输出。 2.1 什么是Feistel密码结构 1973年由 IBM的Horst Feistel首次提出 ,通过将明文分组分成 左右

    2023年04月08日
    浏览(33)
  • 全同态加密:GSW

    参考文献: Micciancio D, Peikert C. Trapdoors for lattices: Simpler, tighter, faster, smaller[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2012: 700-718. Gentry C, Sahai A, Waters B. Homomorphic encryption from learning with errors: Conceptually-simpler, asymptotically-fast

    2023年04月08日
    浏览(22)
  • 同态加密的理解

    同态加密 是数据加密方式的一种,特点是允许加密后的数据(密文)进行数学或逻辑运算,同时密文进行数学或逻辑运算之后再解密,结果 近似等于 原始数据(明文)的数学或逻辑运算结果。 假设:我们想通过云计算平台进行两个数的加法运算,如: m 1 = 100 m_1 = 100 m 1 ​

    2024年02月06日
    浏览(23)
  • 同态加密详解

    同态加密(Homomorphic Encryption)是指将原始数据经过同态加密后,对得到的密文进行特定的运算,然后将计算结果再进行同态解密后得到的明文等价于原始明文数据直接进行相同计算所得到的数据结果。 同态加密与一般加密方案的关注点不同 ,一般的加密方案关注的是 数据存

    2024年02月03日
    浏览(49)
  • 全同态加密:BFV

    参考文献: O. Regev. On lattices, learning with errors, random linear codes, and cryptography. In H. N. Gabow and R. Fagin, editors, STOC , pages 84–93. ACM, 2005. Full version in J. ACM 56(6), 2009. V. Lyubashevsky, C. Peikert, and O. Regev. On Ideal Lattices and Learning with Errors over Rings. In Advances in Cryptology - EUROCRYPT 2010 , volume 611

    2023年04月08日
    浏览(29)
  • FHE全同态加密简介

    FHE (Fully homomorphic encryption): 是一种隐私技术,支持直接对密文进行计算,而无需对密文先解密再计算。 即,任何第三方或云厂商,都可对敏感信息的密文进行处理,而无需访问密文内的任何明文数据。 FHE历史演变路径为: Ronald Rivest、Leonard Adleman 和 Mike Dertouzos 于1978年 On

    2024年04月11日
    浏览(20)
  • 隐私计算之全同态加密

    【引】走近任何一个领域,都会发现自己的渺小和微不足道,会越发地敬畏技术和未知,隐私计算也不例外。读了一点儿文章和paper,觉得还是ACM 上的这篇综述(https://queue.acm.org/detail.cfm?id=3561800)可以对全同态加密有一个概貌,从而了解其脉络方向,进而对隐私计算增加一点

    2024年02月07日
    浏览(24)
  • 隐私保护技术之同态加密(转)

    参考链接: https://blog.csdn.net/shn111/article/details/124594241 chapters 同态加密(Homomorphic Encryption)是指将原始数据经过同态加密后,对得到的密文进行特定的运算,然后将计算结果再进行同态解密后得到的明文等价于原始明文数据直接进行相同计算所得到的数据结果。 同态加密与一

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包