Python实现Diffie-Hellman时共享密钥不匹配问题及解决
Python实现Diffie-Hellman密钥交换的问题解决
核心安全要求
- 素数
p需至少2048位,保障大整数分解的攻击难度 - 生成元
g需生成规模不小于2^128的子群,规避小离散对数攻击风险
初始实现的问题
发送方与接收方各自独立生成素数p和生成元g,而Diffie-Hellman的核心逻辑要求双方必须使用同一组p和g来推导共享密钥,参数不一致直接导致最终计算出的共享密钥无法匹配。
修复后的正确实现逻辑
双方需使用预先协商好的同一组p和g(可由一方生成后传递给另一方,或采用公开的标准安全参数),步骤如下:
- 生成或获取符合安全要求的共享素数
p和生成元g - 发送方生成私钥
a,计算公钥A = g^a mod p并发送给接收方 - 接收方生成私钥
b,计算公钥B = g^b mod p并发送给发送方 - 双方分别计算共享密钥:发送方计算
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
相关产品推荐
相关产品推荐

