编码加密 · 非对称加密

RSA 加解密

公钥加密/私钥解密/签名验签

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 126 次使用
Web Crypto RSA · 浏览器本地运算 · 密钥 / 明文不上传 / 不缓存
明文(UTF-8)
公钥(PEM · SPKI)public key
密文(Base64)
结果将显示在此
· 公钥 PEM 用 SPKI(BEGIN PUBLIC KEY),私钥 PEM 用 PKCS#8(BEGIN PRIVATE KEY)。
· RSA-OAEP 直接加密有长度上限(约 密钥位数/8 − 2×Hash 字节 − 2,2048 位 + SHA-256 约 190 字节),长数据请用 AES + RSA 混合加密。
就绪 · 可点「生成临时密钥对」一键试用
第一节

关于本工具

About

对方发来一段密文和公钥,想确认身份,但手边没有 OpenSSL。这个工具直接在浏览器里完成 RSA 公钥加密、私钥解密、签名与验签——密钥对可粘贴或生成,签名结果附带原文哈希。所有运算在本地执行,不上传私钥或明文,适合开发调试、接口联调时快速验证加解密逻辑。

使用场景

壹

软件发布包签名

独立开发者凌晨发布客户端 2.0 更新包,用本工具生成 2048 位 RSA 密钥对,对安装包哈希值签名。用户下载后,用公钥验签确认包未被篡改或植入后门。之前有竞品安装包被劫持替换,用户安装后报毒,开发者背锅。现在签名后,验证通过即证明来源可信,减少因渠道污染引发的信任危机。

贰

API 接口身份校验

后端工程师给第三方支付回调接口加签名校验:回调参数拼接后,用私钥签名生成签名字段。第三方收到回调后,用公钥验签,只有签名通过才执行发货逻辑。之前没签名,被黑产重放请求刷了 300 单虚拟商品。现在每次回调签名不同,重放请求验签失败,直接拦截。

叁

敏感配置文件加密

运维工程师需要将数据库连接串(含密码)发给新入职的同事。直接明文发微信有泄露风险。用本工具的公钥加密配置文件,只有持有对应私钥的同事能解密。即使聊天记录被截获,攻击者没有私钥也无法还原密码。之前有人截图发群里,密码被离职员工看到,数据库被删表勒索。

肆

小团队内部消息加密

三人创业团队用微信群沟通产品规划,但群里混进了一个竞品卧底。他们约定:每次发核心需求前,用本工具将文字加密成密文发群里,只有持有私钥的两人能解密。卧底看到密文无法还原内容。之前有次功能排期被对手提前上线,损失两周窗口期。现在加密后,核心信息不再裸奔。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「明文」框输入待加密文本或数字,点击「生成密钥对」按钮,页面自动填充公钥与私钥字段
  2. 2从「操作类型」下拉选择「公钥加密」,点击「执行」按钮,右侧「密文」区显示 Base64 编码的加密结果
  3. 3切换操作类型为「私钥解密」,点击「执行」按钮,右侧「明文」区还原原始输入内容
  4. 4选择「签名」操作,输入任意消息后点击「执行」,下方「签名值」区生成固定长度的十六进制签名串
  5. 5选择「验签」操作,粘贴签名值与原始消息,点击「执行」后状态栏显示「验证通过」或「验证失败」

输入输出示例

输入输出说明
公钥加密:明文 = "hello", 公钥 = 2048-bit RSA 公钥(PEM格式)密文(Base64编码):"gH7...(64字符)..."常规:验证基本加密流程,输出为Base64编码的密文字节
私钥解密:密文 = 上一步输出的Base64字符串, 私钥 = 对应私钥(PEM格式)明文:"hello"常规:验证加解密闭环,输出与原始明文一致
签名:消息 = "message", 私钥 = 2048-bit RSA 私钥(PEM格式)签名(Base64编码):"aB3...(86字符)..."常规:验证签名生成,输出为Base64编码的签名值
验签:消息 = "message", 签名 = 上一步输出的Base64字符串, 公钥 = 对应公钥(PEM格式)验证通过:true常规:验证签名验签闭环,输出布尔值表示签名是否有效
公钥加密:明文 = ""(空字符串), 公钥 = 2048-bit RSA 公钥密文(Base64编码):"..."(非空,长度约86字符)边界:空字符串作为输入,RSA加密仍会输出非空密文(因填充机制)
私钥解密:密文 = 一个无效的Base64字符串 "invalid!!", 私钥 = 合法私钥错误:"Base64解码失败:输入不是有效的Base64字符串"边界:非法密文格式导致解密失败,暴露工具对输入格式的校验
公钥加密:明文 = "A" × 246 字符(超过2048-bit RSA单次加密最大长度245字节)错误:"明文长度超过最大限制(245字节),请分段加密或使用更长的密钥"易错:RSA单次加密有明文长度限制(密钥位数/8 - 填充开销),用户常忽略此限制
验签:消息 = "message", 签名 = 上一步合法签名但消息改为 "message2", 公钥 = 对应公钥验证通过:false易错:签名与消息不匹配时验签失败,验证签名对消息完整性的保护作用

