如果对端 public 密钥未编码为主机私钥,如何生成 DH 共享密钥?

How to generate a DH shared key if the peer public key is not encoded as the host private key?

我正在尝试在主机 (python) 和设备(使用 C)之间执行 DH 密钥交换。 我目前正在主机上使用 cryptography.io's elliptic curve exchange algorithm

情况是这样的: 我收到了对等方的 public 密钥作为 64 个整数的列表,原始的,没有填充没有包装没有加密。

但是,当我必须生成共享密钥时,示例显示如下:

shared_key = private_key.exchange(ec.ECDH(), peer_public_key)

但是报错,ofc:

AttributeError 'list' object has no attribute 'curve'

应该是因为我的私钥是一个_EllipticCurvePrivateKey对象,而对端的public密钥只是一个列表

如何将我的对等 public 密钥转换为合适的 public 密钥以生成共享密钥?

密码学支持使用 ec.EllipticCurvePublicKey.from_encoded_point() (since version 2.5) for the public key and ec.derive_private_key()(从 1.6 版开始)的私钥方法导入 raw EC 密钥。

示例(对于椭圆曲线 secp256k1):

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import ec

curve = ec.SECP256K1()

# Key A: Generate a new key pair
private_keyA = ec.generate_private_key(curve)
public_keyA = private_keyA.public_key()

#Key B: Derive key pair from raw data
private_valueB = 0x36A4B92DCD0077CDA3173D218733931497582B733285B8961CAD616E927691B9
public_valueB = bytes.fromhex('04D4465B9B77F9811BF89B20064A5214C00210D6183910BDC220BA65F8B9D327933C1D7FD3B7DB0A69420A614C9D9303D09BA96C83203927B149A6E28D01E0C253')
private_keyB = ec.derive_private_key(private_valueB, curve, default_backend())
public_keyB = ec.EllipticCurvePublicKey.from_encoded_point(curve, public_valueB)

# Shared Keys
shared_keyA = private_keyA.exchange(ec.ECDH(), public_keyB)
print(shared_keyA.hex())

shared_keyB = private_keyB.exchange(ec.ECDH(), public_keyA)
print(shared_keyB.hex())

在发布的代码中,密钥对A是新生成的,而密钥对B是从原始数据生成的。执行代码时,这些密钥会按预期在两侧生成相同的秘密。

请注意 public 键,表示 public 键的点可以在 compressed 中传递给 from_encoded_point()(仅x 坐标)或 uncompressed 格式(x 和 y 坐标),参见例如here,以起始字节表示密钥是压缩格式还是非压缩格式。
例如,如果要以非压缩格式传递点,则起始字节为0x04,然后是字节x 坐标的字节数,然后是 y 坐标的字节数(上例的总长度为 65 个字节)。
如果数据不可用,则必须相应地进行转换(手动或以编程方式)在传递给 from_encoded_point().

之前