RSA (Rivest–Shamir–Adleman) 加密算法详解
RSA 是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年提出,并以他们姓氏的首字母命名。它是目前应用最广泛的公钥密码算法之一,广泛用于数据加密、数字签名以及密钥交换等领域。RSA 的安全性基于大整数分解的困难性,即给定两个大素数
p和q,计算它们的乘积n = p * q是容易的,但给定n却很难反向分解出p和q。
一、引言:公钥密码学的基石
在密码学领域,我们通常将加密算法分为两大类:对称加密和非对称加密。
- 对称加密 (Symmetric Encryption):使用相同的密钥进行加密和解密。优点是速度快,但密钥分发和管理是其主要挑战。
- 非对称加密 (Asymmetric Encryption / Public-key Cryptography):使用一对密钥,即一个公钥 (Public Key) 和一个私钥 (Private Key)。公钥可以公开,用于加密或验证签名;私钥必须严格保密,用于解密或生成签名。
RSA 算法是公钥密码学的代表,解决了对称加密中密钥分发的难题。其核心思想是构建一个陷门单向函数 (Trapdoor One-way Function):
- 单向函数:正向计算非常容易,反向计算(逆运算)非常困难。
- 陷门:在已知某个“陷门信息”(私钥)的情况下,反向计算变得容易。
二、RSA 算法原理
RSA 算法主要包含三个阶段:密钥生成、加密和解密。
2.1 密钥生成
密钥生成是 RSA 算法的基础,它创建了用于加密和解密的公钥和私钥对。
选择两个大的、相异的素数
p和q:- 这两个素数必须足够大,且为了安全性,通常建议它们的长度相同(例如,都为 1024 位)。
- $p \ne q$
计算模数
n:- $n = p \times q$
n将成为公钥和私钥的一部分。其长度通常是p和q长度之和(例如,2048 位)。
计算欧拉函数 $\phi(n)$:
- $\phi(n) = (p-1)(q-1)$
- $\phi(n)$ 在密钥生成过程中非常关键,但之后需要被丢弃,不能泄露给攻击者。
选择公钥指数
e(Encryption Exponent):- 选择一个整数
e,满足以下条件:- $1 < e < \phi(n)$
e与 $\phi(n)$ 互质 (即它们的最大公约数gcd(e, \phi(n)) = 1)。
- 通常选择较小的
e值,如 $2^{16}+1 = 65537$,因为它能加快加密速度。
- 选择一个整数
计算私钥指数
d(Decryption Exponent):- 计算
d,使其满足以下同余方程:- $d \cdot e \equiv 1 \pmod{\phi(n)}$
- 这意味着 $d \cdot e = k \cdot \phi(n) + 1$ (其中
k是一个整数)。 d可以通过扩展欧几里得算法从e和 $\phi(n)$ 计算得到。
- 计算
至此,密钥生成完成:
- 公钥 (Public Key):
(n, e) - 私钥 (Private Key):
(n, d)(为了加快解密,有时还会存储p,q,dP = d mod (p-1),dQ = d mod (q-1),qInv = q^-1 mod p,这些统称为中国剩余定理参数 CRT parameters)
密钥生成过程示意图:
graph TD
A[选择两个大素数 p, q] --> B[计算 n = p * q];
A --> C["计算欧拉函数 phi(n) = (p-1)(q-1)"];
C --> D["选择公钥指数 e, 满足 1 < e < phi(n) 且 gcd(e, phi(n)) = 1"];
C --> E["计算私钥指数 d, 满足 d * e ≡ 1 (mod phi(n))"];
D --> F{"公钥: (n, e)"};
E --> G{"私钥: (n, d)"};
2.2 加密过程
假设发送方 Alice 想要向接收方 Bob 发送一条明文消息 M。
- 获取 Bob 的公钥:Alice 获取 Bob 的公钥
(n, e)。 - 将明文转换为数字:将明文消息
M转换为一个整数,记作m。这个整数必须满足 $0 \le m < n$。如果明文过长,需要分块处理。 - 计算密文
C:Alice 使用 Bob 的公钥(n, e)对m进行加密:- $C = m^e \pmod n$
加密过程示意图:
sequenceDiagram
participant Alice
participant Bob
Alice->>Bob: 获取公钥 (n, e)
Alice->>Alice: 明文 m (0 <= m < n)
Alice->>Alice: 计算密文 C = m^e mod n
Alice->>Bob: 发送密文 C
2.3 解密过程
当 Bob 收到 Alice 发送的密文 C 后,他可以使用自己的私钥解密以获取原始明文 m。
使用私钥解密:Bob 使用自己的私钥
(n, d)对密文C进行解密:- $m = C^d \pmod n$
将数字转换回明文:将整数
m转换回原始明文消息M。
解密过程示意图:
sequenceDiagram
participant Alice
participant Bob
Bob->>Bob: 收到密文 C
Bob->>Bob: 使用私钥 (n, d)
Bob->>Bob: 计算明文 m = C^d mod n
Bob->>Bob: 将 m 转换回原始消息 M
Bob->>Alice: (解密完成)
2.4 数学原理简述
RSA 算法的正确性依赖于欧拉定理的一个推论:
如果 m 是一个整数,n 是一个正整数,且 m 与 n 互质,那么:
$m^{\phi(n)} \equiv 1 \pmod n$
因为 $d \cdot e \equiv 1 \pmod{\phi(n)}$,所以存在一个整数 k 使得 $d \cdot e = k \cdot \phi(n) + 1$。
那么,解密过程可以表示为:
$C^d \pmod n = (m^e)^d \pmod n = m^{ed} \pmod n$
$m^{ed} \pmod n = m^{k \cdot \phi(n) + 1} \pmod n = (m^{\phi(n)})^k \cdot m^1 \pmod n$
如果 m 与 n 互质,根据欧拉定理,$(m^{\phi(n)})^k \equiv 1^k \equiv 1 \pmod n$。
所以,$m^{ed} \pmod n \equiv 1 \cdot m \pmod n \equiv m \pmod n$。
对于 m 与 n 不互质的情况,该定理的扩展形式也成立。这确保了加密后的密文可以通过私钥正确解密回原始明文。
三、数字签名
RSA 不仅可以用于数据加密,还可以用于数字签名,以提供消息的完整性和发送方的身份验证(不可否认性)。
3.1 签名过程
假设发送方 Alice 想要对消息 M 进行签名。
- 计算消息摘要:Alice 首先使用一个哈希函数(如 SHA-256)计算消息
M的摘要H(M)。哈希摘要通常是一个固定长度的短字符串。 - 使用私钥签名:Alice 使用自己的私钥
(n, d)对哈希摘要H(M)进行“加密”,生成签名S:- $S = H(M)^d \pmod n$
- 发送:Alice 将消息
M和签名S一起发送给接收方 Bob。
签名过程示意图:
sequenceDiagram
participant Alice
participant Bob
Alice->>Alice: 消息 M
Alice->>Alice: 计算 H(M) = SHA256(M)
Alice->>Alice: 使用私钥 (n_Alice, d_Alice)
Alice->>Alice: 计算签名 S = H(M)^d_Alice mod n_Alice
Alice->>Bob: 发送 (M, S)
3.2 验证过程
当接收方 Bob 收到消息 M 和签名 S 后,他可以验证签名的有效性。
- 计算消息摘要:Bob 对收到的消息
M计算相同的哈希摘要H(M)。 - 使用公钥验证签名:Bob 使用发送方 Alice 的公钥
(n, e)对收到的签名S进行“解密”(实际上是验证):- $H’(M) = S^e \pmod n$
- 比较摘要:Bob 比较自己计算的哈希摘要
H(M)和通过公钥解密签名得到的H'(M)。- 如果
H(M) = H'(M),则签名有效,表明消息未被篡改,且确实是由 Alice 签发的。 - 如果两者不相等,则签名无效,表示消息可能被篡改,或者不是由 Alice 签发的。
- 如果
验证过程示意图:
sequenceDiagram
participant Alice
participant Bob
Bob->>Bob: 收到 (M, S)
Bob->>Bob: 计算 H(M) = SHA256(M)
Bob->>Bob: 获取 Alice 的公钥 (n_Alice, e_Alice)
Bob->>Bob: 计算 H'(M) = S^e_Alice mod n_Alice
alt H(M) == H'(M)
Bob->>Bob: 签名有效 (消息完整, 来源可信)
else
Bob->>Bob: 签名无效 (消息被篡改或来源可疑)
end
四、安全性分析与最佳实践
RSA 的安全性完全依赖于大整数分解的困难性。
- 密钥长度:目前,2048 位或更长的 RSA 密钥被认为是安全的。随着计算能力的提升,推荐的密钥长度也会相应增加(例如,长期来看可能需要 3072 位或 4096 位)。
- 素数选择:选择的素数
p和q必须是随机的、足够大且不能太接近。同时,p-1和q-1应该包含大的素因子,以防止某些特定攻击。 - 填充方案 (Padding Schemes):为了增强安全性,防止各种密码攻击(如选择密文攻击),RSA 在实际应用中绝不直接加密明文,而是使用填充方案(如 PKCS #1 v1.5 或更安全的 OAEP - Optimal Asymmetric Encryption Padding)。填充确保了相同的明文每次加密都会产生不同的密文,并增加了攻击者获取有用信息的难度。
- 私钥安全:私钥必须严格保密。一旦私钥泄露,加密消息可以被解密,数字签名可以被伪造。
五、RSA 的优缺点
5.1 优点
- 非对称性:解决了对称加密中密钥分发的难题,公钥可以公开,方便地进行加密和验证。
- 提供多种安全服务:既可以用于数据加密,也可以用于数字签名,实现机密性、完整性、身份认证和不可否认性。
- 广泛应用与标准化:RSA 是最成熟和广泛使用的公钥算法之一,有大量的标准、库和工具支持。
5.2 缺点
- 计算开销大,速度慢:相较于对称加密算法(如 AES),RSA 的加解密速度慢得多。因此,RSA 通常不直接用于加密大量数据,而是用于加密对称密钥(如会话密钥),然后用对称密钥加密实际数据。
- 明文长度限制:RSA 加密的消息长度不能超过密钥长度减去填充的开销。
- 安全性依赖于密钥长度:需要足够长的密钥才能抵抗量子计算机等未来潜在的攻击。
六、Go 语言实现示例
Go 语言的 crypto/rsa 包提供了强大的 RSA 功能,包括密钥生成、加解解密和签名验证。
1 | package main |
七、总结
RSA 算法作为公钥密码学的开创性成就,在现代网络安全体系中扮演着不可或缺的角色。它通过巧妙地利用大整数分解的数学难题,实现了密钥的分离,使得信息的机密性、完整性、真实性和不可否认性得以保障。尽管其计算效率不如对称加密算法,但其独特的非对称性使其成为数字通信安全(如 TLS/SSL 握手、电子邮件加密、代码签名)和身份验证的基石。在实际应用中,结合恰当的填充方案和足够长的密钥长度,RSA 依然是保障信息安全的首选非对称加密算法之一。
