主页 > imtoken.im官网 > 在 Python 中实现密钥和比特币地址

在 Python 中实现密钥和比特币地址

imtoken.im官网 2023-02-22 06:55:40

最全面的比特币 Python 库是 Vitalik Buterin 的 pybitcointools。 在示例 4-4 中,我们使用 pybitcointools 库(导入为“bitcoin”)以不同格式生成和显示密钥和比特币地址

示例 4-4 使用 pybitcointools 库生成和格式化密钥和比特币地址

进口比特币

# 生成随机私钥

valid_private_key = False 而不是 valid_private_key:private_key = 比特币。 random_key() decoded_private_key =

比特币。 decode_privkey(private_key, 'hex')

valid_private_key = 0>

打印“私钥(十六进制)是:”,private_key

打印“私钥(十进制)是:”,decoded_private_key

# 将私钥转换为 WIF 格式 wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif') print "Private Key (WIF) is: ",wif_encoded_private_key

# 添加后缀“01”表示压缩私钥 compressed_private_key = private_key + '01'

print "Private Key Compressed (hex) is: ", compressed_private_key

# 从压缩私钥生成 WIF 格式 (WIF-compressed)

wif_compressed_private_key = 比特币。 encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'),

'wif')

比特币地址_比特币qt钱包发币地址_比特币李笑比特币身价

打印“私钥(WIF 压缩)是:”,wif_compressed_private_key

#ECgenerator点G与私钥相乘得到公钥

public_key = bitcoin.base10_multiply(bitcoin.G, decoded_private_key) print "PublicKey(x,y)coordinatesis:", public_key

# 编码为十六进制,前缀 04

hex_encoded_public_key = bitcoin.encode_pubkey(public_key,'hex') 打印“公钥(十六进制)是:”,hex_encoded_public_key

#压缩公钥,根据偶数或奇数调整前缀

(public_key_x,public_key_y)=public_keyif(public_key_y % 2) == 0:

compressed_prefix = '02' 否则:

compressed_prefix = '03' hex_compressed_public_key = compressed_prefix +

bitcoin.encode(public_key_x, 16) 打印“压缩公钥(十六进制)是:”,hex_compressed_public_key

# 从公钥生成比特币地址 print "Bitcoin Address (b58check) is:", bitcoin. pubkey_to_address(公钥)

#Generatecompressedbitcoinaddressfromcompressed公钥

打印“压缩比特币地址(b58check)是:”,bitcoin.pubkey_to_address(hex_compressed_public_key)

示例 4-5 显示了运行上述代码的结果。

示例 4-5 运行 key-to-address-ecc-example.py

比特币李笑比特币身价_比特币qt钱包发币地址_比特币地址

$ python key-to-address-ecc-example.py 私钥(十六进制)是:

e41daa6

私钥(十进制)是:

265632300484379575922325538266636964406067566859201174768

私钥 (WIF) 是:5JG9hT3beGTJuUAmCQEmNaxAuMacCTfXuw1R3FCXig23RQHMr4K 压缩私钥(十六进制)是:

e41daa601

私钥(WIF 压缩)是:KyBsPXxTuVD82av65KZkrGrWi5qLMah5SdNq6uftawDbgKa2wv6S 公钥 (x,y) 坐标是:

(41637322786646325214887832269588396900663353932545912953 362782457239403430124L,

163889351287812384055267104667247415937610851208643314490

公钥(十六进制)是:

243bcefdd4347074d44bd7356d6a53c495737dd96295e2a9374bf5f02ebfc176

压缩公钥(十六进制)是:

比特币地址(b58check)是:1thMirt546nngXqyPEz532S8fLwbozud8

压缩比特币地址(b58check)是:14cxpo3MBCYYWCgF74SWTdcmxipnGUsPw3

示例 4-6 是另一个示例,使用 Python ECDSA 库进行椭圆曲线计算,而不是使用

比特币地址_比特币李笑比特币身价_比特币qt钱包发币地址

使用比特币的图书馆。

示例 4-6 在比特币密钥中使用椭圆曲线算法的脚本

导入 ecdsa 导入随机

从 ecdsa.util 导入 string_to_number,number_to_string

#secp256k1,

_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2FL

_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8 CD0364141L

_b = 0x0000000000000000000000000000000000000000000000000000000

_a = 0x0000000000000000000000000000000000000000000000000000000

_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798L

curve_secp256k1 = ecdsa.ellipticcurve.CurveFp(_p, _a, _b)

generator_secp256k1 = ecdsa.ellipticcurve.Point(curve_secp256k1, _Gx, _Gy, _r) oid_secp256k1 = (1, 3, 132, 0, 10)

SECP256k1=ecdsa.curves.Curve("SECP256k1", curve_secp256k1, generator_secp256k1,

oid_secp256k1) ec_order = _r

曲线 = curve_secp256k1 生成器 = generator_secp256k1

比特币李笑比特币身价_比特币地址_比特币qt钱包发币地址

定义 random_secret():

random_char = lambda: chr(random.randint(0, 255)) convert_to_int = lambda 数组:

int("".join(array).encode("hex"), 16)

byte_array = [random_char() for i in range(32)] return convert_to_int(byte_array)

def get_point_pubkey(point): 如果 point.y() & 1:

key = '03' + '4x' % point.x() 否则:

key = '02' + '4x' % point.x() 返回 key.decode('hex')

def get_point_pubkey_uncompressed(point): key='04'+

'4x' % point.x() + '4x' % point.y()

返回 key.decode('hex')

# 生成一个新的私钥。 secret = random_secret() 打印“秘密:”,秘密

# 获取公钥点。 point = secret * generator print "EC point:",点

打印“比特币公钥:”,get_point_pubkey(point).encode(“hex”)

# 给定点 (x, y)比特币地址比特币地址,我们可以使用以下方法创建对象:point1 = ecdsa.ellipticcurve.Point(curve, point.x(), point.y(), ec_order)

断言 point1 == point

比特币qt钱包发币地址_比特币地址_比特币李笑比特币身价

示例 4-7 显示了运行脚本的结果。

示例 4-7 安装 Python ECDSA 库并运行 ec_math.py 脚本

运行 ec_math.py 脚本

$ # 安装 Python PIP 包管理器

$ sudo apt-get 安装 python-pip

$ # 安装 Python ECDSA 库

$ sudo pip 安装 ecdsa

$ # 运行脚本

$ python ec-math.py 秘密:

380908350159543588624811326288874439059062049959123782780

EC点:(70048853531867179489857750497606966272382583471322935454

624595540007269312627,

105262206478686743191060800263479589329920209527285803935

736021686045542353380)

BTC公钥:029ade3effb0a67d5c8609850d797366af428f4a0d5194cb221d80777 0a1522873