加密算法性能对比:AES、RSA、ECC等

讲并发与吞吐,绕不开加密算法的选型。很多人以为选算法只看安全强度,结果上线后吞吐直接腰斩。我今天就拿三种最常用的算法——AES、RSA、ECC——掰开揉碎讲清楚它们的性能底牌。

对称加密:AES的速度优势

AES是目前对称加密的工业标准。它用同一个密钥加密和解密,硬件指令集(比如Intel的AES-NI)让它的速度非常漂亮。我曾在某支付网关项目里测过,单核每秒能跑超过2GB的数据流。你想想看,这个量级在RSA、ECC面前几乎是碾压的。

算法密钥长度加密吞吐(1KB块,单核)典型延迟
AES-128128 bit约2.1 GB/s亚微秒级
AES-256256 bit约1.8 GB/s微秒级
RSA-20482048 bit签名约5万次/s,验签约2万次/s毫秒级
ECC-256(secp256r1)256 bit签名约15万次/s,验签约11万次/s亚毫秒级
实战选型偏好: 我个人习惯——只要业务数据能到KB级别且不要求公钥分发,优先AES-256-GCM。它不仅快,还自带认证,省掉额外HMAC。

不过AES有个死穴:密钥分发。两边得事先约定同一个密钥,这在开放网络里几乎不可能。

非对称加密:RSA与ECC的对比

RSA和ECC解决了密钥分发问题,但代价是性能。RSA依靠大数分解,ECC依靠椭圆曲线离散对数。其实ECC在相同安全强度下比RSA快得多,而且密钥短。我记得有一次帮客户优化TLS握手,把RSA-2048换成ECC-256(X25519),握手机制耗时直接降了70%。

对比维度RSA-2048ECC-256(secp256r1)
密钥尺寸2048 bit256 bit
同等安全强度大约112 bit128 bit
签名速度慢(约5000次/秒)中(约15万次/秒)
验签速度极慢(约2000次/秒)中(约11万次/秒)
密钥生成慢(秒级)极快(毫秒级)
典型应用旧系统、证书新协议(如TLS 1.3、区块链)
曾经踩过的坑: 我在一个物联网项目里贸然用了RSA-4096,结果网关CPU占用飙到95%,每秒只能处理200个设备握手。后来换成ECC-256,虽然安全等级略降,但吞吐直接翻了20倍。记住:非对称算法只做少量密钥交换或签名验证,别用它批量加密数据。

为什么ECC更快?它的数学运算在有限域上,乘法和点加都是轻量级。而RSA的大整数幂模运算,一次就要几千bit的乘法,硬件加速也救不了。

混合加密的实战组合

真正常见的生产模式是“混合加密”。流程大致如下:

  1. 客户端生成一个临时AES密钥(比如256bit)。
  2. 用服务端的公钥(RSA或ECC)加密这个AES密钥,发送过去。
  3. 服务端用私钥解密,得到AES密钥。
  4. 后续所有数据都用AES对称加密传输。

这样一来,性能开销集中在第一次握手(非对称),后续海量数据都走AES线速通道。我建议把非对称算法只用于密钥交换,ECC-256做ECDH,然后派生AES-256-GCM密钥——这个模式在TLS 1.3里已经是标准了。

性能测试方法

光看理论数字不直观,在真实环境里最好自己压测。我是用一套模板来测的:

# 简单压测思路(伪代码)
for each algorithm in [AES-256-GCM, RSA-2048, ECC-256]:
    setup context (key pair or key)
    start = now()
    for i in 1..N:
        if algorithm == AES:
            encrypt(1KB plaintext)
        else:
            sign(1KB hash)   # 非对称只测签名
    elapsed = now() - start
    throughput = N / elapsed
    print(algorithm, throughput)
注意: 非对称算法一定要区别签名和验签的速度,两者差很多。另外同一条数据块大小也会影响结果——AES受块大小影响小,RSA/ECC受数据块影响大(这里注意我们的数据块通常是hash后的短消息)。

你可以在自己的服务器上用openssl speed命令快速出数据:

# 查看系统自带的性能
openssl speed aes-256-cbc rsa2048 ecdh

嗯,这里要注意:openssl的测试用的是固定样本,可能和你的业务模式有偏差。我习惯写一个微基准测试,跑100万次,取中位数和百分位。

一张图看清性能与安全的关系

下面这张图我把三种算法放在同一个坐标系里:横轴是安全强度(等效对称密钥bit),纵轴是相对吞吐(取对数)。你可以看到AES在右上角,RSA在左下角,ECC夹在中间但更靠近AES。

加密算法性能对比:安全强度 vs 相对吞吐 相对吞吐(对数) 等效对称密钥安全强度 (bit) AES-256 安全128~256, 吞吐极高 RSA-2048 安全112, 吞吐低 ECC-256 安全128, 吞吐中等 112 bit 128 bit 256 bit 混合加密推荐 ECC密钥交换 + AES-256-GCM

从图中能直观看到:ECC在128bit安全强度下吞吐比RSA高一个数量级,而AES在256bit强度下仍然保持最高吞吐。这就是为什么现代系统都优先ECC做密钥交换,AES做数据加密。

总结:选型清单

场景推荐算法理由
大量数据加密(如文件、消息流)AES-256-GCM高吞吐、硬件加速、自带认证
密钥交换 / 签名ECC-256 (X25519, secp256r1)速度快、密钥短、安全等级充足
兼容旧系统 / 证书续期RSA-2048生态成熟,但尽量迁移到ECC
高安全、低吞吐可接受ECC-521 或 AES-256 + 混合量子计算威胁未到时够用
我的底线规则: 能对称就不非对称,能ECC就不RSA,能用硬件加速就别纯软实现。每次做加密选型前,先问业务数据有多大、每秒请求多少、允许的延迟是多少。别盲从“最高安全”,吞吐崩溃一样是安全漏洞。