RSA 加密完整指南:密钥生成、加密解密示例与安全实践

更新 2026-08-09 约 14 分钟 开发工具 How-to

接口要在不可信通道上传敏感字段、前后端交换会话密钥,或你只想在本机验证「公钥加密、私钥解密」是否走通时,RSA 几乎是第一选择。本指南分清公钥/私钥职责、密钥长度与填充、PEM 导入导出,给出可对着 WebUtils 完成的步骤、原创错误表与真实场景,避免把 RSA 当对称加密乱用或把 1024 位密钥当成生产可用。

立即使用相关工具 RSA 加密解密 — 浏览器内密钥生成与加解密,本地处理
打开工具 →

核心一句话

RSA 用公钥加密、私钥解密;它解决密钥分发,不替代 AES 的高速批量加密。

非对称加密让「谁都能用公钥封信,只有持钥方能拆」成为可能。生产里更常见的是:用 RSA(或 ECDH)保护一枚短期对称密钥,再用 AES 加密大体积数据。下面按「原理 → 密钥生成 → 工具操作 → 排错 → 场景 → 选型」展开,主工具为 RSA 加密工具,密钥生成可配合 RSA 密钥生成器

RSA 解决什么问题

对称算法(如 AES)快,但通信双方必须先共享同一密钥——密钥怎么安全送到对方手里,本身就是难题。RSA 把密钥拆成一对:

  • 公钥:可公开分发,用于加密或验签。
  • 私钥:严格保密,用于解密或签名。

典型用途包括:

  • 前端用后端公钥加密登录凭据或配置片段,后端私钥解密。
  • 用私钥对摘要签名,对端用公钥验签(JWT RS256、代码签名、软件更新包)。
  • TLS 握手历史上曾大量使用 RSA 密钥交换(现代更偏向 ECDHE,但证书里仍常见 RSA 密钥)。
  • 本地脚本、运维工具在「只能文本通道」里传递短密钥材料。

它不是万能保险箱。 RSA 运算成本高,明文长度受模数与填充限制,不适合直接加密大文件;大文件应走「RSA 包一层 AES 密钥 + AES 加密载荷」的混合模式。

它也不是哈希。 哈希(见 Hash 生成器)不可逆、用于指纹;RSA 可逆(持私钥时),用于保密或身份证明。签名流程通常是「先哈希再签」,不要把整篇文档当 m 直接做模幂。

数学骨架(够用即可)

  1. 选两大素数 pq,令 n = p × q
  2. 计算欧拉函数 φ(n) = (p-1)(q-1)(实现里也常用 λ(n))。
  3. 选公钥指数 e(常见 65537),与 φ(n) 互质。
  4. 求私钥指数 d,满足 e × d ≡ 1 (mod φ(n))
  5. 公钥 (n, e),私钥至少包含 (n, d)(完整私钥还带 pq 等 CRT 参数以加速解密)。

加密:c ≡ m^e (mod n);解密:m ≡ c^d (mod n)。安全性依赖「已知 n 很难分解出 pq」。教学可用极小 pq 手算;生产永远用经过审慎实现的库与足够长的密钥,不要自己拼模幂当加密。

密钥长度怎么选

模数长度 现状建议 说明
1024 bit 仅演示/遗留兼容 已被认为过弱,勿用于新系统
2048 bit 当前通用默认 多数证书、SSH、业务接口的底线
3072 / 4096 bit 高安全或长生命周期 更慢,适合根密钥、长期归档

WebUtils 相关页面用于本地试验时,请按页面选项选择长度;把演示用 1024 密钥拷进生产配置是常见事故来源。

填充:为什么不能「裸 RSA」

直接对消息整数做 m^e mod n 存在可预测性与可塑性攻击。标准实践是加 填充(padding)

方案 角色 备注
RSAES-OAEP 加密首选 现代库默认;常配合 SHA-256
RSAES-PKCS1-v1_5 加密兼容 旧系统常见;新设计优先 OAEP
RSASSA-PSS 签名首选 优于旧式 PKCS1 v1.5 签名
RSASSA-PKCS1-v1_5 签名兼容 证书、JWT RS256 仍大量使用

两端必须约定同一填充与哈希;一边 OAEP、一边 PKCS1,结果只能是「解密失败」或更糟的静默错配。

PEM、Base64 与密钥形态

工具与 OpenSSL 生态最常见的是 PEM:ASCII 装甲,头尾像 -----BEGIN PUBLIC KEY----- / -----BEGIN PRIVATE KEY-----(或 RSA PRIVATE KEY),中间是 Base64(可配合 Base64 理解其文本形态,但不要把私钥当普通文本到处贴)。

注意区分:

  • SubjectPublicKeyInfo(SPKI) 公钥:BEGIN PUBLIC KEY
  • PKCS#8 私钥:BEGIN PRIVATE KEY(可带口令加密包装)。
  • PKCS#1 传统 RSA 私钥:BEGIN RSA PRIVATE KEY

导入失败时,先看头尾标签是否完整、是否多复制了空行或 HTML,再看算法与长度是否被工具支持。私钥一旦进入聊天记录、截图、前端仓库,应视为已泄露并轮换。

在 WebUtils 上怎么做

A. 生成密钥对

打开 RSA 密钥生成器(或加密页内嵌的生成入口,以页面实际控件为准):

  1. 选择密钥长度(建议 2048 起)。
  2. 生成后分别复制 公钥 PEM私钥 PEM
  3. 私钥只保存在本机安全位置;公钥可交给对端或写入配置中的公开字段。
  4. 需要对比指纹时,可对公钥 DER/PEM 做哈希(配合 Hash 工具),用于「是不是同一把钥」的人工核对。

B. 加密明文

打开 RSA 加密工具

  1. 粘贴或导入 公钥
  2. 选择填充(有 OAEP 时优先 OAEP)。
  3. 输入要保护的短文本(密钥、令牌、短配置;不是整库 SQL dump)。
  4. 执行加密,得到密文(常为 Base64 或十六进制,按页面输出约定复制)。
  5. 将密文通过原通道发送;通道可被窃听也不应单独还原明文(在私钥未泄露前提下)。

C. 解密密文

  1. 仅在持有对应私钥的环境粘贴 私钥
  2. 选择与加密时一致的填充与编码。
  3. 粘贴密文,解密得到原文。
  4. 用毕清理页面上的私钥与明文(关闭标签、避免同步的剪贴板历史)。

D. 和「只编码不加密」划清界限

若需求只是把二进制塞进 JSON,那是 Base64 的事,不是 RSA。若需求是「谁都能读但要防篡改」,考虑签名或 MAC,而不是把内容 RSA 加密后再公开存放却不管理私钥生命周期。

可复现的小例子(教学用)

下面用刻意过小的参数说明公式,禁止当作真实密钥:

  • p = 61q = 53,则 n = 3233φ(n) = 3120
  • e = 17,可求得 d = 2753(满足 17 × 2753 ≡ 1 (mod 3120))。
  • 令消息整数 m = 65(仅示例)。
  • 密文 c = 65^17 mod 3233 = 2790
  • 明文 m' = 2790^2753 mod 3233 = 65

真实系统里 m 来自填充后的字节块,长度受 n 与填充开销约束;Web Crypto / OpenSSL 会拒绝过长明文,而不是静默截断——这是特性,不是 bug。

浏览器 Web Crypto 思路(对照理解)

现代浏览器可用 crypto.subtle 做 RSA-OAEP(需先把 PEM 转成 CryptoKey)。示意:

// 示意:公钥已导入为 CryptoKey,算法 RSA-OAEP + SHA-256
const enc = new TextEncoder();
const cipherBuf = await crypto.subtle.encrypt(
  { name: 'RSA-OAEP' },
  publicKey,
  enc.encode('short-secret')
);
// cipherBuf 再经 Base64 便于文本传输

生产代码应处理 PEM 解析、错误分支与密钥用途(encrypt / decrypt / sign / verify 分离)。本地快速验证优先用 WebUtils 页面,减少自己解析 ASN.1 的失误。

OpenSSL 命令对照

# 生成 2048 私钥(PKCS#1 传统格式示例)
openssl genrsa -out private.pem 2048
# 导出公钥
openssl rsa -in private.pem -pubout -out public.pem
# 用公钥 OAEP 加密短文件(版本与参数以本机 openssl 为准)
openssl pkeyutl -encrypt -pubin -inkey public.pem -in secret.txt -out secret.bin -pkeyopt rsa_padding_mode:oaep

把 OpenSSL 产出的 PEM 贴进 WebUtils 时,保持完整头尾;若工具只认某一种私钥标签,用 openssl pkcs8 转换后再试。

常见错误对照

现象 常见原因 处理
解密结果乱码或失败 填充不一致、公钥私钥不是一对 两端统一 OAEP/PKCS1;重新用同一生成流程导出
明文太长报错 超过模数减去填充开销 只加密短密钥;大数据改 AES
导入 PEM 失败 缺头尾、复制了智能引号、混入 HTML 纯文本编辑器重拷;核对 BEGIN/END
1024 密钥「能用」 遗留系统演示 新项目升到 2048+ 并轮换
前端仓库出现私钥 误提交 作废该钥、查泄露范围、改用 KMS/环境变量
中文解密异常 未按 UTF-8 编解码 明文先 TextEncoder/UTF-8 字节再加密
把 Base64 当加密 概念混淆 Base64 可逆且无密钥;保密用真加密
签名验不过 摘要算法或编码不一致 统一 SHA-256 等;核对是否签的是哈希而非原文误解

真实场景

1. 前端提交敏感字段

登录页或配置页把「短期令牌 / 二次验证码」用服务端下发的公钥加密后提交。服务端私钥仅在后端内存或 KMS。注意:RSA 加密不能代替 HTTPS;TLS 仍是传输层必选项,RSA 字段加密是应用层纵深。

2. 配置中心下发会话密钥

运维用管理员公钥加密一枚 AES-256 密钥,密文入库;目标机器持对应私钥解密后加载。轮换时生成新 RSA 对或新 AES 钥,旧密文按策略重封。

3. 本地试验与教学

在 WebUtils 生成一对 2048 密钥,加密一句中文短句,换浏览器标签解密,确认往返。适合面试前复习「为什么不能 RSA 加密 10MB 视频」。

4. 与 JWT / 签名链路协作

JWT 的 RS256 是「私钥签名、公钥验签」,方向与「公钥加密」相反。需要看清载荷时用 JWT 解码器;本指南的加密工具解决的是保密,不是 JWT 验签全集。

与 AES、ECC 如何选型

需求 更合适的选择
加密大文件、数据库字段批量 AES(GCM 等),密钥另议
首次建立共享密钥、证书体系 RSA 或 ECC 证书 + 现代握手
同等安全强度下更短密钥、移动端 常选 ECC(P-256 等)
遗留系统只认 RSA PEM RSA 2048 + OAEP,计划迁移
只要防篡改不要保密 签名 / HMAC,而非加密

经验法则:RSA 保护小秘密(尤其是对称密钥);对称算法保护大数据。

安全边界与 WebUtils 定位

  • 计算在浏览器本地完成,不把你的私钥上传到 WebUtils 服务器做运算——但仍可能受恶意扩展、共享电脑、屏幕录制威胁;高敏感私钥不要在不可信终端粘贴
  • 页面关闭后内存是否残留取决于浏览器与系统;处理完私钥应结束会话。
  • 本工具用于理解流程与短文本试验,不是硬件加密模块、HSM 或企业 KMS 的替代品。
  • 法律与合规:加密出口管制、数据驻留、日志是否落明文,按你所在行业制度执行;技术指南不构成合规意见。

操作清单(发布前自检)

  1. 密钥长度 ≥ 2048,演示密钥未进入生产。
  2. 加密使用 OAEP(或经评估的兼容填充),两端一致。
  3. 私钥不进 Git、不进前端包、不进群聊。
  4. 明文长度符合填充限制;大数据走混合加密。
  5. PEM 头尾完整,字符集 UTF-8。
  6. 有轮换与吊销预案(泄露后能换钥重封)。
  7. 传输层仍启用 HTTPS/TLS。

小结

RSA 把「公开的锁」和「私有的钥匙」分开,让不可信通道上的短密文传递成为可能。结合 WebUtils 的 密钥生成加解密,你可以在浏览器内走完生成 → 加密 → 解密闭环,并用错误表对照填充、长度与 PEM 问题。记住三句话:密钥要够长、填充要一致、大数据请交给 AES。

常见问题

RSA 和 AES 可以互相替代吗?

不可以。AES 适合大量数据;RSA 适合保护短密钥或做签名。常见正确组合是 RSA/ECDH 保护 AES 密钥。

为什么加密中文有时失败?

多半是字符串到字节的编码不一致,或明文过长。统一 UTF-8,并只加密短文本。

公钥可以提交到 Git 吗?

可以,但应确认没有把私钥一并提交;公钥仍可能被滥用做「用你的钥加密垃圾数据」之类骚扰,业务上按需绑定身份。

1024 位密钥解密成功就说明安全吗?

只说明数学往返正确,不说明抗攻击强度足够。新系统不要用 1024。

WebUtils 支持哪些填充?

以工具页当前选项为准;设计上应优先 OAEP。若页面提供 PKCS1,仅用于兼容旧密文。

私钥丢了密文还能救吗?

一般不能。没有私钥就无法解密;备份策略要在「可恢复」与「备份即泄露面」之间权衡,企业场景用 KMS/HSM。

RSA 能直接当登录密码存储吗?

不能。密码存储应使用慢哈希(Argon2/bcrypt 等),与 RSA 无关。

和 Base64、Hash 工具怎么配合?

密文常以 Base64 传输;密钥指纹用 Hash;概念上三者分工不同,见相关工具页。