RSA 加密 / 签名
加密使用 Web Crypto 进行 RSA-OAEP 加密与 RSASSA-PKCS1-v1_5 签名。可生成密钥对或粘贴 PEM 密钥。
本页内容
什么是 RSA?#
RSA 是非对称密码学:它用一对相互匹配的密钥,而不是一个共享密钥。公钥可以发给任何人——它的职责只有两个:把数据锁起来、校验签名。私钥则始终留在你手里,是唯一能解开「用公钥加密的数据」、或产出「人人可验的签名」的东西。正是这种分离,让从未共享过密钥的双方也能交换保密消息、并证明身份。
本页覆盖 RSA 通常被用来做的四件事,全部走浏览器原生 Web Crypto 引擎:
- 加密 / 解密 用 RSA-OAEP(SHA-256)——现代的、带认证填充的方案。用公钥加密的短消息,只有私钥能读回。
- 签名 / 验签 用 RSASSA-PKCS1-v1_5(SHA-256)——互通性最好的签名方案,至今多数 JWT 与 X.509 证书链仍在用。
- 生成密钥对 产出 2048 / 3072 / 4096 位的密钥对,公钥指数为 65537,以标准 PEM 格式导出(公钥是 SubjectPublicKeyInfo,私钥是 PKCS#8)。
RSA 被刻意限制在短载荷上。以 RSA-2048 配 SHA-256 为例,单次能加密的消息上限约 190 字节;超出这个量,请改用对称加密工具,再用 RSA 保护那把对称密钥。
怎么使用#
- 生成一对密钥。 选好位数(2048 / 3072 / 4096),点 Generate。下方会填入两个只读框:公钥和私钥,都是 PEM 格式。各自复制妥善保管——私钥绝对不能外泄。
- 选择模式:Encrypt、Decrypt、Sign 或 Verify。
- 按模式把正确的密钥填进 Key 框:
- Encrypt → 粘公钥。
- Decrypt → 粘私钥。
- Sign → 粘私钥。
- Verify → 粘公钥。
- 填写消息。验签时还要把签名(base64)粘进 signature 框。
- 执行。状态栏会给出结果——验签时会明确告知签名有效还是无效。
核心特性#
- 一对密钥,两种算法。 同一段 PEM 既能用于 OAEP 加密,也能用于 PKCS#1 签名,因为 Web Crypto 是在导入时指定算法的。
- 标准 PEM 输出。 公钥为 SPKI,私钥为 PKCS#8——各语言、各平台都能原生读取。
- 公钥指数 65537。 业界通用取值;小到足够快,大到避开已知弱点。
- 签名互通。 RSASSA-PKCS1-v1_5 正是现实里 JWT、代码签名、证书链所期待的格式。
- 零上传。 生成密钥、加密、签名全部在浏览器本地完成,私钥绝不经过服务器。
实战示例#
选中 2048 后点 Generate。公钥框会填入形如这样的 PEM:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyY7v...(数行 base64)
-----END PUBLIC KEY-----
私钥框会填入更长的 -----BEGIN PRIVATE KEY----- 段。接着切到 Encrypt,把公钥粘进 Key 框,消息填 handshake: 0x4F2A,执行。输出是一段约 344 字符的 base64——正好是 256 字节的 RSA-2048 密文做 base64 编码。
再切到 Decrypt,把私钥粘进 Key 框,把刚才那段密文放进消息框,执行:原始的 handshake: 0x4F2A 就回来了。签名流程同理:用 Sign 产出一段约 344 字符的 base64 签名,Verify 配合公钥会判定它有效——而只要你在验签前改动消息里哪怕一个字符,结果就会变成无效。
常见问题#
为什么 RSA 只能加密短消息?#
RSA 是在「模密钥长度」的数上运算的。RSA-2048 一块是 256 字节,OAEP 填充要消耗 2 * hashLen + 2 字节(SHA-256 下是 98 字节),留给消息的只剩 190 字节。这是有意为之——RSA 服务于密钥和签名,而不是批量数据。标准做法是「混合」:用 AES 加密大批数据(用对称加密工具),再用 RSA 只加密那把 AES 密钥。
2048、3072 还是 4096 位?#
2048 是当今基线,对多数用途仍够用。3072 大致对标 128 位对称强度;4096 是保守之选,适合你想用上十年以上的密钥。每升一档,密钥生成和每次运算都会明显变慢,而安全收益是递减的。
加密和签名有什么区别?#
加密关乎保密:公钥加锁,私钥解锁。签名关乎真实:私钥产出签名,公钥检验签名。它们用的是同一对密钥,但算法不同(OAEP 对 PKCS#1),回答的也是不同的问题——「谁能读到这段数据?」对比「这段数据是不是真由这把密钥的持有人产出的?」。
生成或使用私钥时,它会被发送出去吗?#
不会。生成、加密、解密、签名、验签全部由 Web Crypto 在页面内完成。那些 PEM 段只存在于你的浏览器标签页里,不会被传输。如果你要处理生产环境的私钥,请在你自己可控的环境里生成,而不是把它粘进任何网页——无论那页面看上去多可信。