我目前試圖從一個壓縮派生一個比特幣未壓縮的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