Address

從 Electrum 導出的私鑰,無法使用 Python 重新創建地址

  • January 1, 2018

我創建了一個新的 Electrum 錢包,這是一個地址:

1JkZLnmFfpVFLT2ZMtKzc6BuXMdmY41EHA

通過右鍵點擊它,我選擇“私鑰”,它給出:

Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx

現在我希望能夠(了解它是如何工作的)通過橢圓曲線乘法從這個私鑰到地址。

這是我嘗試過的:

import bitcoin #pybitcointools
import base58
import binascii

pvt = 'Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx'
pvtdecoded = base58.b58decode(pvt)
pvthex = binascii.hexlify(pvtdecoded)[2:-8]     # remove the first initial byte for version and 4 final bytes for checksum
pvt2 = bitcoin.decode_privkey(pvthex, 'hex')    # decode as a decimal

# generate pubkey from pvtkey with elliptic curve multiplication
public_key = bitcoin.fast_multiply(bitcoin.G, pvt2)
addr = bitcoin.pubkey_to_address(public_key)
print addr

這給出:1LNSuE4NKHTyHygeKwnU1equ7MjPMhayxB這不是原始地址。

怎麼了?如何1JkZLnmFfpVFLT2ZMtKzc6BuXMdmY41EHA使用橢圓曲線乘法從私鑰中恢復原始地址( )?


編輯:由於Kz....Wx私鑰看起來像一個 WIF 壓縮的,我試圖替換:

pvt2 = bitcoin.decode_privkey(pvthex, 'hex')    # decode as a decimal

經過

pvt2 = bitcoin.decode_privkey('Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx', 'wif')

但是在橢圓曲線乘法之後,它給出了另一個地址,這仍然不是一個好地址!( 18dFF3EQoPxR44TygdGxHPMe3LSLFeQe4U)

在這兩種情況下,您都不會生成與壓縮公鑰對應的地址。

在第一種情況下,您正在創建看似無效的地址。至少,它使用的私鑰是不正確的,因為它有壓縮字節。這將更改您在解碼時獲得的私鑰值。為了獲得與第二種情況相同的結果,您需要從解碼的 WIF 密鑰中刪除一個額外的字節,因為該字節指定了壓縮。您使用的密鑰是 33 個字節,而不是實際私鑰的 32 個字節。

在第二種情況下,您沒有創建壓縮公鑰來生成地址。它仍在使用未壓縮的公鑰。與其fast_multiply自己使用和創建公鑰,不如使用privkey_to_pubkey. fast_multiply是一種數學運算,它沒有壓縮公鑰的概念。但是privkey_to_pubkey,這樣做會創建正確的公鑰。然後您可以使用該公鑰生成地址。

而不是做

public_key = bitcoin.fast_multiply(bitcoin.G, pvt2)

你應該做

public_key = bitcoin.privkey_to_pubkey(pvt)

引用自:https://bitcoin.stackexchange.com/questions/67150