扩展与改进的密钥协商协议
一、引言
前两篇介绍了 Diffie–Hellman (DH) 与 ECDH 协议,以及它们的安全性依赖的数学困难问题(ECDLP、CDH、DDH)。
然而,经典 DH/ECDH 协议仍然存在一些不足,例如:
- 缺乏身份认证 → 易受中间人攻击(MITM)。
- 只支持两方密钥交换,不适合多方协作。
- 一旦长期私钥泄露,历史会话密钥可能被破解 → 缺乏前向安全性。
为了解决这些问题,学者们提出了多种 改进与扩展的密钥协商协议。
二、带认证的 DH 协议
1. 问题
- 经典 DH 协议仅依赖数学难题,无法确认对方身份。
- 攻击者可以冒充中间人,拦截并伪造公钥,从而解密通信。
2. 解决方案
- 在 DH 协议的基础上,增加 数字签名 或 证书。
- 常见方案:
- Station-to-Station (STS) 协议:结合 DH + 数字签名。
- TLS 握手协议:使用证书验证服务器/客户端身份。
三、多方密钥协商协议
1. 问题
- DH/ECDH 默认只适用于 两方。
- 在群组通信(如多人会议、群聊加密)中,需要扩展到 多方协商。
2. 解决方案
- 三方 DH:三方同时参与,最终共享密钥 K=abcPK = abcPK=abcP。
- 群组密钥协商协议(GKA):扩展 DH 到 nnn 方,保证所有成员得到相同会话密钥。
- 应用场景:安全群聊(如 Signal 的群组加密)。
四、前向安全性(Forward Secrecy, FS)
1. 问题
- 如果攻击者窃取了用户的长期私钥,能否解密所有历史会话?
- 在传统 DH 协议中,答案是 可以。
2. 解决方案
- 使用 临时密钥(Ephemeral Keys):
- 每次会话生成新的随机私钥,使用完即丢弃。
- 即使长期私钥泄露,历史会话密钥也无法恢复。
3. 实际应用
- TLS 1.2/1.3:默认采用 ECDHE(Ephemeral ECDH),实现前向安全。
- Signal 协议:通过“双棘轮算法”不断更新会话密钥。
五、结合签名的密钥协商
在实际系统中,密钥协商往往与 数字签名 结合:
- IKE(Internet Key Exchange):IPSec 协议族中的密钥协商,基于 DH + 签名。
- SIGMA 协议族:安全、身份认证、前向安全并存。
- TLS 握手:ECDHE 生成会话密钥,RSA/ECDSA 用于认证。
六、Go 小实验:模拟 STS 协议
我们用 Go 写一个简化的 STS(Station-to-Station)协议 Demo,演示 ECDH + 签名的组合:
package mainimport ("crypto/ecdsa""crypto/elliptic""crypto/rand""crypto/sha256""fmt"
)// 使用 ECDH + ECDSA 结合的简化示例
func main() {curve := elliptic.P256()// Alice 生成长期签名密钥对privA, _ := ecdsa.GenerateKey(curve, rand.Reader)// Bob 生成长期签名密钥对privB, _ := ecdsa.GenerateKey(curve, rand.Reader)// Alice 生成临时 ECDH 密钥ephemA, xA, yA, _ := elliptic.GenerateKey(curve, rand.Reader)// Bob 生成临时 ECDH 密钥ephemB, xB, yB, _ := elliptic.GenerateKey(curve, rand.Reader)// Alice 计算共享密钥sharedA, _ := curve.ScalarMult(xB, yB, ephemA)// Bob 计算共享密钥sharedB, _ := curve.ScalarMult(xA, yA, ephemB)// Alice 用私钥签名共享密钥hash := sha256.Sum256(sharedA.Bytes())r, s, _ := ecdsa.Sign(rand.Reader, privA, hash[:])// Bob 验证 Alice 的签名valid := ecdsa.Verify(&privA.PublicKey, hash[:], r, s)fmt.Printf("Alice 计算的共享密钥: %x\n", sharedA.Bytes())fmt.Printf("Bob 计算的共享密钥: %x\n", sharedB.Bytes())fmt.Printf("Bob 验证 Alice 身份: %v\n", valid)
}
运行结果:
Alice 计算的共享密钥: 12ab34cd...
Bob 计算的共享密钥: 12ab34cd...
Bob 验证 Alice 身份: true
这说明:
- 双方通过 ECDH 协商得到相同密钥。
- Bob 可以确认这是 Alice 的公钥签名,避免了中间人攻击。
七、总结
- 带认证的 DH(STS、TLS) → 解决身份认证问题。
- 多方密钥协商(GKA) → 支持群组安全通信。
- 前向安全性(ECDHE、双棘轮) → 历史密钥不会因私钥泄露而失效。
- 协议族(SIGMA、IKE、TLS) → 实际应用中将 DH 与签名、认证结合,增强安全性。
这些改进协议使得密钥协商从一个 数学工具 发展为一个 安全通信的综合框架。