⭐ 觉得好用?收藏备用,下次直接打开 ✨ 开通会员去广告 · 更多权益即将开放 ☕ 支持作者
🗝️
密钥只在本机浏览器内生成与使用,不上传、不联网、不留存,页面也不会把私钥写进本地存储。这里生成的密钥仅供学习与联调,请勿用于生产,也不要粘贴生产环境的真实私钥;任何因在公共设备操作导致的泄露,本工具不承担责任。

RSA 加解密在浏览器本地完成公钥加密、私钥解密、私钥签名与公钥验签,并能一键生成 1024~4096 位密钥对。支持 PKCS#1 v1.5 与 OAEP 两种加密填充、PKCS#1 v1.5 与 PSS 两种签名方案、SHA-1/256/384/512 四种摘要,PEM 可按 PKCS#1 或 PKCS#8 输出——联调时对不上,问题基本都落在这几个开关的组合上。

用途谁来做谁能验证
加密用公钥加密只有持私钥的人能解开
签名用私钥签名任何拿到公钥的人都能验证

方向搞反是初学者最常见的错误:公钥是公开的,用私钥”加密”等于人人可解,那叫签名,不叫加密。

一次能加密多少字节

RSA 单次能处理的明文受密钥模长严格限制:

密钥位数PKCS#1 v1.5OAEP-SHA256
1024 位117 字节62 字节
2048 位245 字节190 字节
4096 位501 字节446 字节

超过就必须换思路,而不是换更长的密钥:用 AES 加密正文,用 RSA 只加密那把 AES 密钥,再把两段密文一起发出去。这套组合叫混合加密,是所有实际系统的标准做法。

密钥格式速查

PEM 头含义常见来源
BEGIN PUBLIC KEYPKCS#8 公钥(SPKI)通用,Java / Go 首选
BEGIN RSA PUBLIC KEYPKCS#1 公钥openssl 传统格式
BEGIN PRIVATE KEYPKCS#8 私钥Java / Go 标准库
BEGIN RSA PRIVATE KEYPKCS#1 私钥openssl 默认输出
BEGIN CERTIFICATEX.509 证书可直接粘贴,自动提取其中的公钥

不带 -----BEGIN----- 头尾的裸 Base64 也能直接粘贴——很多 Java、PHP 项目的配置文件里就是这么存的,工具会自动尝试补齐外壳。若手上只有私钥,点「由私钥推导」就能算出配套公钥。

什么时候该换个工具

  • 要处理长数据 —— 改用混合加密,正文交给 AES
  • 要做 JWT 签发验签 —— 用专门的 JWT 工具,它会一并处理 header、payload 与时效
  • 要看证书里的有效期和域名 —— 用证书解析工具
  • 要在生产环境生成密钥 —— 用 openssl 或云上 KMS,别用浏览器

⚠️ 安全提醒:密钥的生成与使用全部在你的浏览器本地完成,不上传、不联网、不留存,私钥也不会写入本地存储。但请勿粘贴生产环境的真实私钥,这里生成的密钥也仅供学习与联调。

📍使用场景

  • 联调时验证签名逻辑对方说验签不过,把原文、签名、公钥贴进来当场跑一遍,立刻分辨是签错了、验错了,还是摘要算法选岔了。
  • 临时造一对测试密钥写 Demo 或搭测试环境要一对 RSA 密钥,不想装 openssl 也不敢用在线服务,这里生成完直接复制,PKCS#1 和 PKCS#8 都能出。
  • 解开日志里的一段密文手上有私钥和一段 Base64 密文,想确认里面到底是什么,切换 PKCS#1 v1.5 与 OAEP 试一下就知道对方用的哪种填充。
  • 搞懂公钥私钥谁加密谁解密加密用公钥、签名用私钥,两条链路在同一页面并排放着,动手点几次比看十张原理图都清楚。

❓常见问题

为什么提示"明文超过上限"?

RSA 天生只能加密很短的数据。 上限等于密钥模长减去填充开销:2048 位密钥配 PKCS#1 v1.5 是 245 字节,配 OAEP-SHA256 是 190 字节。正确做法不是换更长的密钥,而是混合加密——用 AES 加密正文,再用 RSA 只加密那把 AES 密钥。所有 HTTPS、支付接口都是这么做的。

PKCS#1 v1.5 和 OAEP 选哪个?

新项目一律用 OAEP。 PKCS#1 v1.5 的填充存在已知的选择密文攻击面(Bleichenbacher 攻击),现代密码库都建议弃用;它在本工具保留,是因为国内大量老接口和支付网关仍在用。OAEP 需要额外约定一个摘要算法(通常 SHA-256),两端必须一致,否则解密会直接失败。

PKCS#1 和 PKCS#8 格式有什么区别?

是同一把密钥的两种外包装,内容完全等价。PKCS#1 以 -----BEGIN RSA PRIVATE KEY----- 开头,是 openssl 的传统输出;PKCS#8 以 -----BEGIN PRIVATE KEY----- 开头,多包了一层算法标识,Java 和 Go 的标准库通常只认它。本工具两种都能读、都能生成,粘进来不用手动转换。

验签不通过,可能是哪里错了?

逐项核对四件事:① 原文是否完全一致,多一个换行或空格都不行;② 公钥是不是签名那把私钥对应的;③ 摘要算法两端是否都是 SHA-256(或都是 SHA-1);④ 签名方案是 PKCS#1 v1.5 还是 PSS。另外注意签名的编码——Base64 和 Hex 别混用,+ / 与 - _(Base64URL)也不是一回事。

生成 4096 位密钥为什么这么慢?

因为要在浏览器里用纯 JavaScript 反复做大素数搜索与素性检验,位数每翻一倍,耗时增长远超一倍。2048 位通常几秒内完成,4096 位可能要十几秒到一分钟。除非明确要求,2048 位就够用——它是当前绝大多数场景的行业标准,NIST 建议至少用到 2030 年。生成期间页面不会卡死,但请勿关闭标签页。

在这里生成的密钥能用于生产吗?

不建议。 密钥确实是在你本机浏览器里生成的,不上传也不留存,但生产密钥应当在受控服务器上由 openssl 或 KMS 生成,并且从不离开那台机器。浏览器环境有扩展、剪贴板、屏幕录制等一堆你控制不了的因素。这里生成的密钥请只用于开发、测试和学习。