Bitcoin Tool è uno strumento indispensabile, scritto in linguaggio C, per generare e convertire chiavi private e indirizzi Bitcoin. Il software è disponibile sulla pagina Github di Bitcoin-Tool e si utilizza da linea di comando, quindi senza alcuna interfaccia grafica. La compilazione e l’installazione è piuttosto semplice, su Linux e Mac basta utilizzare il comando “make” per generare il binario “bitcoin-tool”
Queste sono le opzioni da linea di comando:
--input-type : Input data type, can be one of : mini-private-key : 30 character Casascius mini private key. private-key : 32 byte ECDSA private key private-key-wif : 37/38 byte ECDSA private key in wallet import format public-key : 33/65 byte ECDSA public key public-key-sha : 32 byte SHA256(public key) hash public-key-rmd : 20 byte RIPEMD160(SHA256(public key)) hash address : 21 byte Bitcoin address (prefix + hash) --input-format : Input data format, can be one of : raw : raw binary data hex : hexadecimal encoded base58 : Base58 encoded (almost never used in the wild) base58check : Base58Check encoded --output-type Output data type, can be any one of those used for --input-type, or additionally : all : all output types, as type:value pairs, most of which are never used, probably for good reason. --output-format Output data format, can be any one of those used for --input-format --input Specify input data on command line --input-file Specify input file name. File size must be exactly what is expected for the corresponding --input-type. --network Set network type of raw keys. Can be one of : bitcoin bitcoin-testnet litecoin litecoin-testnet feathercoin feathercoin-testnet dogecoin dogecoin-testnet quarkcoin quarkcoin-testnet --fix-base58check : Attempt to fix a Base58Check string by changing characters until the checksum matches. --fix-base58check-change-chars : Maximum number of characters to change (default=3)
Il software bitcoin-tool accetta in input chiavi private, pubbliche o indirizzi ed esegue conversioni o genera gli indirizzi bitcoin che poi possono essere utilizzati per ricevere dei bitcoin.
Ad esempio, vediamo come generare un indirizzo a partire da una chiave privata pseudocasuale, utile ad esempio per accumulare bitcoin su un indirizzo generato tramite cold-storage.
Creiamo una chiave privata:
$ openssl rand 32 > key.bin
Visualizziamone il contenuto in formato esadecimale:
$ hexdump -e '32/1 "%02X" "\n"' key.bin 62A87AD3272B41E67108FEA10C57BA6ED609F2F7A2264A83B690CD45707090D1
Convertiamo la chiave privata in formato WIF (Wallet Input Format). Dato che si tratta di una chiave “raw”, dobbiamo impostare esplicitamente il tipo di rete a “bitcoin”, poiché non può essere determinato dalla chiave stessa.
$ ./bitcoin-tool \ --network bitcoin \ --input-type private-key \ --input-format raw \ --input-file key.bin \ --output-type private-key-wif \ --output-format base58check \ --public-key-compression uncompressed 5JZjfs5wJv1gNkJXCmYpyj6VxciqPkwmK4yHW8zMmPN1PW7Hk7F
E’ obbligatorio specificare “–public-key-compression” perché l’output del formato WIF è diverso in base al tipo di compressione scelto per la chiave pubblica, non c’è modo di ricavare tale informazioni dalla chaive privata “raw”.
Generiamo ora la chiave pubblica compressa:
$ ./bitcoin-tool \ --network bitcoin \ --input-type private-key \ --input-format raw \ --input-file key.bin \ --output-type private-key-wif \ --output-format base58check \ --public-key-compression compressed KzXVLY4ni4yznz8LJwdUmNoGpUfebSxiakXRqcGAeuhihzaVe3Rz
Notare che la chiave privata in formato WIF è più lunga se viene attivata la compressione della chiave pubblica, perché è necessario un byte aggiuntivo per indicare che la chiave pubblica deve essere compressa (così come la chiave privata).
Mostriamo ora gli indirizzi di una chiave privata in formato WIF non compressa.
$ ./bitcoin-tool \ --input-type private-key-wif \ --input-format base58check \ --input 5JZjfs5wJv1gNkJXCmYpyj6VxciqPkwmK4yHW8zMmPN1PW7Hk7F \ --output-type address \ --output-format base58check 1KYv3U6gWcxS5UfbNzP25eDEjd5PHHB5Gh
Mostriamo ora gli indirizzi di una chiave privata in formato WIF compressa.
$ ./bitcoin-tool \ --input-type private-key-wif \ --input-format base58check \ --input KzXVLY4ni4yznz8LJwdUmNoGpUfebSxiakXRqcGAeuhihzaVe3Rz \ --output-type address \ --output-format base58check 1Lm2DPqbhsutDkKoK9ZPPUkDKnGxQfpJLW
Se vogliamo stampare un codice QR della chiave pubblica, possiamo utilizzare il software qrencode per generare un’immagine PNG dell’indirizzo bitcoin.
$ qrencode -d 300 -s 3 -l H 5JZjfs5wJv1gNkJXCmYpyj6VxciqPkwmK4yHW8zMmPN1PW7Hk7F -o privkey.png