ECIES 椭圆曲线综合加密方案:从理论构造到工程实践
概述
ECIES(Elliptic Curve Integrated Encryption Scheme,椭圆曲线综合加密方案)是一种通用的混合加密框架,广泛应用于 TLS 1.3、Signal X3DH、PGP 等现代密码协议。它的核心思想是:用非对称算法协商会话密钥,用对称算法加密数据。
这种设计兼具两者的优势:非对称加密解决了密钥分发问题,对称加密提供了高效的数据加密能力。本文将深入剖析 ECIES 的数学构造、安全属性、国密适配方案,以及工程实现中的关键陷阱。
为什么需要 ECIES?
在密码学实践中,直接使用公钥算法加密大数据存在三个问题:
| 问题 | RSA-OAEP | ECIES |
|---|---|---|
| 性能 | 慢(模幂运算) | 快(ECDH + AES) |
| 密钥长度 | 需 2048+ bit | 仅需 256 bit |
| 加密数据量 | 受限(OAEP 填充) | 无限制 |
| 前向保密 | 不支持 | 天然支持 |
标准背景
ECIES 由三个主要标准规范定义:
| 标准 | 全称 | 特点 |
|---|---|---|
| ISO/IEC 14888-3 | Digital signature schemes with appendix — Part 3: ECC | 基础框架,定义 Enc Scheme |
| SEC 1 v2 | Elliptic Curve Cryptography (2010) | 详细实现指南,Section 3.6 |
| RFC 6090 | Elliptic Curve Integrated Encryption Scheme | IETF 标准化,供 TLS 等协议参考 |
- GM/T 0003.4-2012:SM2 公钥加密算法(基于 ECIES 的变体)
- GM/T 0009-2023:SM2 密码算法使用规范(含 ZA 身份绑定)
基本构造
加密流程(Encapsulate)
输入:接收方公钥 Q_B = [d_B]G,明文消息 m
输出:密文三元组 (C1, C2, C3)Step 1:生成临时密钥对
发送方 A 随机选择 $k \in_R [1, n-1]$(n 为曲线阶),计算: $$C1 = [k]G$$
C1 是临时公钥,使用非压缩格式(65 字节,04 + x + y)。
Step 2:执行 ECDH
A 计算与 B 的共享秘密: $$S = [k]Q_B = [kd_B]G$$
由于椭圆曲线的交换性,B 可以用自己的私钥恢复相同的 S: $$S = [d_B]C1 = [d_B][k]G$$
Step 3:密钥派生
使用 KDF(如 HKDF-SHA256)从 S 派生对称密钥:
K = KDF(S || A || B) # A, B 是双方身份标识
(K_enc, K_mac) = split(K, len/2)Step 4:对称加密
使用 AES-GCM 或 SM4-GCM 加密消息:
(C2, tag) = AES-GCM-Encrypt(K_enc, m)Step 5:生成认证标签
C3 = HMAC-SHA256(K_mac, C1 || C2)最终密文:$(C1, C2, C3)$,其中 C1 是临时公钥,C2 是密文,C3 是 MAC。
解密流程(Decapsulate)
输入:私钥 d_B,密文 (C1, C2, C3)Step 1:验证 C1
if C1 不在曲线上:
return "Invalid ciphertext"
if [n]C1 ≠ O: # O 为无穷远点
return "Invalid ciphertext"Step 2:重新计算共享秘密
S = [d_B]C1Step 3:派生相同密钥
K = KDF(S || A || B)
(K_enc, K_mac) = split(K, len/2)Step 4:验证完整性
expected_mac = HMAC-SHA256(K_mac, C1 || C2)
if expected_mac ≠ C3:
return "Integrity check failed"Step 5:解密消息
m = AES-GCM-Decrypt(K_enc, C2, tag)
return m安全性分析
IND-CCA2 安全性
ECIES 在随机预言机模型下达到 IND-CCA2(不可区分性对抗选择密文攻击)安全,这是混合加密方案的最高安全等级。
证明思路:
- 归约到 ECDH 难题:如果攻击者能区分 ECIES 密文,则可以构造 ECDH 区分器
- KDF 的伪随机性:KDF 输出与随机值不可区分,因此对称密钥是伪随机的
- 对称加密的 IND-CPA 安全性:AES-GCM 提供机密性和完整性
如果 ECDH 问题是难的,且 KDF 是安全的,且对称加密方案是 IND-CPA 安全的,则 ECIES 方案是 IND-CCA2 安全的。
防御的攻击类型
| 攻击类型 | 防护措施 |
|---|---|
| 小群攻击 | 验证 C1 在正确子群上($[n]C1 = O$) |
| 无效曲线攻击 | 验证 C1 在目标曲线上(满足曲线方程) |
| 时序攻击 | 使用 hmac.compare_digest() 进行常量时间比较 |
| 中间人攻击 | 结合数字证书验证对方公钥真实性 |
国密适配:SM2-ECIES
SM2 加密算法是 ECIES 的国密变体,主要有以下特殊设计:
ZA 身份绑定
SM2 在 KDF 中引入 ZA 值,绑定用户身份信息:
ZA = SM3(ENTL || ID || a || b || xG || yG || xA || yA)
K = KDF(ZA || xS || yS) # 其中 (xS, yS) = [d_B]C1这提供了身份认证的安全增强:攻击者无法在不掌握接收方身份的情况下伪造密文。
密文格式
SM2 支持两种密文格式:
| 格式 | 顺序 | 说明 |
|---|---|---|
| Mode 0 | C1‖C2‖C3 | 原始顺序,较少使用 |
| Mode 1 | C1‖C3‖C2 | C3(MAC)在 C2(密文)之前,推荐 |
参数对比
| 参数 | 国际标准 ECIES | 国密 SM2-ECIES |
|---|---|---|
| 曲线 | secp256r1 | SM2 曲线 |
| 哈希 | SHA-256 | SM3 |
| KDF | HKDF-SHA256 | SM2-KDF (GM/T 0009-2023) |
| 加密 | AES-GCM | SM4-CBC + HMAC-SM3 |
| MAC | HMAC-SHA256 | HMAC-SM3 |
| 身份绑定 | 无(可选) | 有(ZA 值) |
工程实现要点
1. C1 点验证(防止小群攻击)
不安全实现:
# ❌ 危险:直接使用 C1 计算共享秘密
shared_secret = ecc_mul(private_key, C1)安全实现:
# ✅ 安全:先验证 C1
def validate_point(P, curve_params):
if not is_on_curve(P, curve_params):
raise ValueError("Point not on curve")
if P == point_at_infinity:
raise ValueError("Point at infinity")
if scalar_mul(curve_params.n, P) != point_at_infinity:
raise ValueError("Point not in correct subgroup")
validate_point(C1, sm2_curve_params)
shared_secret = ecc_mul(private_key, C1)2. 密钥派生一致性
确保加密方和解密方使用相同的 KDF 参数:
# 加密方
salt = b"ecies-ecdh-sha256"
info = b"my-application"
K = hkdf_extract(salt, shared_secret)
K_enc, K_mac = hkdf_expand(K, info, 64) # 32 bytes each
# 解密方:使用相同的 salt 和 info
K = hkdf_extract(salt, shared_secret)
K_enc, K_mac = hkdf_expand(K, info, 64)3. 时序安全 MAC 比较
from hmac import compare_digest
expected_mac = compute_mac(k_mac, c1 + c2)
if not compare_digest(expected_mac, received_mac):
raise ValueError("Authentication failed")
# 不能用 if expected_mac != received_mac:与其他协议的对比
| 协议 | 底层构造 | 应用场景 |
|---|---|---|
| ECIES | ECDH + KDF + Symmetric | 通用混合加密框架 |
| SM2 加密 | SM2-ECIES 变体 | 国密合规场景 |
| RSA-OAEP | RSA 填充方案 | 传统 PKI,证书签名 |
| HPKE | KEM + KDF + AEAD | TLS 1.3、后量子迁移 |
| Noise Protocol | 多种 KEM 支持 | 即时通讯、VPN |
| Signal X3DH | X3DH + Double Ratchet | 端到端加密通讯 |
常见陷阱
1. 不使用身份绑定
纯 ECIES 不提供身份认证,可能被中间人替换公钥。解决方案:结合数字证书或使用 SM2-ECIES 的 ZA 身份绑定。
2. 错误的 KDF 参数
加密方和解密方使用不同的 salt 或 info,导致无法解密。解决方案:标准化 KDF 参数,使用协议规范中定义的值。
3. 忘记验证 C1
导致小群攻击,敏感信息可能泄露。解决方案:实现完整的点验证逻辑。
总结
ECIES 是一种经过严格安全证明的混合加密框架,在多个国际标准中得到规范。其核心优势在于:
- 高效性:ECDH 密钥协商 + 对称加密,性能优于纯 RSA 加密
- 前向保密:每次加密使用临时密钥对,即使长期私钥泄露也不影响历史通信
- 可扩展性:可适配不同曲线、哈希、对称算法,适用于国密和国际标准
- C1 点的完整验证(曲线、子群、无穷远点)
- 密钥派生的一致性(salt、info、输出长度)
- 时序安全的 MAC 比较
相关标准与文档
- ISO/IEC 14888-3:2018 — Digital signature schemes with appendix
- SEC 1 v2 (2010) — Elliptic Curve Cryptography
- RFC 6090 — Elliptic Curve Integrated Encryption Scheme (ECIES)
- GM/T 0003.4-2012 — SM2 密码算法使用规范 第4部分:公钥加密算法
- GM/T 0009-2023 — SM2 密码算法使用规范
延伸阅读
- SM2 公钥加密算法深度解析 — 国密 SM2 加密的具体实现
- SM2 密钥交换协议深度解析 — SM2 密钥交换的 ZA 计算与 KDF 实现
- 椭圆曲线密码学数学基础 — ECC 的数学原理与曲线形式