首页 > 解决方案 > 带有密码学问题公钥的 Python ECDH

问题描述

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

我试图用曲线 secp256r1 做一个椭圆曲线 Diffie Hellmann Keyexchange。我能够在我的客户端上生成密钥对而没有任何问题。但是在我创建了公钥对象之后,我有点困惑如何获取 32 字节的公钥以通过网络数据包进行交换。

到目前为止我的代码(这对我不起作用): from cryptography.hazmat.primitives import hashes

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 公钥值时,我无法将值转换回

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

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

希望你能帮助我:)。如果我的问题不清楚,请问。

标签: pythonelliptic-curvepython-cryptography

解决方案


EllipticCurvePublicKey.from_encoded_point采用压缩/未压缩点。public_bytes您可以通过 格式PublicFormat.CompressedPoint和 格式获取这些Encoding.X962。SubjectPublicKeyInfo DER 序列化是一种具有附加结构的 ASN.1 格式。

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


推荐阅读