如何解决具有密码学问题的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 举报,一经查实,本站将立刻删除。