ToolAct工具行动

RSA 加密解密工具

在线 RSA 非对称加密,支持密钥对生成、公钥加密、私钥解密

密钥管理

公钥
私钥
输入内容
字符数: 0
字节数: 0
转换结果
字符数: 0
字节数: 0

什么是 RSA 加密?

RSA(Rivest-Shamir-Adleman)是世界上第一个广泛使用的非对称加密算法,由三位 MIT 数学家 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年发明。与 AES 等对称加密算法不同,RSA 使用一对密钥:公钥用于加密,私钥用于解密。公钥可以公开分享,而私钥必须严格保密,这种机制从根本上解决了密钥分发的难题。 RSA 的安全性基于大整数质因数分解的数学难题——将两个大素数相乘非常容易,但将结果分解回原来的两个素数却极其困难。目前推荐使用 2048 位或更长的密钥,因为 1024 位密钥已被认为不够安全。量子计算机的发展对 RSA 构成潜在威胁,但目前实用的量子计算机尚未出现。 RSA 的应用场景包括:HTTPS/TLS 握手阶段的密钥交换、数字签名和身份验证(如 SSH、代码签名)、电子邮件加密(PGP/GPG)、区块链和加密货币的交易签名等。在实际应用中,RSA 通常用于加密对称密钥(如 AES 密钥),再由对称密钥加密实际数据,这种混合加密方式兼顾了安全性和性能。本工具使用浏览器原生 Web Crypto API 实现 RSA 加密解密,所有操作在本地完成。

使用方法

使用方法

  1. 选择密钥长度(建议 2048 位及以上)
  2. 选择填充方案(推荐 OAEP,安全性更佳)
  3. 选择哈希算法(推荐 SHA-256)
  4. 点击「生成密钥对」以创建公钥和私钥
  5. 加密:将公钥粘贴到公钥区域,输入明文,密文将自动生成
  6. 解密:将私钥粘贴到私钥区域,输入密文,明文将自动生成
  7. 复制结果,或点击「交换」互换输入和输出

参数指南

  • 新的加密测试建议使用带 SHA-256 或更强算法的 RSA-OAEP;PKCS#1 v1.5 仅用于旧系统兼容。
  • RSA 只能加密较小的数据量。加密较大数据时,建议用 RSA 加密一个随机 AES 密钥,再用 AES 加密实际内容。
  • 请勿通过聊天、工单、截图或共享日志分享私钥。公钥可公开分享,但私钥必须严格保密。

使用场景

在浏览器中生成 RSA-OAEP 密钥对选择 512、1024、2048、3072 或 4096 位模数长度和 SHA-1、SHA-256、SHA-384 或 SHA-512 哈希算法,然后通过 Web Crypto 生成可导出的 PEM 格式公钥和私钥。密钥对保持在浏览器标签页中,以 SPKI(公钥)和 PKCS#8(私钥)PEM 块的形式导出——非常适合在不配置密钥服务器的情况下设计互操作性测试。
加密和解密短文本负载粘贴公钥将明文加密为 Base64 或十六进制,或粘贴私钥解密所选格式的密文。输入和输出的字节数帮助暴露负载大小问题,这很重要因为 2048 位密钥上的 RSA-OAEP(SHA-256) 只能加密大约 190 字节的明文。私钥和消息在整个操作过程中都保持在本地标签页内。
无需外部工具即可测试密钥处理复制公钥或私钥 PEM 块,在实验时交换面板,并在同一页面内切换加密/解密模式。这对于学习 RSA-OAEP 语义、与 openssl 进行互操作性检查,以及密钥材料不应离开本机的本地原型开发非常有用。
为互操作性检查选择 OAEP 哈希算法在 OAEP 设置中切换 SHA-1、SHA-256、SHA-384 和 SHA-512,以匹配对端应用使用的哈希算法。哈希不匹配会导致 Web Crypto 抛出通用的 OperationError 解密失败,因此在此验证配对可以节省在 Node crypto、Python cryptography 或 Java javax.crypto 服务之间对接密钥时的调试时间。
在加密前认识负载大小限制RSA-OAEP 只能加密长度小于密钥模数减去 2*hashLen - 2 字节填充开销的消息,因此对数千字节的数据块尝试加密会抛出 InvalidAccessError。使用输入字节计数器和密文输出长度(对于 OAEP 等于密钥模数的字节数)来确认测试未超过上限,然后将大数据迁移到使用 RSA 包装会话密钥的 AES 方案。

