【发布时间】:2022-01-06 23:56:15
【问题描述】:
我正在尝试在 python 中使用 ECDSA 验证比特币签名,但发现它非常困难,许多尝试已经失败。
参数:
address: 33ELcBdg6W7parjGxNYUz5uHVHwPqopNjE
message: hzpPiNlB
signature(base64): I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ=
注意:根据 ECDSA 的要求,我已将签名从 base64 转换为十六进制字符串。每当我尝试验证它时,它都会说:
预期 64 字节签名(128 十六进制字符串),提供 65 字节签名 (130 十六进制字符串)
我查看了许多有关 ECDSA 的 stackoverflow 问题,但没有一个答案与我的问题 100% 相关。感谢您的帮助。
更新:我使用了比特币 Python 包。首先完成此操作以获取公钥然后验证:
pip install bitcoin
>>> message = 'hzpPiNlB'
>>> signature = 'I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ='
>>> import bitcoin
>>> recover_key = bitcoin.ecdsa_recover(message, signature)
>>> print(recover_key)
04bbdd00bafea40bf7b268baff4ec7635a0b12e94542067cf4077369be938f7b733c731248b88bb0f8b14783247705e568effd54e57643fc827852cf77d0ed8313
>>> verify = bitcoin.ecdsa_verify(message, signature, recover_key)
>>> print(verify)
True
虽然恢复的 pubkey 是错误的,但它以某种方式通过 True。当使用我从钱包中提取的正确公钥时,由于验证签名,我得到了 False。
>>> message = 'hzpPiNlB'
>>> signature = 'I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ='
>>> pub_key = '0352ab1e8ef8553fb307ae8dcafd2395fd06e5ca882f0e27143cb15cf495cc435e'
>>> import bitcoin
>>> verify = bitcoin.ecdsa_verify(message, signature, pub_key)
>>> print(verify)
False
【问题讨论】:
-
能否提供您的代码,以便我们帮助您处理这个问题。
-
只是猜测您可能会尝试使用
ecdsa.util.sigdecode_string(s[1:], ...),其中s是十六进制解码签名。 -
@YuriGinsburg 已更新帖子,我不再收到十六进制错误,而是恢复了错误的 pubkey 等...
-
其实,你现在问了一个不同的问题。此外,您的新代码不可重现。使用 pybitcointools
bitcoin.ecdsa_recover产生ValueError。我认为您应该发布另一个问题并提供 a minimal reproducible example 包括导入语句。 -
@YuriGinsburg 我想通了。提取 Pubkey 时一直是路径问题。我的坏,现在一切都好。感谢您的帮助。
标签: python cryptography bitcoin ecdsa