我目前试图从一个压缩派生一个比特币未压缩的ECDSA公钥。派生一个ECDSA从压缩的一个未压缩的公钥
根据这link on the Bitcoin wiki,有可能这样做......但如何?
给你更多的细节:截至目前,我已经在比特币网络上收集了密钥(33字节长)。
它们的格式如下:< 1个字节长的前缀> < 32个字节长的X>。 从那里,我想获得未压缩的键(65字节长),其格式为: < 1字节长的前缀> < 32字节长的X> < 32字节长的Y>
根据这一other link on the Bitcoin wiki,它应该是为解方程一样简单:
Y 1 2 = X^3 + 7
不过,我似乎无法到达那里。我对Y的价值是遥不可及的。这里是我的代码(公共密钥来自Bitcoin wiki example值):
import binascii
from decimal import *
expected_uncompressed_key_hex = '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6'
expected_y_hex = expected_uncompressed_key_hex[-64:]
expected_y_dec = int(expected_y_hex, 16)
x_hex = expected_uncompressed_key_hex[2:66]
if expected_y_dec % 2 == 0:
prefix = "02"
else:
prefix = "03"
artificial_compressed_key = prefix + x_hex
getcontext().prec = 500
test_dec = Decimal(int(x_hex, 16))
y_square_dec = test_dec**3 + 7
if prefix == "02":
y_dec = - Decimal(y_square_dec).sqrt()
else:
y_dec = Decimal(y_square_dec).sqrt()
computed_y_hex = hex(int(y_dec))
computed_uncompressed_key = "04" + x + computed_y_hex
的信息,我的输出是:
computed_y_hex = '0X2D29684BD207BF6D809F7D0EB78E4FD61C3C6700E88AB100D1075EFA8F8FD893080F35E6C7AC2E2214F8F4D088342951'
expected_y_hex = '2CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6'
谢谢您的帮助!
一个与比特币标签实际编程问题。这是罕见的... – jww