Python ECDH 与加密问题 Public 密钥

Python ECDH with Cryptography Problem Public Key

目前我开始在 python 上使用加密框架。我试图自己构建一个 SSH 套装,但我 运行 遇到了库的一些问题。我正在尝试构建自己的椭圆曲线密钥交换初始数据包(使用 scapy)。

我正在尝试使用曲线 secp256r1 进行椭圆曲线 Diffie Hellmann 密钥交换。我能够毫无问题地在我的客户端上生成密钥对。但是在我创建了 public 密钥对象之后,我有点困惑如何获取 32 字节的 public 密钥以通过网络数据包进行交换。

到目前为止我的代码(对我不起作用): 来自 cryptography.hazmat.primitives 导入哈希

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serilization

curve = SECP256R1()
peer_private_key = ec.generate_private_key(curve)
peer_public_key = peer_private_key.public_key()

peer_public_pkt = peer_public_key.public_bytes(encoding=serilization.Encoding.DER, format=serialization.PublicFormat.SubjectPublicKeyInfo)

但是这个 peer_public_pkt 不是 32 字节长。

另一个问题是当我通过 Scapy 或 Wireshark 从服务器通过网络获得 ECDH Public 键值时,我无法 运行 将值返回

srv_public_key = ec.EllipticCurvePublicKey.from_encoded_point(curve, data_from_wireshark)

我认为我在这里遗漏了一些关键步骤,但我现在在文档上查看了 2 小时,并在不同站点上查看了一些较旧的示例,但我找不到帮助(或查看解决方案)。

希望你能帮助我 :)。如果我的问题有什么不明白的地方就问。

EllipticCurvePublicKey.from_encoded_point 获得 compressed/uncompressed 分。您可以通过 PublicFormat.CompressedPoint 格式和 Encoding.X962 格式从 public_bytes 获取那些。 SubjectPublicKeyInfo DER 序列化是一种具有附加结构的 ASN.1 格式。

你对 secp256r1 密钥 32 字节的假设也是不正确的,因为压缩的 public 点添加了一个字节来定义明确点重建的符号。