微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有密码学问题的Python ECDH公钥

如何解决具有密码学问题的Python ECDH公钥

目前,我开始在python上使用加密框架。我试图用自己的方式建立SSH套件,但遇到库问题。我正在尝试构建自己的椭圆曲线密钥交换Init数据包(带有Scapy)。

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

到目前为止,我的代码(对我不起作用): 从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公钥值时,我无法将其转换回

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个字节的假设也是不正确的,因为压缩的公共点会添加一个字节来定义明确的点重建的符号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。