【发布时间】:2022-11-28 22:36:28
【问题描述】:
在比特币 wiki 中,他们描述了用于使用 ECDSA 和 Secp256k1 验证签名的算法。该算法有 3 个输入:签名、消息哈希和公钥。
https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm
在 ethers.js 中有一个具有 2 个输入、哈希和签名的函数:
ethers.utils.recoverPublicKey( digest , signature )
https://docs.ethers.io/v5/api/utils/signing-key/
我很想认为验证签名是否正确只是将 publicKey 与 recoverPublicKey 的结果进行比较:
publicKey === ethers.utils.recoverPublicKey( digest , signature )
但是,我犹豫要不要做出这样的断言,因为根据这个问题:https://bitcoin.stackexchange.com/questions/107954/does-every-private-key-have-two-public-keys-ie-y-and-negated-y-secp256k1 私钥可以有多个关联的公钥,因此我担心对于相同的输入 recoverPublicKey 可能会返回几个不同的有效答案,从而使相等性无效。
此外,在高效密码学标准 1 (SEC 1)(https://www.secg.org/sec1-v2.pdf),第 4.1.6 节。公钥恢复操作,它说:
“有可能,可以从签名中恢复几个候选公钥。以很小的成本, 签名者可以生成 ECDSA 签名的方式只有一个候选公钥 是可行的”
【问题讨论】:
标签: blockchain ethereum ecdsa ethers.js secp256k1