piapia123
zh

RSA 加解密、签名验签与密钥生成

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

用 RSA 公钥加密、私钥解密,或者做签名与验签 —— 全程在浏览器本地完成,密钥与内容都不会上传。四种 PEM 写法都认:`PUBLIC KEY` 与 `PRIVATE KEY`(X.509 / PKCS#8),以及 `RSA PUBLIC KEY` 与 `RSA PRIVATE KEY`(PKCS#1,OpenSSL 老版本和 `ssh-keygen` 转出来的常见形态,本工具会替它补上 ASN.1 外壳再交给浏览器的密码学接口)。手边没有密钥就用「生成密钥对」:在本地现生成一对,输出 PKCS#8 私钥与 SPKI 公钥两段 PEM,可以直接存成文件。⚠️ 三点需要知道:加密用的是 OAEP 填充 —— 浏览器接口刻意不提供 PKCS#1 v1.5 的加密(它有 Bleichenbacher 填充预言攻击),要对接只认 `PKCS1Padding` 的老系统得上服务端;RSA 能加密的数据很短,2048 位密钥配 OAEP-SHA256 时上限是 190 字节,长内容请用混合加密(随机生成一个 AES 密钥加密正文,再用 RSA 加密那把密钥);1024 位已被认为不安全,只用于兼容旧系统,新系统请用 2048 位及以上。

功能

  • 五种操作:生成密钥对、加密、解密、签名、验签
  • 可在本地生成 1024 / 2048 / 3072 / 4096 位的 RSA 密钥对,输出 PKCS#8 私钥与 SPKI 公钥 PEM
  • 四种 PEM 写法都认,含 PKCS#1(自动补 ASN.1 外壳)
  • 密钥带换行、缩进、首尾空白都能直接用
  • 密文与签名可输出 Base64 或十六进制
  • 加密解密用 OAEP-SHA256,签名验签用 RSASSA-PKCS1-v1_5(兼容性最好)
  • 用错了密钥类型(该给公钥却给了私钥)会明确指出,而不是抛一句填充错误

使用方法

  1. 选择操作:生成密钥对 / 加密 / 解密 / 签名 / 验签
  2. 加密或签名时把 PEM 密钥粘贴进「公钥 / 私钥」选项;生成密钥时不必填
  3. 验签时还要把签名填进对应字段
  4. 把内容粘贴进输入框,按 Ctrl/⌘ + Enter 或点「运行」;生成 3072 / 4096 位密钥要等几秒

常见问题

为什么不能用 PKCS#1 v1.5 加密?
因为浏览器的 Web Crypto 接口只实现了 OAEP。这不是疏漏:v1.5 的加密存在 Bleichenbacher 填充预言攻击 —— 攻击者通过观察「填充错误」与「解密后内容不对」这两种不同的失败方式,可以逐步把密文解出来,1998 年提出以来一直有新的变体。规范因此把它从加密里排除,只保留它做签名(签名场景下不涉及填充预言)。所以本工具做不了 `RSA/ECB/PKCS1Padding`,那是老系统里很常见的写法,需要服务端或专门的库。
RSA 能加密多长的内容?
很短,而且与密钥长度直接相关:RSA-OAEP 配 SHA-256 时,2048 位密钥的单次上限是 190 字节(256 减去 2×32 的哈希长度再减去 2),4096 位是 446 字节。超过就会失败。这不是实现限制,而是 RSA 的数学结构决定的。要加密长内容,行业里的通行做法是混合加密:随机生成一把 AES 密钥去加密正文,再用 RSA 只加密那把 AES 密钥 —— 而 AES 密钥正好 16 或 32 字节,远在限制之内。
签名和加密有什么区别?该用哪个?
加密解决「别人看不到」(用对方的公钥加密,只有对方能用私钥解开);签名解决「确实是某人发的、且没被改过」(用自己私钥签,任何人用你的公钥验)。两者方向相反:加密是公钥进、私钥出,签名是私钥进、公钥出。实际系统里往往两个都用 —— 比如传输一份合同,用对方的公钥加密保证保密,同时用自己的私钥签名保证来源。本工具的两个模式恰好对应这两件事,注意别把密钥给反了。
「生成密钥对」生成的是什么?该选多少位?
生成的是两段标准 PEM:PKCS#8 的私钥与 SPKI 的公钥,由浏览器的密码学随机源现生成,只在本次输出里存在。长度上,2048 位是现在的推荐值,兼容性与安全性都够;1024 位已被认为不安全(学术界能承担其分解成本),只在你必须对接某个老系统时用;3072 / 4096 更抗未来,代价是生成要等几秒,且加解密更慢。生成是纯计算,界面点击后请稍候 —— 3072 / 4096 位不是卡死了,是在算。

相关工具