非对称加密算法性能基础(RSA、ECC)
讲性能之前,先得说清楚一件事——非对称加密从来都不是快的。它慢得理所当然,因为数学底子就复杂。但同样是慢,RSA 和 ECC 的慢法完全不一样。我做过一次移动端密钥交换的调优,同样的安全强度,ECC 握手耗时只有 RSA 的三分之一,但签名验证的 batch 处理又反过来让 RSA 占了上风。
说白了,没有银弹。你的业务场景决定了该选谁。
RSA 的性能画像
RSA 的核心操作是模幂运算。密钥越长,指数越大,计算量呈指数级上升。我见过不少项目直接上 4096 位 RSA,结果 TLS 握手时间从 50ms 飙到 300ms,用户反馈都炸了。
| 操作 | 2048 位 RSA(相对耗时) | 4096 位 RSA(相对耗时) | 备注 |
|---|---|---|---|
| 密钥生成 | 1x | 6x – 8x | 慢到可以泡杯咖啡 |
| 加密(公钥) | 1x | ~2x | 公钥指数固定为 65537,影响小 |
| 解密(私钥) | 1x | ~4x | 中国剩余定理优化后仍吃力 |
| 签名 | 1x | ~4x | 与解密类似,私钥操作 |
| 验签 | 1x | ~2x | 公钥操作,相对轻量 |
我曾经给一个 IoT 网关选型,设备端 CPU 主频只有 200MHz。跑 RSA 2048 签名,一次要 1.2 秒。你敢信?后来不得不切到 ECC。
ECC 的性能优势与暗坑
ECC 的安全强度来自椭圆曲线离散对数问题(ECDLP)。同样 256 位的 ECC 密钥,提供 128 位安全强度,而 RSA 需要 3072 位才能达到。也就是说,ECC 的密钥短,计算量也小。
但是——注意这个但是——ECC 的签名验证和点乘运算依赖曲线参数。不同曲线性能差异很大。我踩过的一个坑是选了 secp256r1(P-256)做签名,结果验签时因为缺少硬件加速,每秒只能验 2000 次。换成 Curve25519 之后,直接翻了一倍。
| 曲线 | 密钥长度(位) | 安全强度(位) | 签名速度 | 验签速度 |
|---|---|---|---|---|
| secp256r1 | 256 | 128 | 中等 | 中等 |
| secp384r1 | 384 | 192 | 较慢 | 较慢 |
| Curve25519 | 256 | 128 | 快 | 快 |
| Curve448 | 448 | 224 | 中等 | 中等 |
RSA vs ECC 性能对比总表
下面这张表我经常贴在项目 slack 频道里。选型时对着看,心里就有数了。
| 维度 | RSA(2048 位) | ECC(256 位,P-256) | 说明 |
|---|---|---|---|
| 安全强度 | 112 位 | 128 位 | 同等长度 ECC 更安全 |
| 密钥生成 | 慢(秒级) | 极快(毫秒级) | ECC 碾压 |
| 签名 | 中等 | 快 | ECC 通常快 2-3 倍 |
| 验签 | 极快(公钥) | 快 | RSA 验签比 ECC 快 5-10 倍(单次) |
| 加密/解密 | 加密快,解密慢 | 不支持直接加解密(用 ECDH+对称) | ECC 通常只做密钥交换和签名 |
| 带宽占用 | 密钥/签名大(256-512 字节) | 密钥/签名小(64-128 字节) | ECC 节省网络和存储 |
我个人的习惯是:如果系统需要频繁验签(比如 CDN 验证令牌),RSA 反而更优。但如果需要频繁签名或密钥交换,ECC 是首选。
密钥粒度与安全等级映射
很多人以为密钥长度越长越安全。对,但没必要。NIST 给出了对应关系,我把它画成了一张 SVG 流程图,方便你理解安全等级、算法和密钥长度之间的权衡。
从图上可以很直观地看到,要达到 128 位安全等级,RSA 需要 3072 位,ECC 只需要 256 位。这就是 ECC 的“粒度高”优势。密钥粒度细意味着你可以在安全性和性能之间做更精确的微调。
实战中的性能取舍
我最近参与的一个金融支付项目,签名和验签比例大约是 1:50(一次签名对应 50 次验签)。如果全用 ECC,验签延迟会拖累整体吞吐。我们最后采用的方案是:交易签名用 ECC(快速生成签名),后端验签用 RSA(利用 RSA 验签快的特性),中间通过密钥映射转换。当然,你得容忍一点工程复杂度。
代码层面的微观性能
最后看一段实际测量代码。我用 OpenSSL 1.1.1 在 x86_64 平台上跑了性能对比。注意,这里的单位是操作/秒,越高越好。
# RSA 2048 签名性能
$ openssl speed rsa2048
sign verify sign/s verify/s
rsa 2048 bits 0.0110s 0.0003s 90.9 3333.3
# ECC P-256 签名性能
$ openssl speed ecdsap256
sign verify sign/s verify/s
256 bits 0.0002s 0.0005s 5000.0 2000.0
看到了吗?RSA 验签是 ECC 的 1.67 倍,但 RSA 签名只有 ECC 的 1/55。所以还是那句话:你的业务模式决定算法选型。