工具
指南

RSA 加密 / 签名

加密

使用 Web Crypto 进行 RSA-OAEP 加密与 RSASSA-PKCS1-v1_5 签名。可生成密钥对或粘贴 PEM 密钥。

100% 客户端 无后端
消息
签名
密钥 (PEM)
输出
公钥 (PEM)
私钥 (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 保护那把对称密钥。

怎么使用#

  1. 生成一对密钥。 选好位数(2048 / 3072 / 4096),点 Generate。下方会填入两个只读框:公钥私钥,都是 PEM 格式。各自复制妥善保管——私钥绝对不能外泄。
  2. 选择模式EncryptDecryptSignVerify
  3. 按模式把正确的密钥填进 Key 框:
    • Encrypt → 粘公钥
    • Decrypt → 粘私钥
    • Sign → 粘私钥
    • Verify → 粘公钥
  4. 填写消息。验签时还要把签名(base64)粘进 signature 框。
  5. 执行。状态栏会给出结果——验签时会明确告知签名有效还是无效。

核心特性#

  • 一对密钥,两种算法。 同一段 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 段只存在于你的浏览器标签页里,不会被传输。如果你要处理生产环境的私钥,请在你自己可控的环境里生成,而不是把它粘进任何网页——无论那页面看上去多可信。