极简工具箱

免费在线工具 · 本地计算 · 无需上传

RSA 密钥对怎么生成、加密还是签名

「用公钥加密、用私钥解密」和「用私钥签名、用公钥验签」是两件不同的事,混用不但逻辑错,还会把私钥暴露出去。

广告位(百度联盟)

一、两种用法,方向相反

用途谁加密/签名谁解密/验签解决什么
加密公钥私钥只有私钥持有者能看内容
签名私钥公钥证明内容确实来自私钥持有者

公钥可以公开,私钥必须保密。加密用对方的公钥,签名用自已的私钥——记不住方向时,想「谁能解开、我想让谁相信」即可。

二、密钥长度怎么选

RSA 的安全性与大数分解难度相关,而 ECC(如 P-256)在更短密钥下提供同等安全强度,所以新系统里 ECDSA/Ed25519 越来越常见,尤其是证书和 SSH 密钥。

三、填充方式很关键

RSA 本身只能加密比密钥短的数据,且必须配填充:

对接时经常遇到「Java 默认 v1.5、Node 默认 OAEP」,两边不匹配就解不开。这不是密钥问题,是填充参数不一致。

四、长度限制与混合加密

RSA-2048 最多只能加密约 190 字节(取决于填充),4096 位约 446 字节。所以 RSA 从来不直接加密大文件,标准做法是混合加密:

  1. 随机生成一个 AES 密钥(32 字节)。
  2. 用 AES-GCM 加密真正的数据。
  3. 用对方 RSA 公钥加密这个 AES 密钥。
  4. 把「RSA 密文 + AES 密文 + IV + tag」一起发出去。

这就是 TLS、PGP、各类信封加密的基本结构。

五、签名流程与常见误区

签名:signature = RSA-PSS(SHA256(消息), 私钥)
验签:RSA-PSS-verify(SHA256(消息), signature, 公钥) == true

六、格式问题:PEM、DER、PKCS#8

同一个密钥有几种外壳,最容易搞混:

openssl pkcs8 -topk8 -inform PEM -in old.pem -outform PEM -nocrypt -out new.pem

七、调试建议

联调失败时按顺序排查:密钥是不是同一对 → 填充方式(OAEP/v1.5、PSS)是否一致 → 摘要算法(SHA-1/SHA-256)是否一致 → 数据是原文还是 Base64 后的文本 → 字符编码是否都是 UTF-8。

需要快速生成一对测试密钥、跑通加解密流程,用 RSA 加解密工具;真实业务的密钥请在服务端或本地用 OpenSSL 生成,不要用在线服务生成生产密钥。

小结

公钥加密、私钥签名;2048 位起步;加密用 OAEP、签名用 PSS;RSA 只加密密钥,数据交给 AES;PEM/DER/PKCS#8 格式不一致是最常见的「密钥明明对却解不开」。

本文相关工具(本地计算,无需上传)

更多使用教程