python - 带有密码学问题公钥的 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 个小时的文档并查看了不同站点上的一些较旧的示例,但我找不到帮助(或查看解决方案)。
希望你能帮助我:)。如果我的问题不清楚,请问。
解决方案
EllipticCurvePublicKey.from_encoded_point
采用压缩/未压缩点。public_bytes
您可以通过 格式PublicFormat.CompressedPoint
和 格式获取这些Encoding.X962
。SubjectPublicKeyInfo DER 序列化是一种具有附加结构的 ASN.1 格式。
您对 secp256r1 密钥的 32 个字节的假设也是不正确的,因为压缩的公共点添加了一个字节,用于定义明确点重建的符号。