首页 / 开发工具指南 / RSA 指南

RSA 加密算法完整指南

从历史背景到实际应用:一文掌握 RSA 的数学原理(大整数分解问题)、密钥长度选择(2048/4096 位)、PKCS#1 v1.5 与 OAEP 填充方式对比、数字签名与验签流程、7 个真实使用场景、5 个实用技巧与数据安全建议。

📖 阅读时长约 10 分钟 📅 更新于 2026-06-20 ✍️ 土豆丝工具团队
🔐 立即试用 RSA 加解密工具
在线快速进行 RSA 加密与解密,支持密钥对生成(1024/2048/4096 位)、公钥加密与私钥解密、PKCS#1 v1.5 与 OAEP 填充模式、数字签名与验签、PKCS#1/PKCS#8 格式切换、Hex/Base64 编码、结果复制与下载,所有操作在浏览器本地完成,保护您的数据隐私。
打开工具
#01

什么是 RSA?理解它的本质与历史地位

RSA (Rivest-Shamir-Adleman) 是目前世界上最流行的非对称加密算法,由三位麻省理工学院的密码学家 Ron RivestAdi ShamirLeonard Adleman 于 1977 年提出,算法名即取自三人姓氏的首字母。

RSA 之所以被称为"非对称加密",是因为它使用一对数学上相关联但不能互相推导的密钥:

  • 公钥(Public Key):可以公开分发,用于加密数据或验证签名。任何人都可以使用公钥加密消息,但只有持有对应私钥的人才能解密。
  • 私钥(Private Key):必须严格保密,用于解密数据或创建数字签名。私钥的安全性决定了整个 RSA 系统的安全性。

RSA 有两大核心应用:

  • 数据加密:发送方用接收方的公钥加密,接收方用自己的私钥解密。
  • 数字签名:发送方用自己的私钥对消息摘要签名,接收方用发送方的公钥验签,从而验证消息来源的真实性和完整性。

在实际部署中,RSA 已成为全球事实上的非对称加密标准。它被广泛用于 SSL/TLS 证书(HTTPS 网站加密)SSH 远程登录(密钥认证)电子签名与电子合同数字证书与 PKI 体系PGP/GPG 邮件加密比特币等区块链的地址生成移动支付安全智能卡与硬件安全模块 等几乎所有需要身份认证和密钥交换的场景。它的安全性经受了全球密码学界 40 多年的公开审查,目前在使用足够密钥长度的情况下仍被认为是安全的。

我们的在线 RSA 工具保留了该算法的实用价值,同时为开发者提供一站式的在线加密解密、密钥生成、签名验签与结果复制。

#02

RSA 的数学原理:大整数分解与密钥生成

RSA 的安全性基于一个经典的数论问题:大整数分解(Integer Factorization)。简单来说,将两个大素数相乘很容易,但反过来,对其乘积进行因式分解则极其困难。

RSA 的密钥生成流程可以概括为以下 6 个步骤:

  • ① 选择两个大素数 p 和 q:p 和 q 的位数决定了最终密钥的长度。例如,要生成 2048 位 RSA 密钥,p 和 q 通常各约为 1024 位。它们必须是素数,且差距不能太小。
  • ② 计算模数 n = p × q:n 的二进制位数就是 RSA 密钥长度。n 会被公开,包含在公钥和私钥中。
  • ③ 计算欧拉函数 φ(n) = (p-1)(q-1):φ(n) 表示小于 n 且与 n 互质的正整数的个数。这个值必须保密。
  • ④ 选择公钥指数 e:选择一个整数 e 满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1(e 与 φ(n) 互质)。在实际应用中,e 通常取 65537(即 2^16 + 1,这是 Fermat 素数 F4),因为它在安全性和运算效率之间取得了良好的平衡。
  • ⑤ 计算私钥指数 d:d 是 e 关于模 φ(n) 的模逆元,即满足 (d × e) mod φ(n) = 1。这一步通过扩展欧几里得算法完成。
  • ⑥ 输出密钥对:公钥为 (n, e),私钥为 (n, d)。为了提高解密效率,实际应用中通常还会保存 p、q、d mod (p-1)、d mod (q-1) 等参数以支持中国剩余定理(CRT)加速。

