pu369com

BTC不同格式私钥的相互转换

代码:

一.16进制格式的私钥转换成WIF格式

import hashlib,binascii,base58

#16进制私钥
hex_str = "1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd"
#在16进制私钥前面加上0x80版本号,如下:
hex_string = "80"+hex_str
#hex_k = bytes.fromhex(hex_string).hex()
hex_k1 = bytes.fromhex(hex_string)
#对第1步结果进行SHA256哈希计算,如下:hex_k2:f7d98762db7267f6f9283156058333dce856036ae0a0b4741046d25058747739
hex_k2 = hashlib.sha256(hex_k1).hexdigest()
#将第2步结果进行SHA256哈希计算,如下:hex_k3:c47e83ffafda3ba4396e1bc6a648515e5fc9aa95910af6a4429537b87fb7b474
hex_k3b =  bytes.fromhex(hex_k2)
hex_k3 = hashlib.sha256(hex_k3b).hexdigest()
#取第3步结果的前4字节(c47e83ff),加到第1步结果的末尾,如下:hex_k4:801e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aeddc47e83ff
hex_k4 = hex_string + hex_k3[0:8]
#对第4步结果进行Base58编码,就是最后得到的WIF格式私钥了,如下:base58_str:5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
# 将16进制字符串转换为二进制
k5 =  binascii.unhexlify(hex_k4)
# 转换为Base58
base58_str = base58.b58encode(k5)
print(base58_str.decode('utf-8'))

二.WIF格式私钥转换成16进制格式私钥

按上面代码反过来,即:

  1. Base58解码;
  2. 将解码结果去掉80版本号,以及去掉最后面的4字节校验位。
import hashlib,binascii,base58

#私钥
wif_str = "5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn"
#编码为字节流
base58_1 = wif_str.encode('utf-8')
base58_2 = base58.b58decode(base58_1)
hex_k = base58_2.hex()
print(hex_k[2:-8])

三、16进制格式的私钥转换成WIF-compressed(WIF压缩格式)

========引用参考原文=========

其实很简单 -> 只需在原始16进制格式私钥的后面加上01即可,加上01表示该私钥是压缩格式的。特别说明:

原始格式 32 字节,256位的0或者1
hex格式,hex格式又分为压缩和非压缩,压缩和非压缩的区别在于 -> 压缩格式 = 非压缩格式 + 01 ,所以说压缩格式并不是真的压缩了,反而多了一个后缀01
WIF(wallet-import-format)格式,5开头
WIF-compressed(WIF压缩格式),K 或者 L 开头
=================

代码与第一段代码一样,只需在hex_str 后面加上 01 ,生成的wif压缩格式私钥为:KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

 

参考:https://blog.csdn.net/qq_42815754/article/details/95008877

posted on 2024-03-14 00:40  pu369com  阅读(36)  评论(0编辑  收藏  举报

导航