非对称加密算法: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 密钥长度与安全级别对照
| 密钥长度(位) | 等效对称密钥安全级别 | 推荐状态 |
|---|---|---|
| 1024 | 80 位 | 已废弃,不安全 |
| 2048 | 112 位 | 当前推荐 |
| 3072 | 128 位 | 长期安全 |
| 4096 | 256 位 | 极敏感场景 |
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 的公钥去加密一个很大的文件。结果发现加密过程慢到无法接受。后来才知道,RSA 不适合加密大量数据,它更适合加密对称密钥。正确的做法是用对称加密加密数据,再用 RSA 加密这个对称密钥。这叫混合加密。
还有一次,我把 ECC 的私钥格式搞混了。PEM、DER、PKCS#8……不同的库可能要求不同的编码格式。这个坑很隐蔽,我调试了半天才发现是格式不对。所以,密钥的导入导出一定要先搞清楚编码规范。
一个小技巧:在项目的早期阶段,就把算法选型和密钥管理策略确定下来。中途换算法,成本非常高。我以前接过一个改造项目,老系统用的是 DSA,要换成 ECDSA,涉及证书、库、硬件,折腾了两个月。