非对称加密算法性能基础(RSA、ECC)

讲性能之前,先得说清楚一件事——非对称加密从来都不是快的。它慢得理所当然,因为数学底子就复杂。但同样是慢,RSA 和 ECC 的慢法完全不一样。我做过一次移动端密钥交换的调优,同样的安全强度,ECC 握手耗时只有 RSA 的三分之一,但签名验证的 batch 处理又反过来让 RSA 占了上风。

说白了,没有银弹。你的业务场景决定了该选谁。

RSA 的性能画像

RSA 的核心操作是模幂运算。密钥越长,指数越大,计算量呈指数级上升。我见过不少项目直接上 4096 位 RSA,结果 TLS 握手时间从 50ms 飙到 300ms,用户反馈都炸了。

操作2048 位 RSA(相对耗时)4096 位 RSA(相对耗时)备注
密钥生成1x6x – 8x慢到可以泡杯咖啡
加密(公钥)1x~2x公钥指数固定为 65537,影响小
解密(私钥)1x~4x中国剩余定理优化后仍吃力
签名1x~4x与解密类似,私钥操作
验签1x~2x公钥操作,相对轻量

我曾经给一个 IoT 网关选型,设备端 CPU 主频只有 200MHz。跑 RSA 2048 签名,一次要 1.2 秒。你敢信?后来不得不切到 ECC。

关键结论:RSA 的私钥操作(解密/签名)是性能瓶颈。公钥操作(加密/验签)相对快得多。密钥长度翻倍,私钥操作耗时翻 4 倍以上。

ECC 的性能优势与暗坑

ECC 的安全强度来自椭圆曲线离散对数问题(ECDLP)。同样 256 位的 ECC 密钥,提供 128 位安全强度,而 RSA 需要 3072 位才能达到。也就是说,ECC 的密钥短,计算量也小。

但是——注意这个但是——ECC 的签名验证和点乘运算依赖曲线参数。不同曲线性能差异很大。我踩过的一个坑是选了 secp256r1(P-256)做签名,结果验签时因为缺少硬件加速,每秒只能验 2000 次。换成 Curve25519 之后,直接翻了一倍。

曲线密钥长度(位)安全强度(位)签名速度验签速度
secp256r1256128中等中等
secp384r1384192较慢较慢
Curve25519256128快快
Curve448448224中等中等
小心:ECC 密钥生成极快(比 RSA 快一个数量级),但曲线参数验证需要额外注意。我曾经用了一个不标准的曲线实现,结果在弱嵌入式设备上点乘运算慢了 10 倍 —— 因为库没有用窗口法优化。

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 流程图,方便你理解安全等级、算法和密钥长度之间的权衡。

安全等级 —— 密钥长度映射(NIST 等效) 安全强度(位) 密钥长度(位) RSA-1024 (80位) RSA-2048 (112位) RSA-3072 (128位) RSA-4096 (152位) ECC-192 (96位) ECC-256 (128位) ECC-384 (192位) RSA ECC RSA 密钥长度 ECC 密钥长度

从图上可以很直观地看到,要达到 128 位安全等级,RSA 需要 3072 位,ECC 只需要 256 位。这就是 ECC 的“粒度高”优势。密钥粒度细意味着你可以在安全性和性能之间做更精确的微调。

实战中的性能取舍

我最近参与的一个金融支付项目,签名和验签比例大约是 1:50(一次签名对应 50 次验签)。如果全用 ECC,验签延迟会拖累整体吞吐。我们最后采用的方案是:交易签名用 ECC(快速生成签名),后端验签用 RSA(利用 RSA 验签快的特性),中间通过密钥映射转换。当然,你得容忍一点工程复杂度。

一个小技巧:如果你在做大规模 openPGP 或 X.509 证书验证,考虑使用 RSA 的 batch 验签技术(如 CRT 并行)。我在处理 10000 张证书批量验签时,用 OpenSSL 的多线程 + RSA 直接将时间从 5 秒压到了 0.8 秒。

代码层面的微观性能

最后看一段实际测量代码。我用 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。所以还是那句话:你的业务模式决定算法选型。

最终结论:非对称加密的性能不是单纯的快慢问题,是安全的粒度、密钥长度和操作类型的三方博弈。理解和测量你的工作负载,不要盲目跟风。