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

Cryptography HSM返回一个67字节的ECDSA-secp256k1公钥,这意味着什么?,cryptography,ethereum,hsm,Cryptography,Ethereum,Hsm,我通过Graphene库在HSM上生成一个密钥,除非我试图通过获取公钥的“pointEC”属性(相当于CKA_EC_POINT)来获取公钥原始值,否则我会得到一个134个字符的字符串: 044104C9D5B6518B5B7E0D747B86328C37A0D507DE9B3863A43E77B559AB60C0F9B15985F83A8C20588164C0634F98EB4A4CF8CE70020E94AE21A247904FAC8B1010 现在,我知道这个标准有一个X和Y整数,但我读到需

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

044104C9D5B6518B5B7E0D747B86328C37A0D507DE9B3863A43E77B559AB60C0F9B15985F83A8C20588164C0634F98EB4A4CF8CE70020E94AE21A247904FAC8B1010

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

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

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

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


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

您尝试过吗?以太坊地址只是公钥最后20个字节的Keccak散列。最后40个字符。但是,您需要确保公钥的格式类似,因为您是从某个HSM获取的,并且它是一个原始值(字节顺序、点的x/y坐标顺序、可能超过32位的填充等)。是否有方法在不进行实际事务的情况下测试它是否有效?我只需要对最后128个字符进行散列,对吗?所以要获取地址,我是否要用04对公钥进行散列?对于0x?否,散列的是公钥的字节。所以这没有字节和长度编码。也就是说,它只是最后64个字节。经过一点搜索,我找到了这个信息。然后获取结果哈希的最右边的20个字节。不要散列十六进制编码或
0x
字节。同样,这只是密钥的可读表示。