常见错误对照

1.公钥加密时混入私钥格式的 PEM 头尾

✗ 错误-----BEGIN RSA PRIVATE KEY----- MIICWw... -----END RSA PRIVATE KEY-----
✓ 修复-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ... -----END PUBLIC KEY-----

加密操作只接受公钥(PUBLIC KEY 或 RSA PUBLIC KEY),传入私钥会导致解析失败,因为 OpenSSL 的 EVP_PKEY 类型不匹配。

2.签名结果未做 Base64 编码直接输出二进制

✗ 错误原始签名字节流(如 \x30\x45\x02\x21...)
✓ 修复Base64 编码后的字符串,如 MEUCIQCo5Y...

RSA 签名输出是 DER 编码的二进制,直接显示或传输会乱码。标准做法是 Base64 编码(RFC 4648),验签时再解码。

3.私钥解密时用了公钥

✗ 错误解密输入框里粘贴公钥(-----BEGIN PUBLIC KEY-----)
✓ 修复解密输入框里粘贴对应的私钥(-----BEGIN RSA PRIVATE KEY-----)

RSA 非对称性决定:公钥加密只能用私钥解密。用公钥解密会报 padding 错误或返回乱码,因为私钥才持有 d 参数。

4.明文长度超过密钥模长(未分段加密)

✗ 错误用 1024 位密钥加密 200 字节的明文
✓ 修复用 2048 位密钥加密,或分段加密(每段 ≤ 117 字节)