加密过程使用公钥:将明文消息 m(以整数表示,0 ≤ m < n)加密为密文 c = m^e mod n。

解密过程使用私钥:将密文 c 还原为明文 m = c^d mod n。根据欧拉定理和费马小定理,这个恢复过程在数学上是精确成立的。

签名与验签的原理类似但方向相反:签名时用私钥对消息摘要进行运算(sign = hash(message)^d mod n),验签时用公钥验证(hash(message) = sign^e mod n)。

理解这个数学结构后,你就能准确回答 为什么 RSA 不能加密比 n 更长的数据为什么密钥生成比加解密慢得多为什么 e 常取 65537 等实际问题。

#03

填充方式与签名:PKCS#1 v1.5、OAEP、PSS 的实际区别

RSA 的原始数学运算(直接对明文进行模幂)存在严重的安全漏洞——它是确定性的,即相同明文在相同密钥下总是产生相同密文,且消息必须小于模数 n。为了解决这些问题,实际使用中必须采用填充方案。

PKCS#1 v1.5(加密填充):这是最经典、兼容性最好的填充方案。填充结构为 0x00 || 0x02 || PS || 0x00 || M,其中 PS 是至少 8 字节的随机非零字节,M 是明文消息。虽然广泛使用,但它存在已知的填充预言机攻击(Padding Oracle Attack)向量,攻击者可以通过精心构造的密文并观察解密失败信息来逐步恢复明文。因此,PKCS#1 v1.5 在新系统中不推荐使用

OAEP(Optimal Asymmetric Encryption Padding):由 Bellare 和 Rogaway 于 1994 年提出,是 PKCS#1 v2.0+ 中的标准加密填充方案。它基于 Feistel 网络结构,配合一个随机数(保证非确定性)和两个哈希函数,提供可证明的安全性(在随机预言机模型下抵抗选择明文攻击和选择密文攻击)。OAEP 是目前推荐的加密填充方案

PKCS#1 v1.5(签名填充):签名场景下的 v1.5 填充结构为 0x00 || 0x01 || PS || 0x00 || DigestInfo,其中 PS 是 0xFF 填充字节,DigestInfo 包含哈希算法标识符和消息摘要。签名场景下的 v1.5 填充比加密场景下的安全性更好,但仍建议在新系统中考虑 PSS。

PSS(Probabilistic Signature Scheme):同样由 Bellare 和 Rogaway 提出,是 PKCS#1 v2.1 中的标准签名填充方案。PSS 引入随机盐值,使得每次对相同消息签名都会产生不同的签名值,提供可证明的安全性。它是目前推荐的签名填充方案

一句话总结:加密用 OAEP,签名用 PSS;除非需要兼容旧系统,否则应避免使用 PKCS#1 v1.5。

此外,RSA 通常不直接用于加密大块数据。标准做法是采用混合加密(Hybrid Encryption):生成一个随机对称密钥(如 AES 密钥),用 RSA 加密这个对称密钥,然后用对称密钥加密实际数据。这既利用了 RSA 方便的密钥分发能力,又利用了对称加密的高性能。

#04

7 个真实使用场景:什么时候需要用到 RSA?

RSA 作为最成熟的非对称加密算法,在现代数字世界中几乎无处不在。以下是 7 个最常见的真实使用场景:

① HTTPS / TLS 网站加密:当您访问一个以 https:// 开头的网站时,几乎肯定会用到 RSA。服务器持有 RSA 私钥,对应的公钥包含在 SSL/TLS 证书中。客户端在握手阶段用服务器公钥加密一个随机会话密钥(或预主密钥),服务器用私钥解密后建立加密通道。虽然 TLS 1.3 倾向于使用 ECDHE 进行密钥交换,但 RSA 证书仍然广泛使用。

