本文介绍的是通过Python制作一个脚本,通过算法生成随机的助记词和比特币地址,并查询其余额,试图找到有余额的钱包。然我们探讨其作为BTC钱包恢复器的原理与技术逻辑。
注意:在数字货币领域,保护个人钱包的安全性至关重要。用户应始终使用安全的备份和恢复机制,并避免使用不安全的工具或方法。同时,开发者应遵守法律法规,避免开发和使用可能侵犯他人权益的工具。
一、脚本概述
这个脚本基于Python编写的,其主要功能是通过生成随机的比特币钱包助记词(mnemonic),并基于这些助记词生成比特币地址,进而检查这些地址的余额,试图找到余额大于或等于 0.0001 BTC 的钱包。脚本的核心逻辑包括激活码验证、助记词生成、地址生成、余额查询以及结果记录等模块。
二、助记词生成
助记词是比特币钱包中用于备份和恢复钱包的一种方式。脚本使用了 mnemonic库 来生成助记词。其生成逻辑如下:
1. 助记词的生成是通过调用 mnemonic库 实现的。以下是助记词生成相关的代码片段及其详细解析:
def generate_mnemonic():
mnemo = Mnemonic("english")
return mnemo.generate(strength=128)
调用库:
mnemonic库来生成助记词。 mnemonic是一个 Python 库,用于生成和操作符合 BIP39 标准的助记词。BIP39 是一种用于生成和存储比特币钱包种子(seed)的标准,它通过助记词来方便用户备份和恢复钱包。
函数解析:
1. Mnemonic("english")
作用 | 创建一个 Mnemonic 类的实例,指定语言为英语。 | |
参数 | english | 指定助记词的单词列表语言。BIP39 标准支持多种语言的单词列表,如英语、中文、法语等。这里使用了英语单词列表。 |
返回值 | 返回一个 Mnemonic 类的实例,用于后续生成助记词。 |
2. mnemo.generate(strength=128)
作用 | 生成一个符合 BIP39 标准的助记词。 | |||
参数 | strength=128 | 指定助记词的强度。强度决定了生成的助记词的长度和熵(随机性)。BIP39 标准支持的强度包括 128、160、192、224 和 256 位。这里选择了 128 位强度。 | 128 位强度 | 生成 12 个单词的助记词。 |
160 位强度 | 生成 15 个单词的助记词。 | |||
192 位强度 | 生成 18 个单词的助记词。 | |||
224 位强度 | 生成 21 个单词的助记词。 | |||
256 位强度 | 生成 24 个单词的助记词。 | |||
返回值 | 返回一个由空格分隔的单词字符串,这些单词是从预定义的英语单词列表中随机选择的。 |
例如以下词组:这是一个强度为 128 位的助记词,包含 12 个单词。
abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
助记词生成的详细过程
1. 初始化 Mnemonic 实例:
脚本通过 Mnemonic("english") 创建了一个 Mnemonic 类的实例,指定了使用英语单词列表。
2. 生成助记词:
• 调用 generate(strength=128) 方法,生成一个强度为 128 位的助记词。
• 该方法内部会生成一个随机的熵值(随机数),并通过 BIP39 标准的算法将其转换为助记词。
• 助记词由 12 个单词组成,这些单词是从 BIP39 定义的 2048 个英语单词列表中随机选择的。
示例输出
mnemonic = generate_mnemonic()
print(mnemonic)
可能的输出:
abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
助记词的用途
生成的助记词可以用于比特币钱包的备份和恢复。通过助记词,用户可以重新生成钱包的种子(seed),进而恢复钱包中的所有地址和私钥。助记词的安全性至关重要,因为它直接关联到钱包的资产。
三、地址生成
地址的生成是基于助记词完成的。以下是地址生成部分的代码片段及其详细解析。
代码片段
def generate_btc_address(mnemonic):
mnemo = Mnemonic("english")
seed = mnemo.to_seed(mnemonic)
bip32_root_key = BIP32Key.fromEntropy(seed)
private_key = bip32_root_key.PrivateKey()
public_key = bip32_root_key.ChildKey(0).PublicKey()
btc_address = base58.b58encode_check(b'\x00' + sha256(public_key).digest())
return btc_address.decode('utf-8')
调用库
mnemonic | 用于将助记词转换为种子(seed)。 |
bip32utils | 用于基于种子生成 BIP32 根密钥和派生子密钥。 |
base58 | 用于对生成的地址进行 Base58Check 编码。 |
hashlib | 用于对公钥进行 SHA-256 哈希处理。 |
函数解析
mnemo.to_seed(mnemonic) | ||||
作用 | 将助记词转换为种子(seed)。 | |||
参数 | mnemonic | 由 generate_mnemonic() 函数生成的助记词字符串。 | ||
返回值 | 返回一个种子(seed),种子是一个字节数组,用于后续生成 BIP32 根密钥。 | |||
原理 | 根据 BIP39 标准,助记词通过 PBKDF2 算法(使用 HMAC-SHA512)和一个默认的密码(通常是空字符串)生成种子。种子是生成 BIP32 钱包的基础。 | |||
BIP32Key.fromEntropy(seed) | ||||
作用 | 从种子生成 BIP32 根密钥。 | |||
参数 | seed | 由 mnemo.to_seed(mnemonic) 生成的种子。 | ||
返回值 | 返回一个 BIP32Key 对象,表示 BIP32 根密钥。 | |||
原理 | 根据 BIP32 标准,种子通过 HMAC-SHA512 算法生成一个 512 位的密钥对(主私钥和主公钥)。主私钥用于生成子私钥,主公钥用于生成子公钥。 | |||
bip32_root_key.PrivateKey() | ||||
作用 | 获取 BIP32 根密钥的私钥部分。 | |||
返回值 | 返回一个字节数组,表示私钥。 | |||
原理 | 私钥是从种子生成的主私钥,用于后续生成子私钥。 | |||
bip32_root_key.ChildKey(0).PublicKey() | ||||
作用 | 从 BIP32 根密钥派生出第一个子密钥,并获取其公钥。 | |||
参数 | 0 | 表示派生的第一个子密钥(索引为 0)。 | ||
返回值 | 返回一个字节数组,表示公钥。 | |||
原理 | 根据 BIP32 标准,通过主私钥和索引值派生出子私钥,再通过子私钥生成子公钥。这里选择索引为 0 的子密钥。 | |||
sha256(public_key).digest() | ||||
作用 | 对公钥进行 SHA-256 哈希处理。 | |||
参数 | public_key | 由 bip32_root_key.ChildKey(0).PublicKey() 生成的公钥。 | ||
返回值 | 返回一个字节数组,表示哈希值。 | |||
原理 | 对公钥进行 SHA-256 哈希处理,生成一个 32 字节的哈希值。 | |||
base58.b58encode_check(b'\x00' + sha256(public_key).digest()) | ||||
作用 | 对哈希值进行 Base58Check 编码,生成比特币地址。 | |||
参数 | b'\x00' + sha256(public_key).digest() :在哈希值前添加一个字节的网络版本字节(对于主网地址,版本字节为 \x00 )。 | |||
返回值 | 返回一个 Base58Check 编码的字符串,表示比特币地址。 | |||
原理 | 在哈希值前添加版本字节( \x00 )。 | |||
对拼接后的字节进行 SHA-256 哈希处理两次,取前 4 个字节作为校验码。 | ||||
将版本字节、哈希值和校验码拼接在一起。 | ||||
使用 Base58 编码将拼接后的字节转换为字符串。 |
示例输出
mnemonic = generate_mnemonic()
address = generate_btc_address(mnemonic)
print(f"Mnemonic: {mnemonic}")
print(f"Address: {address}")
可能的输出:
Mnemonic: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
Address: 1BoatSLRHtKNngkdXEeobR76b53LETtpyT
地址生成的详细过程:
1. 助记词转换为种子:
使用 mnemo.to_seed(mnemonic) 将助记词转换为种子。
2. 种子生成 BIP32 根密钥:
使用 BIP32Key.fromEntropy(seed) 从种子生成 BIP32 根密钥。
3. 获取根密钥的私钥:
使用 bip32_root_key.PrivateKey() 获取根密钥的私钥。
4. 派生子密钥并获取公钥:
使用 bip32_root_key.ChildKey(0).PublicKey() 派生出第一个子密钥,并获取其公钥。
5. 对公钥进行 SHA-256 哈希处理:
使用 sha256(public_key).digest() 对公钥进行哈希处理。
6. 进行 Base58Check 编码:
在哈希值前添加版本字节( \x00 ),然后进行 Base58Check 编码,生成比特币地址。
四、余额查询
余额检测部分是通过调用外部API来查询比特币地址的余额。
代码片段
def get_btc_balance(address):
if not address:
return 0
btc_url = f"https://blockchain.info/q/addressbalance/{address}"
try:
response = requests.get(btc_url, timeout=10)
if response.status_code == 200:
balance_data = response.json()
if isinstance(balance_data, int):
return round(balance_data / 100000000, 4)
else:
print(Fore.RED + "比特币余额接口返回数据格式不正确,期望整数类型,实际非整数" + Style.RESET_ALL)
return 0.0
else:
return 0.0
except requests.exceptions.RequestException as e:
print(Fore.RED + f"请求比特币余额出现异常: {e}" + Style.RESET_ALL)
return 0.0
调用库
• requests 库:用于发送 HTTP 请求,查询比特币地址的余额。
• colorama 库:用于在控制台输出彩色文本,提示错误信息。
函数解析
1. 参数检查
if not address:
return 0
作用 | 检查传入的地址是否为空。 |
逻辑 | 如果地址为空,直接返回余额为 0 ,避免后续的无效查询。 |
2. 构建查询URL
btc_url = f"https://blockchain.info/q/addressbalance/{address}"
作用 | 根据传入的比特币地址构建查询余额的API URL。 | |
参数 | address | 需要查询余额的比特币地址。 |
API说明 | ||
使用了 blockchain.info 提供的查询接口 | ||
接口返回指定地址的余额,单位为 聪(Satoshi,比特币的最小单位,1 BTC = 100,000,000 聪)。 |
3. 发送HTTP请求
response = requests.get(btc_url, timeout=10)
作用 | 向 blockchain.info 发送GET请求,查询指定地址的余额。 | |
参数 | btc_url | 查询余额的API URL。 |
timeout=10 | 设置请求超时时间为10秒,防止请求长时间未响应。 | |
返回值 | response | 返回一个 requests.Response 对象,包含服务器的响应信息。 |
4. 处理响应
if response.status_code == 200:
balance_data = response.json()
if isinstance(balance_data, int):
return round(balance_data / 100000000, 4)
else:
print(Fore.RED + "比特币余额接口返回数据格式不正确,期望整数类型,实际非整数" + Style.RESET_ALL)
return 0.0
else:
return 0.0
作用 | 根据响应状态码和返回数据,处理查询结果。 | |
逻辑 | 检查响应状态码 | 如果状态码为 200 (HTTP OK),表示请求成功。 |
解析返回数据 | 使用 response.json() 将响应内容解析为JSON格式。 | |
检查返回的数据是否为整数类型( int )。根据 blockchain.info 的API文档,余额应为整数(单位为聪)。 | ||
如果返回数据是整数,将其转换为BTC单位(1 BTC = 100,000,000 聪),并保留4位小数。 | ||
如果返回数据不是整数,打印错误信息,并返回 0.0 。 | ||
处理其他状态码 | 如果状态码不是 200 ,直接返回 0.0 ,表示查询失败。 |
5. 异常处理
except requests.exceptions.RequestException as e:
print(Fore.RED + f"请求比特币余额出现异常: {e}" + Style.RESET_ALL)
return 0.0
作用 | 捕获请求过程中可能出现的异常。 | |
逻辑 | 捕获 requests.exceptions.RequestException ,这是 requests 库中所有请求相关异常的基类。 | |
打印异常信息,并返回 0.0 ,表示查询失败。 |
示例调用
address = "1BoatSLRHtKNngkdXEeobR76b53LETtxxx"
balance = get_btc_balance(address)
print(f"Address: {address}, Balance: {balance} BTC")
可能的输出:
Address: 1BoatSLRHtKNngkdXEeobR76b53LETtpyT, Balance: 0.0001 BTC
余额检测的详细过程
1. 检查地址是否为空:
如果地址为空,直接返回余额为 0 。
2. 构建查询URL:
根据传入的地址构建查询余额的API URL。
3. 发送HTTP请求:
使用 requests.get() 向 blockchain.info 发送GET请求,查询余额。
4. 处理响应:
• 检查响应状态码是否为 200 。
• 解析返回的JSON数据,检查是否为整数。
• 将返回的余额从聪转换为BTC单位。
5. 异常处理:
捕获请求过程中可能出现的异常,打印错误信息。
五、碰撞检测与结果记录
碰撞检测与结果记录是整个脚本的核心功能。它通过不断生成随机的助记词、生成对应的比特币地址,并查询这些地址的余额,试图找到余额大于或等于 0.0001 BTC 的地址。如果找到符合条件的地址,脚本会将其记录到本地文件中。
代码片段
def wallet_collision():
count = 0
print(Fore.CYAN + "\nStart the recovery 开始恢复 BTC Chain wallets 钱包..." + Style.RESET_ALL)
while True:
mnemonic = generate_mnemonic()
addr = generate_btc_address(mnemonic)
balance = get_btc_balance(addr)
if addr:
count += 1
print("==================")
print(Fore.YELLOW + "\nMnemonic --> " + mnemonic)
print(Fore.GREEN + "Address : " + Fore.LIGHTGREEN_EX + addr + Style.RESET_ALL)
print(Fore.YELLOW + "Balance : " + Fore.WHITE + str(balance))
if balance >= 0.0001:
record_win(addr, mnemonic, balance)
print(Fore.MAGENTA + "This address has a balance greater than or equal to 0.0001 and has been recorded.\n" + Style.RESET_ALL)
print(Fore.YELLOW + "Scan Number : " + Fore.WHITE + str(count))
time.sleep(3)
else:
print(Fore.RED + "Failed to generate a valid address." + Style.RESET_ALL)
continue
def record_win(address, mnemonic, balance):
with open('./win.txt', 'a') as file:
file.write(f"{address} {mnemonic} {balance}\n")
函数解析
1. wallet_collision() 函数
作用:主循环函数,负责不断生成助记词、地址,并查询余额,检测是否有余额大于或等于 0.0001 BTC 的地址。
逻辑:
a.初始化计数器:用于记录扫描的地址数量。
count = 0
b.主循环:无限循环,持续生成助记词和地址。
while True:
c.生成助记词和地址:
mnemonic = generate_mnemonic()
addr = generate_btc_address(mnemonic)
• 调用 generate_mnemonic() 生成助记词。
• 调用 generate_btc_address(mnemonic) 生成对应的比特币地址。
d. 查询余额:调用 get_btc_balance(addr) 查询生成的地址的余额。
balance = get_btc_balance(addr)
e. 检查地址是否有效:如果生成的地址有效(非空),继续后续操作。
if addr:
f. 打印信息:打印当前生成的助记词、地址和余额。
print("======================")
print(Fore.YELLOW + "\nMnemonic --> " + mnemonic)
print(Fore.GREEN + "Address : " + Fore.LIGHTGREEN_EX + addr + Style.RESET_ALL)
print(Fore.YELLOW + "Balance : " + Fore.WHITE + str(balance))
g.检查余额是否大于或等于 0.0001 BTC:
if balance >= 0.0001:
record_win(addr, mnemonic, balance)
print(Fore.MAGENTA + "This address has a balance greater than or equal to 0.0001 and has been recorded.\n" + Style.RESET_ALL)
如果余额大于或等于 0.0001 BTC,调用 record_win() 函数将结果记录到文件中,并打印提示信息。
h. 更新扫描计数器:更新扫描的地址数量,并打印当前扫描数量。
count += 1
print(Fore.YELLOW + "Scan Number : " + Fore.WHITE + str(count))
i.延时:每次循环暂停 3 秒,避免过于频繁地发送请求。
time.sleep(3)
j.处理无效地址:null如果生成的地址无效,打印错误信息并继续下一次循环。
2. record_win(address, mnemonic, balance) 函数
作用:将符合条件的地址、助记词和余额记录到本地文件 win.txt 中。
逻辑:
with open('./win.txt', 'a') as file:
file.write(f"{address} {mnemonic} {balance}\n")
• 使用 with open() 打开文件 win.txt ,以追加模式( 'a' )写入。
• 将地址、助记词和余额写入文件,每条记录占一行,字段之间用空格分隔。
示例运行
假设脚本运行一段时间后,找到了一个符合条件的地址:
==================
Mnemonic --> abxxdon abaxxn abandon abandon abandon abandon abandon abandon abaxxdon abandon abandon about
Address : 1BoatSLRHtKNngxxxxxx53LETtpyT
Balance : 0.0001
This address has a balance greater than or equal to 0.0001 and has been recorded.
Scan Number : 1000
碰撞检测与结果记录的详细过程
1. 初始化计数器:
初始化一个计数器 count ,用于记录扫描的地址数量。
2. 主循环:
无限循环,持续生成助记词和地址。
3. 生成助记词和地址:
• 调用 generate_mnemonic() 生成助记词。
• 调用 generate_btc_address(mnemonic) 生成对应的比特币地址。
4. 查询余额:
调用 get_btc_balance(addr) 查询生成的地址的余额。
5. 检查地址是否有效:
如果生成的地址有效,继续后续操作。
6. 打印信息:
打印当前生成的助记词、地址和余额。
7. 检查余额是否大于或等于 0.0001 BTC:
如果余额符合条件,调用 record_win() 函数将结果记录到文件中。
8. 更新扫描计数器:
更新扫描的地址数量,并打印当前扫描数量。
9. 延时:
每次循环暂停 3 秒,避免过于频繁地发送请求。
10. 处理无效地址:
如果生成的地址无效,打印错误信息并继续下一次循环。
六、提醒:
本文章提及代码和技术纯粹作为技术研究,分享为目的,不作投资或者技术指导。读者使用本文技术作违法用途与本人无关。同时提醒读者们,未经授权扫描他人的比特币钱包地址可能涉及法律问题,尤其是在某些国家和地区,这种行为可能被视为非法入侵或盗窃。
如有对区块链技术,碰撞器技术有兴趣的可以私信交流!