BTC101: 趣谈:十分钟学会如何黑比特币

in #bitcoin7 years ago (edited)

比特币的地址是由一串256位的十六进制私钥生成的,如图:
精通比特币-100-私钥、公钥和比特币地址之间的关系zh.jpg
目前有现成的工具可以将私钥生成比特币地址:Bitcoin Explorer,下载的网址:
https://github.com/libbitcoin/libbitcoin-explorer/wiki/Download-BX
有Windows、Linux和MacOS版本。
使用方法如下(Windows平台,将可执行文件改名bx并加入Path):
比特币地址生成.png
知道了比特币地址,就可以查询:
https://blockchain.info/address/12PyDVLRFFqMYMaoXdn7CdJ7DDWP6qKoSW
blockchain.info-11.png
可见这个账户里没有余额(UTXO)。
因此,随机生成256位的十六进制字符串(就是私钥),然后用工具生成比特币地址,然后用抓包工具查询blockchain网站上此地址的信息。实际上,知道了私钥,就相当于拥有了这个比特币地址。

在Python3下运行:
nohup python3 shawalker.py >> nohup.log 2>&1 &

运行的结果差不多是这样的:
shawalker-11.png

闲言碎语不要讲,上源码:

#!/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),才能命中目前已有余额的比特币地址。
结论:这个例子只是为了引起大家的兴趣,不建议作为黑客工具(实际上你也黑不了)。

区块链讨论,请君入瓮:
知识星球-回到未来-10横.png