看完就会制作钱包恢复器

本文介绍的是通过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. 处理无效地址:

如果生成的地址无效,打印错误信息并继续下一次循环。

六、提醒:

本文章提及代码和技术纯粹作为技术研究,分享为目的,不作投资或者技术指导。读者使用本文技术作违法用途与本人无关。同时提醒读者们,未经授权扫描他人的比特币钱包地址可能涉及法律问题,尤其是在某些国家和地区,这种行为可能被视为非法入侵或盗窃。

如有对区块链技术,碰撞器技术有兴趣的可以私信交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值