RSA 一次加密的明文上限 = 密钥位数/8 - 11(PKCS#1 v1.5 padding)。1024 位最多 117 字节,超长会报 'data too large for key size'。

5.签名时使用相同的密钥对做加解密而非签名验签

✗ 错误用加密函数(RSA_public_encrypt)代替签名函数(RSA_sign)
✓ 修复调用专门的签名接口(如 OpenSSL 的 RSA_sign 或 sign 方法)

加密和签名虽然都用私钥操作,但内部填充方式不同:加密用 PKCS#1 OAEP 或 v1.5 加密填充,签名用 PKCS#1 v1.5 签名填充或 PSS。混用会导致验签失败。

6.PKCS#1 格式密钥与 SPKI 格式混淆

✗ 错误将 -----BEGIN RSA PRIVATE KEY----- 的密钥直接用于需要 -----BEGIN PRIVATE KEY----- 的接口
✓ 修复确认工具要求的格式:传统格式(RSA PRIVATE KEY)或 PKCS#8 格式(PRIVATE KEY)

前者是 OpenSSL 传统格式(仅含 RSA 参数),后者是 PKCS#8 标准格式(含算法标识)。不匹配时解析会报 'no start line' 或 'bad decrypt'。

7.验签时未指定与签名相同的哈希算法

✗ 错误签名时用 SHA-256,验签时默认 SHA-1
✓ 修复验签时明确选择 SHA-256(与签名算法一致)

RSA 签名本质是对明文的哈希值做签名。哈希算法不一致时,验签会失败(signature mismatch),即使密钥对正确。

8.复制密钥时遗漏了换行或多余空格

✗ 错误-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ...-----END PUBLIC KEY-----
✓ 修复保持原始 PEM 格式,每行 64 字符,头尾各占一行

PEM 格式依赖换行符分割头尾和内容体。连成一行会被解析器视为无效 Base64,报 'unable to load key'。

第三节

工作原理

How It Works

核心公式

c = m^e mod n

变量说明

  • m明文,整数且小于 n
  • e公钥指数,通常为 65537
  • n模数,两个大素数乘积
  • c密文,整数结果

示例

取 p=61, q=53, n=61×53=3233, e=17, 明文 m=1234。加密:c = 1234^17 mod 3233。计算 1234^2=1522756, 1522756 mod 3233=1522756-3233×471=1522756-1522743=13,反复平方模乘得 c=855。密文 855 对应明文 1234。

RSA 加解密流程(纯浏览器实现)明文 / 签名数据公钥 / 私钥(用户粘贴或生成)密钥对生成随机素数 p, q计算 n = p × q加密 / 解密签名 / 验签(模幂运算)密文 / 签名值公钥 / 私钥
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问这个 RSA 加密是在我电脑上算的还是上传到服务器?+
答

所有计算都在浏览器本地完成,密钥和明文不会离开当前设备。页面实现方式标注为 FE(前端),意味着加解密逻辑是用 JavaScript 直接在浏览器里执行的,没有向服务器发送任何数据。断网刷新后页面仍然可用,也印证了这一点。如果担心隐私,可以生成密钥对后先加密一段敏感文本,再断开网络试试解密是否正常。

问公钥和私钥怎么生成?我点了半天没找到生成按钮。+
答

本工具不内置密钥生成功能,需要自己准备一对 RSA 密钥。常见做法:用 OpenSSL 命令行(`openssl genrsa -out private.pem 2048` 生成私钥,`openssl rsa -in private.pem -pubout -out public.pem` 提取公钥),或用 PuTTYgen、在线密钥生成器(注意安全)获取。拿到 PEM 格式的密钥文本后,直接粘贴到对应输入框即可使用。

问为什么我粘贴的私钥提示格式错误?+
答

最常见的原因是密钥包含多余的换行或空格,尤其是从网页或邮件复制时。RSA 私钥的 PEM 格式要求以 `-----BEGIN RSA PRIVATE KEY-----` 开头,以 `-----END RSA PRIVATE KEY-----` 结尾,中间每行 64 个字符。检查开头结尾是否有不可见字符;如果密钥是从 Windows 记事本复制,可能换行符是 CRLF,尝试用文本编辑器转为 LF 再粘贴。另外,确认密钥是 PKCS#1 格式,本工具暂不支持 PKCS#8。

问用公钥加密后,别人没有私钥也能解密吗?+
答

不能。RSA 的核心原理是公钥加密、私钥解密,两者是数学上配对的。用公钥加密的数据,只有对应的私钥才能解开,即使攻击者知道公钥也毫无办法。这也是 RSA 用于安全通信的基础——把公钥公开给任何人,对方用公钥加密消息后,只有持有私钥的人能读取。如果发现解密失败,请确认使用的私钥与加密所用的公钥是同一对。

问签名和加密有什么区别?我该用哪个?+
答

加密是保护数据机密性:用公钥加密,只有私钥能看。签名是验证数据完整性和身份:用私钥签名,任何人用公钥验签。举例:给同事发机密文件用加密;发布软件更新包用签名,用户下载后用公钥验签确认包没有被篡改且确实来自开发者。本工具两个功能都有,加密/解密用左侧选项卡,签名/验签用右侧选项卡,注意不要混淆密钥的使用方向。

问加密时提示“数据过长”,最多能加密多长的内容?+
答

RSA 有明文长度限制,取决于密钥位数和填充方式。以常用的 2048 位密钥配合 PKCS#1 v1.5 填充为例,一次最多加密 190 字节(2048/8 - 11 = 245 - 11 = 234,实际上 PKCS#1 v1.5 最多 245 字节减去 11 字节填充,但部分实现有差异,安全起见建议不超过 190 字节)。如果文本超出限制,需要分段加密,或者改用 AES 等对称加密算法。本工具对超长输入会直接报错,不会静默截断。

问生成的签名怎么是一长串乱码?验签应该用什么格式?+
答

签名结果是二进制数据,直接显示为乱码是正常的。本工具默认以 Base64 编码输出签名,方便复制和传输。验签时,需要把 Base64 字符串完整粘贴到验签输入框,并确保选择了相同的哈希算法(如 SHA-256)。如果签名方和验签方用的哈希算法不一致,验签会失败。另外,验签时输入的原文必须与签名时完全一致,包括空格和换行。

问我换了台电脑,之前加密的文件还能解密吗?+
答

只要私钥文件没有丢失就可以。RSA 密钥对是独立于设备的,私钥就是一个文本文件(PEM 格式),复制到新电脑上,用同样的私钥就能解密。建议将私钥保存在安全的地方,比如加密的 U 盘或密码管理器。如果私钥丢失,用任何手段都无法恢复加密数据,这是 RSA 的设计特性,也是它安全的原因。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