【发布时间】:2020-10-30 19:39:25
【问题描述】:
目前我开始在 python 上使用密码学框架。我试图自己构建一个 SSH 套件,但我在库中遇到了一些问题。我正在尝试构建自己的椭圆曲线密钥交换初始化数据包(使用 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 个小时的文档并查看了不同站点上的一些旧示例,但我找不到帮助(或查看解决方案)。
希望你能帮助我:)。如果我的问题有什么不清楚的地方就问吧。
【问题讨论】:
-
您是否尝试过 base32 编码您的密钥以进行网络翻译?
-
@eatmeimadanish 你能给我举个例子来说明你的意思吗?我不太确定如何在 python 中做到这一点
标签: python elliptic-curve python-cryptography