0

如何为给定的 secp256r1 私钥生成 ECIES 公钥,就像 3GPP TS 33.501 版本 15.5.0 版本 15、C.3.4.2 中定义的“配置文件 B”所使用的一样?

如果提供了私钥 F1AB1074477EBCC7F554EA1C5FC368B1616730155E0041AC447D6301975FECDA(来自上述规范的 C.4.4),我如何获得公钥:

Home Network Public Key:
if compressed: '0272DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD1',
otherwise uncompressed: '0472DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD15A7DED52FCBB097A4ED250E036C7B9C8C7004C4EEDC4F068CD7BF8D3F900E3B4'

我已经使用过 Python CryptoMobile 套件,并且可以为 Profile A 获得正确的结果。但我无法为 Profile B 修改它。我也对其他库/语言持开放态度。

谢谢

4

1 回答 1

0

在对密码学源代码进行了一些挖掘之后,我想出了这个解决方案:

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'
于 2021-08-17T13:45:04.933 回答