【问题标题】:Python ECDH with Cryptography Problem Public Key带有密码学问题公钥的 Python ECDH
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。这对我有帮助。但是你知道编码和格式是否被曲线本身或使用它的算法标准化了吗?
  • 我真的不明白 SSH 协议中的实际公钥 Q_S(在椭圆曲线 Diffie Hellman Init 中传输)是什么。它只是一个压缩点,它的第一个字节被切断了吗? @Paul Kehrer
  • RFC 5656 可能有助于理解 SSH 是如何做到这一点的。
  • 我已经阅读了 rfc,但我不清楚如何将这个八位字节字符串转换与密码学结合使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多