HSM returns 一个 67 字节的 ECDSA-secp256k1 public 密钥,这是什么意思?

HSM returns a 67 byte ECDSA-secp256k1 public key, what does this mean?

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

044104c9d5b656518b5b7e0d747b86328c37a0d507de9b3863a43e77b559ab60c0f9b15985f83a8c20588164c0634f98eb4a4cf8ce70020e94ae21a247904fac8b1010

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

您看到的是 BER/DER 编码的未压缩点 。值 04 的第一个字节 不是 未压缩点指示符。那是第 3 个字节。值 04 的第一个字节编码 ASN.1 OCTET STRING 的标记字节(对于大多数开发人员来说也称为字节数组)。可以查看结构here.

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

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

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