技术原理

RSA 是 1977 年 Rivest-Shamir-Adleman 提出的公钥密码系统。密钥生成时选取两个大随机素数 p 和 q,设置模数 n = p · q,计算欧拉函数 φ(n) = (p-1)(q-1),选择与 φ(n) 互质的公钥指数 e(e = 65537 = 2^16 + 1 是事实标准,因为其低汉明权重加速了模幂运算),再通过扩展欧几里得算法求私钥指数 d ≡ e^-1 (mod φ(n))。加密为 c = m^e mod n;解密为 m = c^d mod n。安全性基于对足够大的 n 进行质因数分解的困难性假设。 原始 RSA 是确定性且可延展的,因此每个实际部署都会用填充方案包装消息。RSA-OAEP 定义在 RFC 8017(PKCS#1 v2.2)中,使用 MGF1 遮罩生成函数配合 SHA-256(或 SHA-1/384/512),提供语义安全性:相同明文每次调用产生不同密文,填充完整性检查阻止了选择密文攻击。旧的 PKCS#1 v1.5 填充因向后兼容仍常见,但容易受到 Bleichenbacher 百万消息预言机攻击。签名方面,RSASSA-PSS 优于 PKCS#1 v1.5 签名,原因相同。 密钥大小选择受性能和最新分解记录双重约束。NIST SP 800-57 规定当前至少 2048 位,2030 年后至少 3072 位。椭圆曲线密码学以仅 256 位(NIST P-256、Curve25519)即可匹配 RSA 3072 的安全强度,这也是大多数新 TLS 部署偏好 ECDHE + ECDSA 的原因。RSA-OAEP 在 2048 位密钥上最多可包装 ⌊keysize/8⌋ − 2·hashLen − 2 字节的明文(SHA-256 约 190 字节),因此生产系统仅用 RSA 包装新的对称会话密钥,由 AES-GCM 承载实际数据——这就是每次 TLS 握手背后的混合模式。在浏览器中,Web Crypto API(window.crypto.subtle)处理密钥生成、导入、加密和解密,支持 PEM/DER(SPKI 用于公钥、PKCS#8 用于私钥)或 JWK 作为传输格式。

  • 数学原理:选取素数 p、q;n = p·q;φ(n) = (p-1)(q-1);选择 e(通常为 65537 = 2^16+1);计算 d = e^-1 mod φ(n);加密 c = m^e mod n;解密 m = c^d mod n。
  • 填充方案:新代码使用 RFC 8017(PKCS#1 v2.2)中的 RSA-OAEP 配合 MGF1+SHA-256;PKCS#1 v1.5 仅用于旧系统兼容,存在 Bleichenbacher 攻击风险(CVE-2017-13099 等)。
  • 密钥大小:NIST SP 800-57 规定当前最低 2048 位,2030 年起最低 3072 位;1024 位 RSA 已被视为不安全,4096 位 CPU 开销明显更高。
  • 负载上限:RSA-OAEP 最多可包装 ⌊k/8⌋ − 2·hashLen − 2 字节(2048 位 + SHA-256 约 190 字节);更大的数据需用 RSA 包装 AES-GCM 会话密钥。
  • 等效强度:RSA 3072 ≈ ECC 256(NIST P-256 或 Curve25519),对称安全级别约 128 位;ECC 在密钥大小和签名速度上占优,RSA 在验证速度上占优。
  • 浏览器 API 和格式:window.crypto.subtle.generateKey('RSA-OAEP');导出为 SPKI PEM(公钥)和 PKCS#8 PEM(私钥)或 JWK;私钥绝不应以明文形式离开本地环境。

示例

基本加密

1. 生成 2048 位密钥对
2. 复制公钥
3. 输入明文: Hello, RSA!
4. 选择 OAEP + SHA-256
5. 输出: Base64 编码的密文

RFC: RFC 8017(PKCS#1 v2.2)定义了 RSAES-OAEP 加密方案

典型流程

发送方:
1. 获取接收方的公钥
2. 用公钥加密消息
3. 发送密文

接收方:
1. 用私钥解密
2. 读取原始消息

说明:RSA 加密只提供机密性;如需身份验证,需配合 RSA 签名(RFC 8017 中的 RSASSA-PSS)

混合加密(RSA + AES)

RSA 适合加密小数据(如会话密钥)
大数据应使用混合加密:
1. 生成随机的 AES-256 密钥
2. 用 RSA 加密 AES 密钥(OAEP-SHA256 下最大约 190 字节)
3. 用 AES-GCM 加密实际数据
4. 发送 RSA 加密的密钥 + AES 密文 + IV + 认证标签

这种方式结合了 RSA 的密钥分发能力和 AES 的速度优势,是 TLS、PGP 和 S/MIME 的标准模式。
RFC: RFC 8017 第 7.1 节讨论了用于密钥封装的 RSAES-OAEP

常见问题

应该生成多大的密钥?

RSA-2048 是当前的实际下限,也是 TLS 证书多年来普遍使用的长度。按照 NIST SP 800-57,RSA-3072 是更稳健的现代默认值。RSA-4096 对大多数场景过于冗余(速度明显更慢),但适合长期使用的签名密钥。RSA-1024 在政策上已被认定为不安全,不应再用于任何新场景。

公钥和私钥——哪个加密、哪个解密?

用于保密时:用公钥加密,用私钥解密。任何人都能给你发加密消息,只有持有私钥的人才能读到。用于签名时正好相反:用私钥签名,用公钥验签。

为什么同一段文本加密两次得到的密文不一样?

推荐使用的填充方案 RSA-OAEP 会引入随机性,使相同的明文每次产生不同的密文。这是有意为之——可防御选择密文攻击。不带填充的「教科书 RSA」是确定性的,且不安全,不要使用。

为什么 RSA 比 AES 慢得多?

RSA 进行的是大整数模幂运算,而 AES 是小块上的固定位运算。一次 2048 位 RSA 加密比一次 AES-128 加密慢上千倍。实践中,RSA 通常只用来包裹一个较小的 AES 会话密钥,真正的载荷再用 AES 加密。

一次 RSA 加密最多能处理多少数据?

使用 SHA-256 的 RSA-OAEP 每次大致可加密 (key_size_in_bits / 8 - 66) 字节:2048 位密钥约 190 字节,3072 位约 318 字节,4096 位约 446 字节。若数据更大,请用 RSA 加密 AES 密钥,再用该 AES 密钥加密数据。

密钥生成是真随机且本地完成的吗?

是的。密钥生成调用 Web Crypto API 的 crypto.subtle.generateKey,其熵来自操作系统级 CSPRNG。密钥不会离开你的浏览器。刷新页面即可丢弃当前密钥并生成新的;切勿将生产环境的私钥粘贴到任何网页中。

RSA 能抵抗量子计算吗?

不能。具备足够规模的量子计算机运行 Shor 算法可以在任何实际密钥长度下攻破 RSA。NIST 已于 2024 年标准化了后量子替代方案(ML-KEM、ML-DSA)。对需要长期保密数十年的数据应规划迁移;对短生命周期的 TLS 会话,RSA 暂时仍可用。