Yang's blog Yang's blog
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xiaoyang

编程爱好者
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 现代密码学

    • Chapter 0:Introduction to Modern Cryptography
    • Chapter 1:Introduction and Classical Cryptography
    • Chapter 2:Perfectly Secret Encryption
    • PChapter 3:rivate-Key Encryption
    • Chapter 4:Message Authentication Codes
    • Chapter 5:CCA-Security and Authenticated Encryption
    • Chapter 6:Hash Functions and Applications
    • Chapter 9:Number Theory and Cryptographic Hardness Assumptions
    • Chapter 11:Key Management and the Public-Key Revolution
  • 对称加密

    • DES加密算法详解
  • 同态加密方案

    • RSA乘法同态
      • RSA算法介绍
      • 为什么这样的设计是安全的?
      • RSA的乘法同态性质
      • 代码实现
    • Paillier 加法同态
    • 可验证Paillier同态加密
    • CKKS EXPLAINED PART 1, VANILLA ENCODING AND DECODING
    • CKKS EXPLAINED, PART 2 FULL ENCODING AND DECODING
    • CKKS EXPLAINED, PART 3 ENCRYPTION AND DECRYPTION
    • CKKS EXPLAINED, PART 4 MULTIPLICATION AND RELINEARIZATION
    • CKKS EXPLAINED, PART 5 RESCALING
  • 隐私计算框架

    • pysyft

      • README
      • PySyfy介绍
      • 数据集与资产
      • 客户端和 Datasite 访问
      • 提出研究问题
      • 审查代码请求
      • 检索结果
  • 安全知识

    • 信息安全四大顶会与分级
    • 数字签名与数字证书关系
    • 伪随机函数在密码学中的作用及其应用实例
    • 伪随机函数在与哈希函数的关系
  • 密码学
  • 同态加密方案
xiaoyang
2024-05-10
目录

RSA乘法同态

# RSA乘法同态

# RSA算法介绍

RSA算法是一种广泛使用的非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年提出。它的安全性基于大数分解的难度。下面是RSA算法的详细原理:

  1. 生成密钥:
    • 选择两个大素数p和q。
    • 计算它们的乘积n=pq,n的长度,即其位数,决定了密钥的长度。
    • 计算欧拉函数ϕ(n)=(p−1)(q−1)。
    • 选择一个整数e,作为公钥指数,它必须小于ϕ(n)且与ϕ(n)互质。通常,e选择65537,因为它既不太大也不太小,且为质数。
    • 计算e的模逆元d,满足ed≡1modϕ(n)。d作为私钥指数。
  2. 加密过程:
    • 假设有一条消息M,其中M是一个小于n的数字。
    • 加密后的消息C计算为C=Memodn。
  3. 解密过程:
    • 使用私钥d对密文C进行解密,计算M=Cdmodn。
    • 由于ed≡1modϕ(n),解密后得到的M将是原始消息。

要理解为什么当e×d是1加上φ(n)的倍数时,(Me)d模n总是等于M,我们需要依赖于数论中的一些基本概念,特别是费马小定理和欧拉定理。

  1. 费马小定理:费马小定理指出,如果p是一个质数,且a是任何不是p的倍数的整数,则ap−1≡1modp。这意味着ap−1除以p的余数是1。

  2. 欧拉定理:欧拉定理是费马小定理的推广。它指出,如果n和a是互质的,则aφ(n)≡1modn,其中φ(n)是欧拉函数,表示小于或等于n的正整数中与n互质的数的数量。

在RSA加密中,n=p×q,其中p和q是两个不同的质数,所以对于任何与n互质的整数M(即几乎所有小于n的整数),欧拉定理告诉我们Mφ(n)≡1modn。

现在,如果e×d≡1modφ(n),那么存在一个整数k使得e×d=1+k×φ(n)。所以对于任何整数M:

Me×d=M1+k×φ(n)=M×(Mφ(n))k

根据欧拉定理,我们知道(Mφ(n))k≡1kmodn。所以,

Me×d≡M×1k=Mmodn

因此,当(Me)d模n时,它总是等于M。这是RSA加密能够成功解密的数学基础。

在RSA加密中,如果加密消息M与n不互质(即M和n有一个以上的公共质因数),则可能会出现问题。由于n=p×q是两个质数的乘积,如果M与n不互质,那么M必须是p或q的倍数。

在实际应用中,这种情况几乎不会发生,原因如下:

  1. 大质数的选择:在RSA中,p和q通常选择为非常大的质数,这意味着n也会非常大。因此,随机选择的消息M与n不互质的概率非常小。

  2. 消息编码:在实际的RSA实现中,消息M通常会通过某种形式的编码(如填充方案)进行处理,以确保它们与n互质。这样的编码不仅增加了安全性,还帮助避免了M与n不互质的情况。

  3. 小概率事件:即使没有特殊的编码,由于n非常大,随机选择的消息M与n不互质的概率仍然非常小。

如果在极少数情况下M确实不与n互质,那么RSA加密可能不会正确工作。然而,由于这种情况发生的概率极低,并且现代RSA实现通常包含了防止这种情况发生的机制,所以在实际应用中几乎可以忽略这一问题。

RSA算法的安全性基于大数分解的困难性。目前没有已知的有效方法可以在合理的时间内分解一个大的n。因此,只要p和q足够大,RSA算法就被认为是安全的。但是,如果p和q的值泄露或者它们太小,那么算法的安全性就会受到威胁。此外,随着量子计算的发展,RSA的安全性可能会受到挑战,因为量子计算机潜在地能够在多项式时间内分解大数。

