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进制格式私钥
按上面代码反过来,即:
- Base58解码;
- 将解码结果去掉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