← 返回文章列表

RSA 还是 ECC?非对称加密的选择与常见误用

加密

非对称加密到底解决什么问题

对称加密快,但双方必须先共享密钥——这个“先有鸡还是先有蛋”的问题由非对称加密解决:公钥可以公开,私钥自己保管。但它不能用来加密大文件:RSA 一次只能加密比模数略短的数据,且速度比 AES 慢几个数量级。

密钥长度对照

安全强度RSAECC
约 112 位2048 位224 位
约 128 位3072 位256 位(P-256)
约 192 位7680 位384 位

同等安全强度下,ECC 的密钥与签名都短得多,握手更快、报文更小,这也是现代 TLS 普遍使用 ECDHE 的原因。RSA 的优势在于兼容性与生态成熟度,以及部分老系统的支持。

加密与签名的分工

  • 加密(只有对方能读):用对方的公钥加密,对方用私钥解密;
  • 签名(证明是你发的、且未被改动):用自己的私钥签名,任何人用你的公钥验证;
  • 混合加密(实际常见做法):用非对称算法交换/封装一个临时对称密钥,再用 AES 加密数据。HTTPS 就是这套流程。

四个常见误用

  1. 用 RSA 直接加密大文件:应改用混合加密(RSA-OAEP 封装 AES 密钥);
  2. 裸 RSA(PKCS#1 v1.5)加密:存在填充攻击风险,应使用 OAEP;
  3. 把公钥当机密:公钥本就公开,需要保护的是私钥;
  4. 缺少完整性校验:只加密不签名/不认证,密文被篡改也察觉不到。

常见问题

ECC 会取代 RSA 吗?在新系统中基本是趋势,但存量系统与合规要求可能仍指定 RSA。密钥要多久轮换一次?取决于用途与暴露程度:长期签名密钥可用 1–2 年,会话密钥则应每次会话更换。

典型场景里它到底做什么

场景用到的能力原因
HTTPS 握手签名 + 密钥交换证书证明身份,ECDHE 协商会话密钥
代码 / 软件包签名签名任何人用公钥即可验证来源与完整性
SSH 登录签名私钥留在本地,服务器只保存公钥
加密邮件混合加密正文用对称密钥加密,非对称只保护这把密钥
大文件传输混合加密绝不直接用 RSA 加密数据本身

密钥保管与轮换

  • 私钥不进代码仓库:放在密钥管理服务或受限访问的密钥文件中,并严格控制读取权限;
  • 按用途分开密钥:签名与加密使用不同的密钥对,降低一次泄露的影响范围;
  • 设定轮换周期:长期签名密钥 1–2 年轮换,会话密钥每次会话更换;一旦疑似泄露,立即吊销并重新签发证书;
  • 吊销要能被感知:对外发布的公钥应配合吊销列表或 OCSP,否则验证方无法知道密钥已失效。

实战案例:三个非对称加密的误用

  1. “用私钥加密当签名”:方向搞反。加密是公钥加密、私钥解密;签名是私钥签名、公钥验证。
  2. “用 RSA 直接加密大文件”:非对称慢且有长度限制,应用混合加密:RSA 保护对称密钥,AES 加密数据。
  3. “公钥私钥混放一处”:私钥必须离线、独立保存,并与公钥和密文分开;泄露即身份失守。

常见问题(FAQ)

密钥选多长?RSA 至少 2048 位,ECC/SM2 使用标准曲线即可。能跨软件使用吗?导出标准 PEM 一般可用,注意格式与算法匹配。加密和签名能一起用吗?可以,通常先签名后加密。私钥丢了怎么办?无法恢复,只能重新生成并更换公钥。

动手试试:非对称加密、对称加密

密钥长度等价表

  • 等价强度:RSA 2048 ≈ ECC 224–256;RSA 3072 ≈ ECC 256;RSA 15360 ≈ ECC 521;
  • 密钥与签名体积:ECC 256 位密钥仅 32 字节,RSA 2048 为 256 字节,证书与握手数据因此小一个数量级;
  • 签名速度:ECC 签名更快、验签相当;RSA 验签快而签名慢,选型要看哪一侧是瓶颈;
  • 兼容性:极老的客户端可能只支持 RSA,若必须兼容,可在证书中同时部署 ECC 与 RSA 两套。