Friday, August 26, 2022

How to Convert Bitcoin-PUBKEY HEX Public Keys to Base58 Bitcoin Address and Check Balance for BTC Coins

 CRYPTO DEEP TECH

In this article, we will learn how to check the balance of Bitcoin coins in a large amount of data using the bitcoin-checker.py Python script for  this .

The result of checking the Python script bitcoin-checker.py
The result of checking the Python script bitcoin-checker.py

We will also learn how to convert the public key of Bitcoin  PUBKEY (HEX) to Bitcoin Address  (Base58) All this big work is done  by the Python script  pubtoaddr.py

As a result, we will check the balance of Bitcoin with particular ease by scanning the Blockchain in the Google Colab terminal  [TerminalGoogleColab]

Earlier I recorded a video tutorial:  “TERMINAL in Google Colab creating all the conveniences for working in GITHUB”

Let’s go to the  «CryptoDeepTools» repository  and take a closer look at how the  Bash script works: getbalance.sh

Teams
Teams
Files
Files
Our Bash script code: getbalance.sh
Our Bash script code: getbalance.sh
grep 'PUBKEY = ' signatures.json > pubkeyall.json

The utility  grep collects all public keys into one common file: pubkeyall.json

sort -u pubkeyall.json > pubkey.json

The utility  sort sorts and removes duplicates, selects unique public keys and saves the result to a file: pubkey.json

rm pubkeyall.json

The utility  rm removes pubkeyall.json

sed -i 's/PUBKEY = //g' pubkey.json

The utility  sed erases the prefix PUBKEY =

python3 pubtoaddr.py

We  run the Python script  pubtoaddr.py and  convert from the file  pubkey.json where our public Bitcoin keys are stored  PUBKEY (HEX) to the file  addresses.json the result will be saved as Bitcoin Addresses (Base58)

import hashlib
import base58
 
def hash160(hex_str):
    sha = hashlib.sha256()
    rip = hashlib.new('ripemd160')
    sha.update(hex_str)
    rip.update(sha.digest())
    return rip.hexdigest()  # .hexdigest() is hex ASCII
 
 
pub_keys = open('pubkey.json', 'r', encoding='utf-8')
new_file = open('addresses.json', 'a', encoding='utf-8')
compress_pubkey = False
 
for pub_key in pub_keys:
    pub_key = pub_key.replace('\n', '')
    if compress_pubkey:
        if (ord(bytearray.fromhex(pub_key[-2:])) % 2 == 0):
            pubkey_compressed = '02'
        else:
            pubkey_compressed = '03'
        pubkey_compressed += pub_key[2:66]
        hex_str = bytearray.fromhex(pubkey_compressed)
    else:
        hex_str = bytearray.fromhex(pub_key)
 
 
    key_hash = '00' + hash160(hex_str)
 
 
    sha = hashlib.sha256()
    sha.update(bytearray.fromhex(key_hash))
    checksum = sha.digest()
    sha = hashlib.sha256()
    sha.update(checksum)
    checksum = sha.hexdigest()[0:8]
 
#   new_file.write("" + (base58.b58encode(bytes(bytearray.fromhex(key_hash + checksum)))).decode('utf-8'))
    new_file.write((base58.b58encode(bytes(bytearray.fromhex(key_hash + checksum)))).decode('utf-8') + "\n")
pub_keys.close()
new_file.close()

We have received the file  addresses.json , now we will check the balance of Bitcoin coins using the bitcoin-checker.py  Python script for this

Run  Python script : python2 bitcoin-checker.py

import sys
import re
from time import sleep

try:    # if is python3
    from urllib.request import urlopen
except: # if is python2
    from urllib2 import urlopen


def check_balance(address):

    #Modify the value of the variable below to False if you do not want Bell Sound when the Software finds balance.
    SONG_BELL = True

    #Add time different of 0 if you need more security on the checks
    WARN_WAIT_TIME = 0

    blockchain_tags_json = [ 
        'total_received',
        'final_balance',
        ]

    SATOSHIS_PER_BTC = 1e+8

    check_address = address

    parse_address_structure = re.match(r' *([a-zA-Z1-9]{1,34})', check_address)
    if ( parse_address_structure is not None ):
        check_address = parse_address_structure.group(1)
    else:
        print( "\nThis Bitcoin Address is invalid" + check_address )
        exit(1)

    #Read info from Blockchain about the Address
    reading_state=1
    while (reading_state):
        try:
            htmlfile = urlopen("https://blockchain.info/address/%s?format=json" % check_address, timeout = 10)
            htmltext = htmlfile.read().decode('utf-8')
            reading_state  = 0
        except:
            reading_state+=1
            print( "Checking... " + str(reading_state) )
            sleep(60*reading_state)

    print( "\nBitcoin Address = " + check_address )

    blockchain_info_array = []
    tag = ''
    try:
        for tag in blockchain_tags_json:
            blockchain_info_array.append (
                float( re.search( r'%s":(\d+),' % tag, htmltext ).group(1) ) )
    except:
        print( "Error '%s'." % tag );
        exit(1)

    for i, btc_tokens in enumerate(blockchain_info_array):

        sys.stdout.write ("%s \t= " % blockchain_tags_json[i])
        if btc_tokens > 0.0:
            print( "%.8f Bitcoin" % (btc_tokens/SATOSHIS_PER_BTC) );
        else:
            print( "0 Bitcoin" );

        if (SONG_BELL and blockchain_tags_json[i] == 'final_balance' and btc_tokens > 0.0): 
            
            #If you have a balance greater than 0 you will hear the bell
            sys.stdout.write ('\a\a\a')
            sys.stdout.flush()

            arq1.write("Bitcoin Address: %s" % check_address)
            arq1.write("\t Balance: %.8f Bitcoin" % (btc_tokens/SATOSHIS_PER_BTC))
            arq1.write("\n")
            arq1.close()
            if (WARN_WAIT_TIME > 0):
                sleep(WARN_WAIT_TIME)

#Add the filename of your list of Bitcoin Addresses for check all.
with open("addresses.json") as file:
    for line in file:

    	arq1 = open('balance.json', 'a')
        address = str.strip(line)
        print ("__________________________________________________\n")
        
        check_balance(address)
print "__________________________________________________\n"
arq1.close()

As a result, the result will be saved in a file: balance.json

File: balance.json
File: balance.json

Now we have learned:

  • Convert Bitcoin Public Keys  PUBKEY (HEX) to Bitcoin Address (Base58)
  • Check all Bitcoin Addresses (Base58) for Bitcoin coins
  • Apply this for cryptanalysis

Source Code:  https://github.com/demining/CryptoDeepTools/tree/main/03CheckBitcoinAddressBalance

Telegram:  https://t.me/cryptodeeptech

Video:  https://youtu.be/Hsk6QIzb7oY

Source: https://cryptodeeptech.ru/check-bitcoin-address-balance

No comments:

Post a Comment

Shadow Key Attack: a fundamental threat of nonce leakage in Bitcoin transactions from the EUCLEAK mechanism via side channels of the Extended Euclidean Algorithm in YubiKey 5 devices and Infineon microcontrollers

  Crypto Deep Tech This paper presents a cryptanalytic study  of the  Shadow Key Attack   , a Bitcoin private key recovery method that explo...