如何为给定的 secp256r1 私钥生成 ECIES public 密钥

How to generate the ECIES public key for a given secp256r1 private key

如何为给定的 secp256r1 私钥生成 ECIES public 密钥,例如用于 3GPP TS 33.501 版本 15.5.0 版本 15、C.3.4.2 中定义的“配置文件 B”的密钥?

如果提供私钥 F1AB1074477EBCC7F554EA1C5FC368B1616730155E0041AC447D6301975FECDA(来自上述规范的 C.4.4),我如何导出 public 密钥:

家庭网络Public密钥:
如果压缩:'0272DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD1',
否则未压缩:'0472DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD15A7DED52FCBB097A4ED250E036C7B9C8C7004C4EEDC4F068CD7BF8D3F900=11B4][

我玩过 Python CryptoMobile 套件,可以为配置文件 A 获得正确的结果。但是我无法为配置文件 B 修改它。我对其他 libraries/languages 还有。

谢谢

在深入研究密码学源代码后,我想出了这个解决方案:

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import asymmetric

priv_key = 'F1AB1074477EBCC7F554EA1C5FC368B1616730155E0041AC447D6301975FECDA'
privkey_int = int(priv_key, base=16)
privkey_ec = asymmetric.ec.derive_private_key(privkey_int, asymmetric.ec.SECP256R1())
pubkey_ec = privkey_ec.public_key()
pubkey_bytes = pubkey_ec.public_bytes(
    encoding=serialization.Encoding.X962, 
    format=serialization.PublicFormat.CompressedPoint
)
print(binascii.hexlify(pubkey_bytes).decode('utf-8'))
'0272DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD1'