非对称加密(RSA算法)原理


RSA并不是构造了一个无漏洞、无法破解的算法,而是让解密在计算上变得不可承受。

RSA的引入

很多加密场景里,密钥是加密、解密和安全性的关键,安全地传输密钥则成为了一个关键问题,
RSA算法就可以将公钥公开的发出去,而不影响私钥拥有者可以安全地解密,这一套机制就是RSA。

除了基础的加解密功能,RSA还有一个很常用的用途是那就是身份认证和验签,不过这里不讲这些。


RSA的使用流程

RSA算法的核心思想是利用一对密钥(公钥和私钥)进行加密和解密操作。公钥可以公开分发给任何人,用于加密信息,而私钥则必须保密,用于解密信息。这种加密方式保证了只有私钥的持有者才能解密出原始信息,从而确保了信息传输的安全性。

image


算法流程

背景知识:

  • 欧拉定理

image

构造密钥

RSA的密钥生成涉及以下步骤:
image

伪代码介绍过程

如果用伪代码表示:

# ========================
# 1. 生成密钥
# ========================

p = 11
q = 17

n = p * q

phi = (p - 1) * (q - 1)

e = 7

d = find_d(e, phi)

# 此时:
# n = 187
# phi = 160
# e = 7
# d = 23


public_key  = (e, n)
private_key = (d, n)

其中:

find_d(7,160)

实际上就是寻找:

7 × d % 160 == 1

最终:

d = 23

加密伪代码

function encrypt(message, public_key):

    e = public_key.e
    n = public_key.n

    ciphertext = message^e % n

    return ciphertext

使用:

message = 10

public_key = (7,187)

于是:

ciphertext
    = 10^7 % 187
    = 175

解密伪代码

function decrypt(ciphertext, private_key):

    d = private_key.d
    n = private_key.n

    message = ciphertext^d % n

    return message

使用:

ciphertext = 175

private_key = (23,187)

于是:

message
    = 175^23 % 187
    = 10

成功恢复。


十一、最重要的是理解这张图

你现在可以把 RSA 想象成:

             密钥生成
                 │
       ┌─────────┴─────────┐
       ↓                   ↓
    p = 11              q = 17
       │                   │
       └─────────┬─────────┘
                 ↓
          n = 11 × 17
                 ↓
             n = 187
                 │
                 ↓
       φ(n) = 160
                 │
                 ↓
              e = 7
                 │
                 ↓
              d = 23
                 │
        ┌────────┴────────┐
        ↓                 ↓
      公钥              私钥
    (7,187)           (23,187)
        │                 │
        ↓                 │
      加密                │
        │                 │
    10 → 175              │
                          ↓
                        解密
                          │
                      175 → 10

十二、你现在真正需要理解的只有三个数学关系

理解 RSA,需要把这三个关系吃透:

① p、q 生成 n

p = 11
q = 17

n = p × q
  = 187

② p、q 生成 φ(n)

φ(n)
= (p-1)(q-1)

= 10 × 16

= 160

③ e、d 必须满足

e × d mod φ(n) = 1

我们的例子:

7 × 23 mod 160

= 161 mod 160

= 1

然后才有:

加密:

M^7 mod 187


解密:

C^23 mod 187

最终:

10
 ↓
加密
 ↓
175
 ↓
解密
 ↓
10

练习:如果你自己用 p=5、q=11,从头算出 n、φ(n)、e、d,然后去走一遍加密,解密流程?


陷门函数与困难问题、困难计算

陷门函数是一种在一个方向上很容易计算,但在没有特殊信息的情况下很难在相反方向上计算(寻找它的逆)的函数。

陷门函数是单向函数的一种特殊情况,广泛用于公钥密码学中。


为什么抗彩虹表攻击?

彩虹表攻击是指,拿着获取到的hash值通过查询彩虹表找出其原始值的攻击方式。

如果先计算好一些大数的质数表,能否破解?
TODO

公钥和私钥用反的安全风险

只是从使用来说,他们可以相互反着来用,都能达成加密、解密效果。

但是,实际上私钥包含了更多信息,比如公钥的信息,如果把私钥公开出去,把私钥当成公钥来使用,
则会照成密钥泄露的安全风险。

一些安全性考虑

安全性考虑

  1. 密钥长度:为了保持RSA算法的安全性,必须选择足够大的密钥长度。在现代标准中,通常推荐使用至少2048位的密钥长度,以抵抗已知的攻击方法。

  2. 随机数生成:在密钥生成过程中使用的随机数必须具有良好的随机性,以避免潜在的安全。

  3. 参数选择:选择合适的质数p和q以及加密指数e对于算法的安全性至关重要。通常建议使用安全的参数生成方法来避免常见的陷阱和弱点。

  4. 已知与防御:尽管RSA算法被广泛认为是安全的,但仍存在潜在的风险。例如,侧信道可以通过观察加密或解密操作的物理特征(如时间、功耗等)来推测密钥信息。为了防范这些,可以采取相应的防御措施,如使用掩码技术来隐藏关键操作的特征。

  5. 算法实现与更新:在实际应用中,需要注意RSA算法的正确实现和及时更新。错误的实现或使用过时的算法库可能导致安全漏洞。因此,建议使用经过充分测试和验证的加密算法库,并定期更新以应对新出现的安全威胁。

posted on 2026-08-18 17:46  Mysticbinary  阅读(143)  评论(0)    收藏  举报