You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Diffie-Hellman时共享密钥不匹配问题及解决

Python实现Diffie-Hellman密钥交换的问题解决

核心安全要求

  • 素数p需至少2048位,保障大整数分解的攻击难度
  • 生成元g需生成规模不小于2^128的子群,规避小离散对数攻击风险

初始实现的问题

发送方与接收方各自独立生成素数p和生成元g,而Diffie-Hellman的核心逻辑要求双方必须使用同一组p和g来推导共享密钥,参数不一致直接导致最终计算出的共享密钥无法匹配。

修复后的正确实现逻辑

双方需使用预先协商好的同一组p和g(可由一方生成后传递给另一方,或采用公开的标准安全参数),步骤如下:

  1. 生成或获取符合安全要求的共享素数p和生成元g
  2. 发送方生成私钥a,计算公钥A = g^a mod p并发送给接收方
  3. 接收方生成私钥b,计算公钥B = g^b mod p并发送给发送方
  4. 双方分别计算共享密钥:发送方计算K = B^a mod p,接收方计算K = A^b mod p,此时结果完全一致

简化示例代码

import random
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives import serialization

# 生成符合安全要求的共享参数(2048位素数,子群规模达标)
parameters = dh.generate_parameters(generator=2, key_size=2048)

# 发送方生成密钥对
sender_private_key = parameters.generate_private_key()
sender_public_key = sender_private_key.public_key().public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 接收方生成密钥对(复用同一组共享参数)
receiver_private_key = parameters.generate_private_key()
receiver_public_key = receiver_private_key.public_key().public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 双方解析对方公钥并计算共享密钥
sender_shared_key = sender_private_key.exchange(
    serialization.load_pem_public_key(receiver_public_key)
)
receiver_shared_key = receiver_private_key.exchange(
    serialization.load_pem_public_key(sender_public_key)
)

# 验证共享密钥一致性
assert sender_shared_key == receiver_shared_key

内容的提问来源于stack exchange,提问作者ken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:27:02