← 返回加密工具箱

RSA 加密完全指南:为什么不能加密大文件

加密工具箱 · 使用教程

几乎所有开发者都知道 RSA 是非对称加密的代表,但真正用过的人常常会撞上同一个墙:“为什么加密一段稍长的文本就报错了?” 这篇文章解释这个限制的来源,以及实际系统是怎么绕过它的。

一、RSA 是什么

RSA 是最经典的非对称加密算法,1977 年由 Rivest、Shamir、Adleman 三人提出(名字就是三人姓氏首字母)。它有一对密钥:

密钥要不要保密用途
公钥公开,可以随便发加密、验证签名
私钥绝对保密解密、生成签名

它的安全性建立在一个数学难题上:把两个大质数相乘很容易,但把乘积分解回两个质数极难。2048 位的 RSA 密钥,就是两个约 1024 位的大质数的乘积。

二、为什么不能加密大文件

这是 RSA 最反直觉的限制。原因是:**RSA 一次只能加密一个“数学块”,而这个块的大小受密钥长度限制。**

具体数字(2048 位密钥):

密钥长度        2048 位 = 256 字节
减去填充开销    约 11 字节(PKCS#1 v1.5)
────────────────────────────────
实际可加密      最多 245 字节

245 字节,大约 80 个汉字。超过就报错。

为什么不能像 AES 那样分段加密?技术上可以,但会有两个致命问题:

三、实际做法:混合加密

既然 RSA 只能加密短数据、AES 又快又能加密任意长度,那就组合起来用。这就是 **TLS/HTTPS 的实际工作方式**:

  1. 客户端生成一个随机的 AES 密钥(16 或 32 字节)
  2. 用服务器的 RSA 公钥加密这个 AES 密钥
  3. 把加密后的 AES 密钥发给服务器
  4. 服务器用 RSA 私钥解出 AES 密钥
  5. 双方后续用这把 AES 密钥加密所有业务数据

RSA 只负责安全地传递那把小小的对称密钥,真正的大流量交给 AES。这个模式叫**数字信封**。

如果你要自己实现“用 RSA 加密一段长文本”,正确的做法不是分段 RSA,而是:随机生成 AES 密钥 → AES 加密正文 → RSA 加密 AES 密钥 → 把两者一起发给对方。

四、签名和加密:方向相反

这是另一个高频混淆点。两者都用 RSA,但目的和方向完全不同:

加密签名
目的保密(别人看不到)认证(确认是谁发的、有没有被改)
用哪把钥匙操作公钥加密私钥签名
用哪把钥匙还原私钥解密公钥验证
数据是否可见不可见可见(签名是附加的)

记忆方法:**加密是“锁上给别人”,签名是“盖章证明是我”。**

签名的实际做法不是对原文直接签,而是先算原文的哈希,再对哈希签名。因为哈希值固定很短,正好符合 RSA 的长度限制。

五、填充方案

RSA 不能直接加密裸数据,必须先填充。常见的有两种:

方案安全性说明
PKCS#1 v1.5⚠️ 有已知攻击老系统常见,新项目不建议
OAEP✅ 推荐带随机性,当前标准做法

OAEP 会引入随机数,所以**同一段明文加密两次会得到不同密文**——这是正确行为。如果你需要密文稳定,那应该用哈希而不是加密。

六、密钥长度怎么选

长度状态
1024 位❌ 已不推荐,理论上可被资源充足者分解
2048 位✅ 当前主流,够用到 2030 年前后
4096 位✅ 更安全,但加解密慢约 6 倍

一般选 2048 位。只有在密钥生命周期很长(比如代码签名证书)时才需要 4096 位。

七、怎么用本站工具

  1. 先用加密工具箱的「RSA 密钥对」标签页生成一对密钥(或粘贴你已有的)
  2. 切到 RSA 标签页,粘贴公钥和私钥
  3. 输入短文本(2048 位密钥最多 245 字节),点「公钥加密」
  4. 解密用「私钥解密」;签名用「私钥签名」,验证用「公钥验证」

所有运算在浏览器本地完成。私钥不会离开你的电脑。

八、常见问题

报错 “message too long” 怎么办?
就是触发了 RSA 的长度上限。2048 位密钥最多加密 245 字节(PKCS#1 v1.5)。解决办法是改用混合加密:AES 加密正文,RSA 只加密 AES 密钥。
公钥和私钥能互换使用吗?
数学上可以,但不该这么做。RSA 的设计是:公钥加密、私钥解密,私钥签名、公钥验证。如果你用私钥加密、公钥解密,那等于放弃保密性——因为公钥是公开的,谁都能解开。
PEM 格式那一堆横线是什么?
PEM 是 Base64 编码的密钥,用 -----BEGIN ...----- 包裹。常见的有三种:BEGIN PUBLIC KEY(公钥)、BEGIN RSA PRIVATE KEY(PKCS#1 格式私钥)、BEGIN PRIVATE KEY(PKCS#8 格式私钥)。选错格式会导致解析失败。
为什么同一段明文加密两次结果不同?
因为用了 OAEP 填充,每次都会引入随机数。这是安全设计,不是 bug。解密仍然正常。
RSA 会被量子计算破解吗?
会。Shor 算法在足够大的量子计算机上可以分解大整数,从而破解 RSA。这也是为什么业界在推进后量子密码(PQC)标准。不过目前实用的量子计算机还远未达到这个规模,2048 位 RSA 在近期仍然安全。
签名能当加密用吗?
不能。签名不隐藏内容,只是附加一段可验证的证明。如果需要既保密又可验证,要同时做加密和签名(先签名再加密,或者先加密再签名,顺序取决于具体协议的安全要求)。