比特币的地址是由一串256位的十六进制私钥生成的,如图:
目前有现成的工具可以将私钥生成比特币地址:Bitcoin Explorer,下载的网址:
https://github.com/libbitcoin/libbitcoin-explorer/wiki/Download-BX
有Windows、Linux和MacOS版本。
使用方法如下(Windows平台,将可执行文件改名bx并加入Path):
知道了比特币地址,就可以查询:
https://blockchain.info/address/12PyDVLRFFqMYMaoXdn7CdJ7DDWP6qKoSW
可见这个账户里没有余额(UTXO)。
因此,随机生成256位的十六进制字符串(就是私钥),然后用工具生成比特币地址,然后用抓包工具查询blockchain网站上此地址的信息。实际上,知道了私钥,就相当于拥有了这个比特币地址。
在Python3下运行:
nohup python3 shawalker.py >> nohup.log 2>&1 &
运行的结果差不多是这样的:
闲言碎语不要讲,上源码:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# shawalker.py
import time
import random
import subprocess
import http.client
import logging
logging.basicConfig(filename='log-shawalker.log',
format='%(asctime)s\t%(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.DEBUG)
def http_get(url, resource, params=''):
conn = http.client.HTTPSConnection(url, timeout=10)
conn.request("GET", resource)
response = conn.getresponse()
data = response.read().decode('utf-8')
return data
def utxo_get(data):
idx = data.find('final_balance')
if idx <= 0:
return -1
idx = idx + 52
gap = data[idx:].find('<')
content = data[idx:idx+gap]
logging.info(content)
if not content[0].isdigit() or content[-3:] != 'BTC':
return -2
return content[:-3].strip()
def run():
randkey = ''
while True:
for i in range(0,64) :
a = random.randint(0,15)
randkey += hex(a)[2:3]
logging.info('got: ' + randkey)
status,btcid= subprocess.getstatusoutput('./bx ec-to-public -u ' + randkey + ' | ./bx sha256 | ./bx ripemd160 | ./bx address-encode')
logging.info('try: ' + btcid)
data = http_get('blockchain.info','/address/' + btcid)
utxo = utxo_get(data)
if float(utxo) != 0.0:
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) + '\tBingo: ' + randkey + '\t' + btcid)
logging.info('Bingo!')
randkey = ''
if __name__ == '__main__':
run()
运行这个Python3程序,恭喜你,就等着收割吧。
不过呢,256位的随机数,大约是10^77,而目前已知的宇宙原子,也才10^80个,想要遍历一遍,真要算到天荒地老宇宙尽头!
不喜欢数学的飘过:我的计算机单线程大约2s计算一个,这样一年才能计算1500万,也就是10^7数量级,就算是n个线程,以一个高速网络的数据中心,也才翻几个数量级而已,就算达到10^20,那也要计算10^57年! 另外,目前所有的已知比特币地址中,有余额的不会超过地球人口数量吧(50亿 ~= 10^10),而地球上的沙粒数量大概是10^21这个数量级,就是说,地球上的每一粒沙子(10^21)都包含一个地球II(10^42),这个地球II上的每一粒沙子(10^42)都包含一个地球III,找到地球III上的这一粒沙子(10^63),才能命中目前已有余额的比特币地址。
结论:这个例子只是为了引起大家的兴趣,不建议作为黑客工具(实际上你也黑不了)。
区块链讨论,请君入瓮: