使用公钥进行 RSA 加密

用 RSA 公钥(PEM)通过 RSA-OAEP SHA-256、OAEP SHA-1 或 PKCS#1 v1.5 加密短消息。一键生成测试密钥对,仅在本地运行。

推荐使用 OAEP 填充。MGF1 使用相同的哈希,与 Web Crypto 和 openssl pkeyutl -pkeyopt rsa_oaep_md 一致。

RSA 只能加密很短的数据:2048 位密钥最多 190 字节(OAEP SHA-256)、214 字节(OAEP SHA-1)或 245 字节(PKCS#1 v1.5)。较长的数据请先用 AES 加密,再用 RSA 只加密 AES 密钥。

RSA 加密是随机化的:同一文本加密两次会得到不同的密文,但都能正确解密。

完全在浏览器中运行,您的数据不会被上传。

什么是 RSA 加密?

用 PEM 格式的 RSA 公钥加密短消息或对称密钥(SPKI 的 BEGIN PUBLIC KEY、PKCS#1 的 BEGIN RSA PUBLIC KEY、X.509 证书,或从中取出公钥部分的私钥)。只有匹配私钥的持有者才能解密结果。

如何使用 RSA 加密

  1. 粘贴收件人的公钥 (PEM),或点击生成测试密钥对(2048 位)来试用。
  2. 选择填充方式:推荐 RSA-OAEP(SHA-256);也要与接收方代码的期望保持一致。
  3. 输入明文(或把输入编码切换为 Hex,以加密 AES 密钥等原始字节)。
  4. 点击加密并复制 Base64 或 Hex 密文。

示例

输入
"Hello RSA" with a 2048-bit public key, RSA-OAEP (SHA-256), Base64 output
输出
A 344-character Base64 string (256 bytes) that changes on every run

RSA-OAEP 是随机化的,因此没有固定的输出;用私钥解密它会得到 "Hello RSA"。

何时使用 RSA 加密

用 RSA 为你持有其公钥的对象加密小的机密——密码、令牌或随机生成的 AES 密钥。不要用它加密大数据:请用 AES 加密数据,只用 RSA 加密 AES 密钥(混合加密),或使用 PGP。优先使用 OAEP;仅在遗留系统要求时才使用 PKCS#1 v1.5。

RSA 加密 的工作原理

RSA 加密对填充后的消息计算 c = mᵉ mod n。OAEP(PKCS#1 v2.2)使用 SHA-256 或 SHA-1 的 MGF1 和随机种子字节对消息做掩码;PKCS#1 v1.5 则在前面添加随机的非零填充。填充是随机化的,因此对同一段文本加密两次会得到不同的密文。密文长度与模数相同(2048 位密钥为 256 字节)。消息的最大长度,OAEP 为 k − 2·hLen − 2 字节,v1.5 为 k − 11 字节(2048 位密钥分别为 190、214 和 245 字节)。密钥解析和加密由 node-forge 完成;结果可与 OpenSSL、Web Crypto 和 Node.js 互通。

常见用例

  • 为混合加密测试加密 AES 会话密钥
  • 检查你的后端能否解密浏览器发来的 OAEP-SHA256 密文
  • 向给了你公钥的人发送一段简短的机密
  • 为遗留 API 生成 PKCS#1 v1.5 测试数据
  • 了解 RSA 的消息长度限制如何取决于密钥长度和填充方式

安全提示

密钥和消息只在你的浏览器中处理。不要把生产环境的私钥粘贴到任何你无法控制的网站——请改为生成测试密钥对。

常见问题

为什么我的消息太长了?

RSA 只能加密几百字节。使用 2048 位密钥时,OAEP SHA-256 最多允许 190 字节。较长的数据请用 AES 加密,RSA 只用于加密 AES 密钥。

应该选择哪种填充方式?

新系统使用带 SHA-256 的 RSA-OAEP(Web Crypto 的 RSA-OAEP 配合 hash: 'SHA-256',OpenSSL 的 pkeyutl -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256)。OAEP SHA-1 是许多旧库的默认值(Java 的 RSA/ECB/OAEPWithSHA-1AndMGF1Padding)。PKCS#1 v1.5 仅用于兼容遗留系统。

为什么密文每次都不一样?

两种填充方式都会在加密前加入随机字节。这可以防止攻击者通过自己加密候选内容来猜测短消息。

可以用私钥加密吗?

你可以粘贴私钥——会使用其公钥部分进行加密。签名意义上的“用私钥加密”是另一种运算,这里不提供。

探索更多分类