HSM 返回一个 67 字节的 ECDSA-secp256k1 公钥,这是什么意思?



我通过 Graphene 库在 HSM 上生成一个密钥,除非当我尝试通过获取其"pointEC"属性(相当于CKA_EC_POINT)来获取公钥原始值时,我得到一个 134 个字符的字符串:

044104c9d5b656518b5b7e0d747b86328c37a0d507de9b3863a43e77b559ab60c0f9b15985f83a8c20588164c0634f98eb4a4cf8ce70020e94ae21a247904fac8b1010

现在,我知道这个标准有一个 X 和 Y 整数,但我读到需要一些数学才能使它们对生成以太坊地址有效。我也明白"04"意味着它是一个未压缩的公钥,但我不知道为什么"4104"不断弹出或它是什么意思。这些只是表示相同数据的不同方式吗?我可以只取最后 128 个字符并将其散列为有效的以太坊地址吗?

您看到的是一个BER/DER 编码的未压缩点04的第一个字节值不是未压缩的点指示器。这是第 3 个字节。第一个值的字节04编码 ASN.1 八进制字符串(大多数开发人员也称为字节数组)的标记字节。您可以在此处查看结构。

十六进制值41的字节是后面的字节大小:1 字节用于04未压缩点指示器,32 字节用于静态大小的X 坐标,32 字节用于 Y 坐标。

所以是的,如果您需要 X 和 Y 坐标,您可以将最后 64 个字节分成两部分。128 个字符只是这些字节的十六进制表示形式 - 但您应该只关心字节。

当然,你应该做的是解析ASN.1,确定并验证长度,获取未压缩的点,对其进行解码并检查它是否在曲线上以验证您的输入。如果 EC 密钥包含正确的参数,则该密钥有效。然而,对于以太坊/比特币,曲线是隐含已知的(secp256k1)。

最新更新