当前位置:  开发笔记 > 编程语言 > 正文

Python 2.7将比特币Privkey转换为WIF Privkey

如何解决《Python2.7将比特币Privkey转换为WIFPrivkey》经验,为你挑选了1个好方法。

我只是作为编码新手阅读了一个教程。本教程就是这个教程:https : //www.youtube.com/watch?v=tX-XokHf_nI。而且我想用1个易于阅读(不是神秘的)Python文件生成我的比特币地址/私钥-就像现在编写代码的样式一样。

本教程介绍了我以“ 1”开头但不是私钥以“ 5”开头的比特币地址的部分。另外,我不知道如何BIP38加密私钥(以“ 6”开头)。如您所见,主要的比特币网络。

在教程之后,使用https://en.bitcoin.it/wiki/Wallet_import_format作为逐步指南。最后,我评论了自己尝试做的事情,因为这一切都是垃圾。(带有“ SHA256哈希扩展扩展私钥的部分在很多级别上都错了”)我认为向私钥添加80个字节的部分可能是正确的。

PS:在一切正常之前,我现在正在使用静态私钥,这就是为什么我注释掉了非静态私钥部分的原因。它是通过我注释掉“非静态私钥用法”的部分生成的。我还注释掉了已签名的消息代码行(在代码底部),因为它们已显示在教程中,对于生成密钥/地址并不重要。我还尝试通过仅在文件的底部放置打印等,并对内容进行一些排序等来“美化”代码,但事实证明,Python 2.7不喜欢这种方式。

我正在使用Python 2.7,已成功安装了所有程序,代码已正常运行,注释部分已完成。我已使用bitaddress.org验证了打印的结果,就像教程中的上传器一样。尝试搜索以找到解决方案,但是我无法从搜索结果中得到任何有用的信息。

如果您能帮助我解决一些缺少的代码行,我将很高兴!也可以在代码中解释/注释做什么。特别是对于尚未丢失的BIP38 Privkey密码加密。所以我可以看到什么是什么并且可以理解。

运行.py脚本会返回有效的结果,除了我添加的80个字节-如果我已正确完成此操作,则不知道。添加80字节是获取最终私有密钥(从“ 5”开始)的必要步骤。

运行它会打印:

This is my Private Key: 29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736
This is my 80 Byte Private Key: 8029a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736
This is my Public Key: 04d370b77a4cf0078ab9e0ba3c9e78e8dd87cc047fa58d751b3719daa29ac7fbf2c3ba8338f9a08f60a74a5d3a2d10f26afa2f703b8c430eecad89d59a9df00ec5
This is my Bitcoin Address: 1B3wS8dQHtfMpFMSmtT5Fy4kHCYvxejtVo

在这里,您可以看到我的代码,该代码在本教程中也得到了尽可能多的评论:(忘记注释掉“这是我的哈希ext私钥校验和”部分,很抱歉造成混淆。这是我需要帮助的代码现在。)

import os
import ecdsa
import hashlib
import base58

##  STATIC KEY USAGE
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736"
##  PRINTOUT FROM STATIC PRIVATE KEY
print "This is my Private Key: " + private_key_static

## NON STATIC PRIVATE KEY USAGE
#private_key = os.urandom(32).encode("hex")
#print "this is my private key: " + private_key

##  80-BYTE EXTENDED PRIVATE KEY
private_key_plus_80byte = (('80') + private_key_static)

##  PRINTOUT 80-BYTE EXTENDED PRIVATE KEY
print "This is my 80 Byte Private Key: " + private_key_plus_80byte

## SHA256 HASHED EXTENDED PRIVATE KEY
## THIS IS WRONG ON SO MANY LEVELS
#hashed_ext_priv_key_checksum = hashlib.sha256(hashlib.sha256(private_key_plus_80byte).digest()).digest()[:4]
#hashed_ext_priv_key_checksum = hashed_ext_priv_key_checksum.decode("hex")
#print "This is my hashed ext priv key checksum: " + hashed_ext_priv_key_checksum

##  PRIVATE! SIGNING KEY ECDSA.SECP256k1
sk = ecdsa.SigningKey.from_string(private_key_static.decode("hex"),
                        curve = ecdsa.SECP256k1)

##  PUBLIC! VERIFYING KEY (64 BYTE LONG, MISSING 04 BYTE AT THE BEGINNING)
vk = sk.verifying_key

##  PUBLIC KEY
public_key = ('\04' + vk.to_string()).encode("hex")
##  PRINTOUT PUBLIC KEY
print "This is my Public Key: " + public_key

##  PUBLIC KEY ENCODING (2x RIPEMD160)
ripemd160 = hashlib.new('ripemd160')

ripemd160.update(hashlib.sha256(public_key.decode('hex')).digest())

middle_man = ('\00') + ripemd160.digest()

checksum = hashlib.sha256(hashlib.sha256(middle_man).digest()).digest()[:4]

binary_addr = middle_man + checksum

addr = base58.b58encode(binary_addr)

print "This is my Bitcoin Address: " + addr

##  MESSAGE CONTENT
#msg = "hello world"

##  SIGN MESSAGE CONTENT
#signed_msg = sk.sign(msg)

##  VERIFY MESSAGE CONTENT
#assert vk.verify(signed_msg, "hello world")

##  PRINTOUT SIGNED MESSAGE ENCODED TO HEX
#print "This is a HEX encoded signed Message: " + signed_msg.encode("hex")

Marco.. 5

您可能会从比特币Wiki的步骤中误解的是,所有散列和填充必须在密钥上以字节而不是字符串的形式进行。

这意味着,如果您想从私钥中派生WIF密钥,"29a59..."则不必对字符串 进行哈希处理,而可以对与之对应"8029a59..."二进制数据进行哈希处理。

这是有效的缺少代码段

# importing binascii to be able to convert hexadecimal strings to binary data
import binascii

# Step 1: here we have the private key
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736"
# Step 2: let's add 80 in front of it
extended_key = "80"+private_key_static
# Step 3: first SHA-256
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest()
# Step 4: second SHA-256
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest()
# Step 5-6: add checksum to end of extended key
final_key = extended_key+second_sha256[:8]
# Step 7: finally the Wallet Import Format is the base 58 encode of final_key
WIF = base58.b58encode(binascii.unhexlify(final_key))
print (WIF)

哪里binascii.unhexlify(...)告诉我们由十六进制字符串表示的二进制数据。

您的其余代码工作正常;)



1> Marco..:

您可能会从比特币Wiki的步骤中误解的是,所有散列和填充必须在密钥上以字节而不是字符串的形式进行。

这意味着,如果您想从私钥中派生WIF密钥,"29a59..."则不必对字符串 进行哈希处理,而可以对与之对应"8029a59..."二进制数据进行哈希处理。

这是有效的缺少代码段

# importing binascii to be able to convert hexadecimal strings to binary data
import binascii

# Step 1: here we have the private key
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736"
# Step 2: let's add 80 in front of it
extended_key = "80"+private_key_static
# Step 3: first SHA-256
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest()
# Step 4: second SHA-256
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest()
# Step 5-6: add checksum to end of extended key
final_key = extended_key+second_sha256[:8]
# Step 7: finally the Wallet Import Format is the base 58 encode of final_key
WIF = base58.b58encode(binascii.unhexlify(final_key))
print (WIF)

哪里binascii.unhexlify(...)告诉我们由十六进制字符串表示的二进制数据。

您的其余代码工作正常;)

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有