Python ECDSA 无法验证签名
Python ECDSA failing to verify signature
我正在尝试在 python 中使用 ECDSA 验证比特币签名,但发现很难,很多尝试已经失败了。
参数:
address: 33ELcBdg6W7parjGxNYUz5uHVHwPqopNjE
message: hzpPiNlB
signature(base64): I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ=
注意:我已根据 ECDSA 的要求将签名从 base64 转换为 hexstring。每当我尝试验证它时,它都会说:
Expected 64 byte signature (128 hexstring), provided 65 byte signature
(130 hexstring)
我查看了许多关于 ECDSA 的 Whosebug 问题,但 none 的答案与我的问题 100% 相关。感谢你们的帮助。
更新:我用过比特币Python包。首先完成此操作以获取 public 密钥然后验证:
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
虽然恢复的公钥是错误的,但它以某种方式通过了 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
使用正确的路径提取 pubkey
后,我可以确认:
verify = bitcoin.ecdsa_verify(message, signature, pub_key).
返回 True
。
我正在尝试在 python 中使用 ECDSA 验证比特币签名,但发现很难,很多尝试已经失败了。
参数:
address: 33ELcBdg6W7parjGxNYUz5uHVHwPqopNjE
message: hzpPiNlB
signature(base64): I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ=
注意:我已根据 ECDSA 的要求将签名从 base64 转换为 hexstring。每当我尝试验证它时,它都会说:
Expected 64 byte signature (128 hexstring), provided 65 byte signature (130 hexstring)
我查看了许多关于 ECDSA 的 Whosebug 问题,但 none 的答案与我的问题 100% 相关。感谢你们的帮助。
更新:我用过比特币Python包。首先完成此操作以获取 public 密钥然后验证:
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
虽然恢复的公钥是错误的,但它以某种方式通过了 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
使用正确的路径提取 pubkey
后,我可以确认:
verify = bitcoin.ecdsa_verify(message, signature, pub_key).
返回 True
。