首页/网络/协议速查/RSA 非对称加密

RSA 非对称加密

基于大数分解难题:公钥加密/验签、私钥解密/签名;TLS 中已不用于密钥传输(无 PFS),主要承担证书签名。

协议速查网络更新于 2026-10-13

RSA 是什么

RSA 是最常见的非对称加密算法,安全性建立在大整数分解困难之上:公钥可公开,用来加密或验签;私钥自己保存,用来解密或签名。因为运算比对称算法慢很多,它不承担大数据量的加解密,而是用于两件事:TLS 握手中的身份签名(证明服务器持有私钥),以及数字签名/验签。TLS 早年的密钥传输方式已因缺乏前向保密被淘汰,如今 RSA 主要出现在证书签名与握手签名环节。

基本信息

密钥长度2048 位为当前底线,3072 位更稳妥,1024 位已不安全
填充方式加密用 OAEP,签名可用 PSS,避免裸 PKCS#1 v1.5
速度远慢于对称算法,只用于握手与签名
规范RFC 8017(PKCS#1 v2.2)
生成命令OpenSSL 3 推荐 openssl genpkey,旧版为 genrsa
安全强度2048 位 RSA 约等于 112 位对称强度,不能与 AES 位数直接比较

典型使用场景

  • 为 TLS 服务器证书生成密钥对并提交 CSR
  • 对发布物或配置文件做数字签名,分发端验签确认来源与完整性
  • SSH 认证中使用 RSA 密钥对(新部署更推荐 Ed25519)
  • 离线校验场景:用私钥签名、用公钥验签,双方无需共享密钥
  • 理解证书链:根证书与中间证书都用自己的私钥对下级签名

常用操作

常用操作
# 生成私钥(OpenSSL 3 推荐写法)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rsa.key
# 从私钥导出公钥
openssl rsa -in rsa.key -pubout -out rsa.pub
# 用私钥签名、用公钥验签
openssl dgst -sha256 -sign rsa.key -out sig.bin data.txt
openssl dgst -sha256 -verify rsa.pub -signature sig.bin data.txt
# 查看密钥长度与结构
openssl rsa -in rsa.key -noout -text | head -20

关键要点

要点说明实践建议
密钥长度越长越安全但越慢新系统优先 ECC,兼容性要求高时用 RSA 2048+
填充方案PKCS#1 v1.5 有已知攻击面加密用 OAEP,签名用 PSS
前向保密RSA 密钥传输无 PFS握手只保留 ECDHE + RSA 签名套件
密钥保护私钥泄露等于身份被冒充私钥权限 600,配合 HSM/密钥库
混淆点RSA 与 AES 强度不可直接比按安全强度等级而非位数比较
含 TLS_RSA_* 的密钥传输套件没有前向保密:一旦服务器私钥在未来泄露,攻击者可用它解密此前抓取的会话流量。现代配置应只保留 ECDHE 密钥交换、RSA 仅用于签名的套件。
私钥的权限与备份同样重要:私钥文件按 600 权限保存、走受控备份,并把「泄露后可快速吊销换证」写进流程;通配证书的私钥尤为重要,泄露影响整个一级子域。

易错点

  • 把「RSA 2048 与 AES 2048」当作同等强度比较,两者密钥长度不可直接对应
  • 加密时使用裸 PKCS#1 v1.5 填充,存在选择密文攻击面,应改用 OAEP
  • 继续启用 TLS_RSA_* 密钥传输套件,丧失了前向保密能力
  • 私钥文件权限过宽或明文入库,任何读取者都能冒充服务身份
  • 用 RSA 直接加密大文件,正确的做法是用对称密钥加密数据、用 RSA 只保护对称密钥

数据来源与参考

  • RFC 8017(PKCS#1)
  • NIST SP 800-57

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