非对称加密算法:RSA、ECC、SM2、DSA 的原理与选型

聊完了对称加密,咱们来看看另一大家族——非对称加密。这东西,说白了一套密钥,一把公开,一把藏好。公钥加密,私钥解密;私钥签名,公钥验签。它的数学基础,比对称加密要硬核不少。

我个人习惯把非对称加密看作是“现代密码学的基石”。为啥?因为你得解决一个核心矛盾:两个互不相识的人,怎么安全地交换秘密?靠对称加密,你得先有密钥,可密钥本身又需要安全传输——这就成了“先有鸡还是先有蛋”的死循环。非对称加密的出现,算是把这个问题给解了。

RSA:老牌劲旅,稳如老狗

RSA 的名字,来自三位发明者 Rivest、Shamir、Adleman。1977 年提出,一直用到现在。说白了这个算法依赖的数学难题就是大整数分解。给你两个大质数 p 和 q,乘起来算 N 很容易;但给你 N,要反推出 p 和 q,那可就难了。

我在项目里遇到过客户纠结:RSA 密钥到底用 2048 还是 4096 位?这个我得说清楚。1024 位的 RSA 已经不建议用了,业内共识是至少 2048 位。4096 位更安全,但运算量大了不是一个量级。我们做过压测,4096 位的 RSA 签名操作,比 2048 位的慢了将近 10 倍。实际业务中,2048 位是个不错的平衡点。

RSA 密钥长度与安全级别对照

密钥长度(位)等效对称密钥安全级别推荐状态
102480 位已废弃,不安全
2048112 位当前推荐
3072128 位长期安全
4096256 位极敏感场景

ECC:高效新贵,后浪推前浪

ECC,椭圆曲线密码学。它的数学基础是椭圆曲线上的离散对数问题。跟 RSA 相比,它最大的优势就是:在同等安全级别下,密钥短得多,计算快得多。

举个例子:256 位的 ECC 密钥,安全级别对标 3072 位的 RSA。这个差距在移动端、IoT 设备上非常明显。我以前做过一个嵌入式项目,芯片的算力很有限,跑 RSA 2048 签名需要几十毫秒,换成 ECC P-256,几毫秒搞定。功耗也降了一大截。

不过要注意,ECC 的实现比 RSA 复杂。曲线参数的选择很关键,用错了曲线,安全强度会大打折扣。NIST 的 P-256、P-384 曲线用的人最多,Curve25519 这几年也比较火。

选型提示:如果对性能有要求,特别是移动端或物联网场景,我建议优先考虑 ECC。别死抱着 RSA 不放,它在这些场景下真的有点笨重。

SM2:国货之光,合规首选

SM2 是我国国家密码管理局发布的椭圆曲线公钥密码算法。它跟 ECC 属于同门,底层数学都是椭圆曲线。但在曲线参数、签名算法细节上,跟 NIST 的标准不一样。

为什么会这样?背后有国家安全因素的考虑。用自己的标准,你就可以自主可控。SM2 的密钥长度是 256 位,安全强度跟 2048 位的 RSA 差不多。

我以前帮一个金融客户做系统改造,要求全面支持国密。最大的坑就是 SM2 证书的互认问题。有些老的 CA 不支持 SM2,你得找专门的国密 CA。还有,有些开源库虽然支持 SM2,但实现不一定过得了国密局的检测,这个要特别留意。

注意:如果项目有合规要求,比如“等保三级”、“密评”等,就需要优先考虑 SM2。但要注意,SM2 的生态不如 RSA 和 ECC 成熟,第三方库、硬件支持要提前调研清楚。

DSA:数字签名专用,已被 ECDSA 取代

DSA,数字签名算法。它只能用来做签名,不能做加密。这个点跟 RSA 不一样,RSA 既能加密又能签名。

DSA 的问题在于运算慢,特别是签名验签过程。它的安全性也基于离散对数难题。现在业内基本都用它的变形——ECDSA,也就是基于椭圆曲线的 DSA。ECDSA 结合了 ECC 的高效和 DSA 的签名能力,是目前最主流的签名算法之一。

我个人现在几乎不会直接推荐 DSA 了。如果你需要签名,首选 ECDSA 或者 SM2。

如何选型?一个实用的决策框架

选型这事儿,没有一个放之四海皆准的答案。我根据自己的项目经验,总结了一个决策思路:

  • 看场景:是需要加密通信,还是数字签名?RSA 和 SM2 两者都能干,ECC 只能做密钥交换和签名,DSA 只签名。
  • 看性能:算力够不够?如果是服务器端,RSA 2048 还行。如果是移动端或 IoT,ECC(P-256)或者 SM2 更合适。
  • 看合规:有没有国密要求?有,老老实实用 SM2。没有,可以选 ECC 或 RSA。
  • 看生态:你的上下游、合作伙伴支持什么算法?兼容性问题会让人很头疼。

核心选型逻辑

需求场景推荐算法备注
通用加密 + 签名RSA 2048生态好,兼容性强
高性能/移动端ECC P-256密钥短,计算快
国密合规要求SM2必须选
纯数字签名ECDSA / SM2别用 DSA 了

一个完整的知识体系图

下面这张图,是我把这一节的脉络梳理了一下。你一眼就能看到 RSA、ECC、SM2、DSA 之间的关系和主要差异。

非对称加密算法选型知识体系 非对称加密 RSA(大数分解) ECC(椭圆曲线) SM2(国密ECC) DSA(离散对数) 加密 + 签名 密钥交换 + 签名 加密 + 签名(国密) 纯数字签名(已边缘) 选型要点:看安全级别(RSA≥2048|ECC≥256|SM2≥256)、看性能(ECC≈SM2>RSA)、看合规(国内选SM2)

避坑指南:那些我踩过的坑

最后,跟你分享几个我实际工作中碰到的问题。

我曾经在项目中犯过一个低级错误:用 RSA 的公钥去加密一个很大的文件。结果发现加密过程慢到无法接受。后来才知道,RSA 不适合加密大量数据,它更适合加密对称密钥。正确的做法是用对称加密加密数据,再用 RSA 加密这个对称密钥。这叫混合加密。

还有一次,我把 ECC 的私钥格式搞混了。PEM、DER、PKCS#8……不同的库可能要求不同的编码格式。这个坑很隐蔽,我调试了半天才发现是格式不对。所以,密钥的导入导出一定要先搞清楚编码规范。

一个小技巧:在项目的早期阶段,就把算法选型和密钥管理策略确定下来。中途换算法,成本非常高。我以前接过一个改造项目,老系统用的是 DSA,要换成 ECDSA,涉及证书、库、硬件,折腾了两个月。