# 为什么这样的设计是安全的?

RSA算法的安全性基于大数分解的困难性,这是因为在当前的计算能力下,将一个大整数分解为其质因数是一项极其困难的任务。下面详细解释为什么这一点对RSA算法至关重要:

  1. 大数分解的计算难度:

    • 当我们选择两个大素数p和q并将它们相乘得到n时,逆向工程——即将n分解回p和q——在数学上是非常困难的。对于较小的数,分解可能是可行的,但随着数的增大,所需的计算资源和时间呈指数级增长。
  2. RSA算法的工作原理:

    • RSA算法的安全性依赖于公钥和私钥的生成。公钥包含n和e,而私钥是d。要从公钥计算出私钥,攻击者需要知道n的质因数p和q。只要p和q保持秘密,通过公钥计算私钥就几乎是不可能的。
  3. 小素数的问题:

    • 如果p和q太小,或者它们的选择方式使它们容易被预测,那么通过现代计算机的力量可以相对容易地分解n。这会暴露出私钥,从而破坏整个加密系统的安全性。
  4. 量子计算的威胁:

    • 量子计算机利用量子比特进行计算,这使它们在处理某些特定类型的问题时比经典计算机更有效率。尤其是,量子计算机潜在地可以运行像Shor算法这样的算法,这种算法在理论上可以在多项式时间内分解大数。如果能够实现足够强大的量子计算机,RSA算法的安全性将会受到严重威胁。

因此,RSA算法的安全性在很大程度上取决于当前计算技术无法在实际时间内分解大的n。但这也意味着随着计算技术的发展,特别是量子计算的进步,RSA算法可能需要适应更高的安全标准,例如使用更大的密钥尺寸,或者转向量子安全的加密方法。

# RSA的乘法同态性质

RSA算法本身并不是一个同态加密算法,但它确实展示了一定程度的同态性质。在RSA的上下文中,我们可以观察到乘法同态的一个简单示例。这意味着,如果你有两个加密的消息,你可以在不解密的情况下将它们相乘,并且结果仍然是有效的加密形式。

让我们通过一个简单的例子来展示这一点。假设我们有两个消息M1和M2,以及RSA的公钥(n,e)和私钥d。

加密

加密消息M1和M2的过程是:

  1. 加密M1:C1=M1emodn
  2. 加密M2:C2=M2emodn

乘法同态性

乘法同态性意味着对加密的消息进行乘法运算等同于对原始消息进行乘法运算,然后加密结果。也就是说,C1×C2的解密结果应该等于M1×M2的加密结果。

  1. 计算C1×C2:Cmult=C1×C2=M1e×M2emodn
  2. 重写Cmult:Cmult=(M1×M2)emodn

解密

解密Cmult将得到M1×M2:

  1. 解密Cmult:Mmult=Cmultdmodn
  2. 由于(M1×M2)e×d≡M1×M2modn,因此Mmult=M1×M2

# 代码实现

import random
from sympy import isprime, mod_inverse


def generate_prime_candidate(length):
    """ 随机生成一个奇数 """
    p = random.getrandbits(length)
    p |= (1 << length - 1) | 1
    return p


def generate_large_prime(length):
    """ 生成指定长度的大素数 """
    p = 4
    while not isprime(p):
        p = generate_prime_candidate(length)
    return p


def generate_keys(bit_length):
    """ 生成RSA密钥对 """
    p = generate_large_prime(bit_length)
    q = generate_large_prime(bit_length)
    n = p * q
    phi_n = (p - 1) * (q - 1)

    e = 65537
    d = mod_inverse(e, phi_n)

    # 公钥 (e, n) 和 私钥 (d, n)
    return ((e, n), (d, n))


def encrypt(public_key, plaintext):
    """ 使用公钥加密明文 """
    e, n = public_key
    ciphertext = pow(plaintext, e, n)
    return ciphertext


def decrypt(private_key, ciphertext):
    """ 使用私钥解密密文 """
    d, n = private_key
    decrypted_int = pow(ciphertext, d, n)
    return decrypted_int


def homomorphic_multiply(ciphertext1, ciphertext2, public_key):
    """ 同态乘法:乘两个密文 """
    e, n = public_key
    # 将两个密文相乘后对 n 取模
    return (ciphertext1 * ciphertext2) % n


# 生成密钥
public_key, private_key = generate_keys(16)  # 此处为16位,仅作演示;实际应用中应使用1024位或2048位

# 加密消息
plaintext1 = 500
plaintext2 = 621
ciphertext1 = encrypt(public_key, plaintext1)
print('密文:', ciphertext1)
print('明文:', decrypt(private_key, ciphertext1))
ciphertext2 = encrypt(public_key, plaintext2)
print('密文:', ciphertext2)
print('明文:', decrypt(private_key, ciphertext2))

# 同态乘法
ciphertext_he = homomorphic_multiply(ciphertext1, ciphertext2, public_key)

# 解密同态乘法结果
decrypted_he = decrypt(private_key, ciphertext_he)
print('同态密文:', ciphertext_he)
print('同态明文:', decrypted_he)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

输出:

密文: 354969104
明文: 500
密文: 964115344
明文: 621
同态密文: 1648575948
同态明文: 310500
1
2
3
4
5
6
编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12

← DES加密算法详解 Paillier 加法同态→

最近更新
01
操作系统
03-18
02
Nginx
03-17
03
后端服务端主动推送消息的常见方式
03-11
更多文章>
Theme by Vdoing | Copyright © 2023-2025 xiaoyang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式