曲线选择的取舍
椭圆曲线的选择要在安全强度、性能与生态支持之间权衡:256 位曲线对应约 128 位安全强度,已能满足绝大多数场景;P-256 与 X25519 的兼容性最好,SM2 面向国密合规,secp256k1 主要用于区块链生态。还有一条务实原则:跟随协议与库的默认值走,不要自造曲线参数。
基本信息
| 默认选择 | TLS 场景用 P-256 或 X25519 |
|---|---|
| 高安全等级 | P-384 并搭配 SHA-384 |
| 国密场景 | SM2,配合 SM3 与 SM4 |
| 区块链生态 | 常见 secp256k1 |
| 曲线与哈希 | 强度要匹配,P-384 不应搭配 SHA-256 |
| 参数来源 | 使用标准命名曲线,避免自造参数 |
常用曲线对照
| 曲线 | 位数 | 近似强度 | 典型用途 |
|---|---|---|---|
| P-256(prime256v1) | 256 | 128 位 | TLS 证书、通用签名 |
| P-384 | 384 | 192 位 | 高等级签名与 TLS |
| P-521 | 521 | 256 位 | 长期密钥、高安全需求 |
| X25519 / Ed25519 | 255 | 约 128 位 | TLS 1.3、SSH、现代签名 |
| secp256k1 | 256 | 128 位 | 区块链生态 |
| SM2 | 256 | 128 位 | 国密 TLCP 与国密证书 |
典型使用场景
- 申请 TLS 证书:按 CA 与客户端支持度选择 P-256 或 X25519
- 国密合规改造:签发 SM2 证书并配套 SM3 与 SM4 套件
- 生成 SSH 密钥:ed25519 优先,兼容老系统时退回其它算法
- 代码签名与内部 PKI:按目标客户端的验证能力选择曲线
- 排查签名失败:确认同一条曲线在两侧库中的名称是否一致
查询与生成
查询与生成
openssl ecparam -list_curves | head -20 # 列出本机支持的曲线名
openssl ecparam -name prime256v1 -genkey -noout -out ec.key # 生成 P-256 私钥
openssl ec -in ec.key -pubout -out ec.pub # 导出对应公钥
# 查看证书使用的曲线与签名算法
openssl x509 -in cert.pem -noout -text | grep -iE 'Public Key Algorithm|NIST CURVE|Signature Algorithm'避免使用自造或冷门曲线参数;哈希算法与曲线强度要匹配,例如 P-384 应搭配 SHA-384 使用。
命名混乱是常见坑:同一条曲线在不同库里可能叫 prime256v1、P-256 或 secp256r1,脚本里建议以 openssl ecparam -list_curves 实际输出的名称为准。
X25519 与 Ed25519 用途不同:前者用于密钥交换,后者用于签名,虽然都基于 Curve25519,接口不能互换使用。
P-521 的存在感低于它的位数:强度最高,但计算开销与报文体积也更大。除长期密钥与合规明确要求外,多数场景用 P-384 已经足够。
从 RSA 迁移到椭圆曲线时要注意整条兼容链:客户端、负载均衡、硬件安全模块都要支持目标曲线,否则会出现部分终端无法握手的情况。