② SSH 远程登录:SSH 密钥认证是开发者日常工作中最常见的 RSA 应用之一。用户生成 RSA 密钥对后,将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。登录时,服务器用公钥向客户端发起挑战,客户端用私钥响应,从而完成无密码身份认证。

③ 数字签名与电子合同:在金融、法律、政府等领域,数字签名是核心基础设施。签名者用私钥对文档摘要签名,验证者用公钥验证签名的真实性和不可否认性。CA 机构(如 VeriSign、DigiCert、Let's Encrypt)签发的证书本质上就是用 CA 私钥签名的公钥证书。

④ PGP/GPG 邮件加密:Phil Zimmermann 于 1991 年创建的 PGP 是最早将 RSA 推向大众的应用之一。PGP 使用用户的 RSA 公钥加密邮件内容的会话密钥,接收方用私钥解密后再解密邮件内容,保证端到端邮件的保密性。

⑤ 区块链与加密货币:在比特币、以太坊等区块链系统中,RSA 的椭圆曲线版本(ECDSA 等)被用于地址生成和交易签名。私钥决定了用户对资产的控制权,公钥(或其哈希值)就是用户在网络上的公开地址。

⑥ 移动支付与金融安全:在 Apple Pay、Android Pay、银联云闪付等支付系统中,RSA 被用于设备认证、令牌化(Tokenization)和交易签名。银行、证券公司等金融机构也广泛使用 RSA 进行用户身份认证和敏感交易签名。

⑦ 软件分发与代码签名:Windows 的 Authenticode、macOS 的 Developer ID、Android 的 APK 签名、iOS 的 App 签名都使用 RSA(或其椭圆曲线变体)进行代码签名。用户通过验证签名可以确认软件来源的真实性和完整性,防止恶意代码伪装成合法软件。

在这些场景中,RSA 通常与其他算法(如 AES、SHA-256、ECC)协同工作,共同构成完整的安全体系。

#05

如何选择密钥长度:1024 vs 2048 vs 4096

密钥长度是 RSA 安全性的第一要素。选择合适的密钥长度需要在安全性、性能和兼容性之间取得平衡。

1024 位 RSA:不推荐在任何生产环境中使用。根据 NIST 的建议,1024 位 RSA 自 2010 年起就不再适合用于保护敏感信息。随着计算能力的提升和量子计算研究的进展,1024 位 RSA 已经可以被有充足资源的攻击者在合理时间内破解。如果您的系统仍在使用 1024 位密钥,请立即升级。

2048 位 RSA:目前工业界的最低推荐标准,也是最常见的选择。根据 NIST SP 800-57 Part 3 的建议,2048 位 RSA 至少在 2030 年之前都是安全的。它在安全性和性能之间取得了良好的平衡,密钥生成、加密、解密运算的速度都可以接受,且与几乎所有系统兼容。如果您不确定选择什么,2048 位是默认推荐

4096 位 RSA:提供更高的安全级别,适合处理高度敏感的数据(如国家机密、金融交易、医疗记录)。4096 位 RSA 提供约 2^128 级别的安全性,远高于 2048 位的 2^112 级别。缺点是运算速度较慢(密钥生成比 2048 位慢约 5~10 倍,加解密也有明显的性能下降),且部分旧系统可能不支持。

8192 位及以上:主要用于应对量子计算威胁的长期安全需求,或特定的高安全性场景。由于密钥生成极其耗时,8192 位 RSA 在普通开发测试中很少使用。

量子计算的影响:Shor 算法在理论上可以在多项式时间内破解 RSA,无论密钥长度多大。但目前,通用量子计算机距离实际可用还有很长的路要走。对于需要长期保护的数据(如数十年后仍需保密),建议考虑向后量子密码学(PQC)椭圆曲线密码学(ECC)过渡。

实际建议:普通开发与测试用 2048 位,生产系统默认用 2048 位或 4096 位,高度敏感场景用 4096 位,并考虑未来过渡到 ECC 或 PQC。

#06

5 个实用技巧:避免踩坑,提升加密可靠性

即使使用标准的 RSA 算法,错误的用法也可能导致严重的安全漏洞。以下是 5 个实用技巧,帮助您避免常见踩坑:

① 务必使用安全的填充方案:加密时优先选择 RSA-OAEP(而不是 RSA-PKCS1-v1_5),签名时优先选择 RSA-PSS(而不是 PKCS#1 v1.5 签名)。PKCS#1 v1.5 存在已知的填充预言机攻击风险,多个历史漏洞(如 2012 年的 Lucky Thirteen、2014 年的 Bleichenbacher 后代攻击)都是针对它的。

② 妥善管理私钥,永远不要硬编码:私钥是 RSA 安全的核心。永远不要在源代码、配置文件、前端 JavaScript 中硬编码私钥。推荐使用密钥管理系统(KMS,如 AWS KMS、HashiCorp Vault)、硬件安全模块(HSM)、操作系统提供的密钥链(Keychain)、密码学安全的密钥派生函数(如 PBKDF2、scrypt、argon2)从口令派生密钥。密钥必须定期轮换,并最小化授权访问。

③ 使用混合加密,不要用 RSA 加密大文件:RSA 只能加密小于模数 n 的数据,且运算速度较慢。标准做法是:生成一个随机的 AES 密钥,用 RSA 公钥加密这个 AES 密钥,然后用 AES 加密实际数据(即混合加密)。接收方用 RSA 私钥解密出 AES 密钥后再解密数据。我们的 AES 工具可以用于对称加密部分。

④ 使用经过审计的加密库,不要自行实现 RSA:不要自己实现 RSA(或任何密码学原语)。使用经过广泛审计和测试的标准库:JavaScript 中的 Web Crypto APIwindow.crypto.subtle)或 crypto-js / node-forge、Java 中的 javax.crypto、Python 中的 cryptography 模块、Go 中的 crypto/rsa 包。这些实现已经过数百万开发者的验证。

⑤ 确保密钥生成使用密码学安全的随机数:生成 p 和 q 时必须使用操作系统提供的密码学安全随机数生成器(CSPRNG),如浏览器中的 crypto.getRandomValues()、Node.js 中的 crypto.randomBytes()、Linux 中的 /dev/urandom。切勿使用普通随机数生成器(如 Math.random()),它们的输出是可预测的,可能导致密钥被轻易破解。

#07

数据安全与隐私:为什么选择本地处理的在线工具

🔒 本地浏览器运算:我们的 RSA 工具完全在您的浏览器中运行。所有密钥生成、加解密运算均在本地 JavaScript 引擎中完成。您的明文、密文、公钥、私钥等信息不会上传到任何服务器,也不会被记录在任何日志中。即使在无网络连接的情况下,工具也能正常运行。

🛡️ 安全使用建议:使用本工具处理敏感数据时,建议在关闭浏览器扩展/插件的隐私模式下操作,并确保您的设备未被植入恶意软件。请勿在公共电脑或不可信设备上处理高度敏感信息。处理完毕后,请及时清除浏览器缓存,并关闭页面。

⚡ 高性能运算:RSA 的密钥生成运算相对较慢,但加解密运算速度对于日常开发测试完全够用。我们的工具使用标准的 JavaScript 实现,在普通笔记本电脑上可在几秒内完成 2048 位密钥生成。

🌐 开源与透明:我们使用业界标准的加密实现,算法逻辑对所有用户公开透明,确保没有任何隐藏的行为。数据安全与隐私是我们最核心的承诺。

⚠️ 法律合规提示:请确保您在使用本工具时遵守所在国家和地区的法律法规。本工具仅用于合法的数据保护、开发测试与学习研究用途,严禁用于任何非法目的。

💡 最后提醒:密码学是一门深奥的学科。本文提供的是概念性的介绍与实用建议,不能替代专业的安全审计。在生产系统中部署加密方案时,强烈建议咨询专业密码学家或安全工程师。我们的在线 RSA 工具可以作为您日常开发与学习的辅助工具,但生产环境的安全需要系统性的保障。