Bitcoin Wallet: Chiave Privata, Chiave Pubblica e Address

di | 11 Maggio 2019

Ti sei appena creato un wallet e non sai come gestirlo?? oppure sei spaventato da quelle serie di numeri e lettere?? In questo articolo cercherò di spiegarti nel modo più semplice possibile i concetti di chiavi (pubbliche e private) e indirizzo (da qui lo chiamerò Bitcoin address).

Piccola premessa: in questo articolo mi soffermerò parecchio sulla crittografia. Ti consiglio di dare un’occhiata a questo articolo. Inoltre a fine articolo ti consiglierò, se vuoi approfondire, dei libri sia in italiano che in inglese riguardo gli argomenti trattati.

Torniamo a noi!! Nella figura qui sotto c’è un esempio di Bitcoin wallet (per la precisione paper wallet).

Come puoi subito notare ci sono due stringhe di numeri e lettere con i relativi QRcode. Esiste, però, un terzo elemento, non rappresentato, che è la chiave pubblica. Quindi, per riassumere e semplificare, un wallet è composto da:

  • Chiave Privata
  • Chiave Pubblica
  • Bitcoin Address

Esaminiamoli uno alla volta.



CHIAVE PRIVATA

La chiave privata è la prima stringa che si produce quando viene creato un wallet ed è composta da 256 cifre casuali. Hai capito bene…casuali!! Infatti per costruirti una chiave privata puoi, per esempio, lanciare 256 volte i dadi. Nella maggior parte dei siti in cui si può creare un wallet viene chiesto all’utente di muovere il mouse dentro un’area specifica e ad ogni singolo movimento si producono chiavi diverse.
La chiave privata è un numero che va da 1 a n-1 dove n=1.158*1077 poco minore di 2256 .
Questa, però, è una stringa molto lunga rispetto a quella in figura…quali passaggi restano?? Te li elenco in breve:

  1. si effettua una conversione in base esadecimale ottenendo una chiave di 64 cifre
  2. si aggiunge il prefisso 0x80 e si ottiene l’extended private key
  3. si sottopone l’extended private key a un doppio SHA256 e si prendono i primi 4 byte dell’hash risultante: questi 4 byte sono chiamati checksum
  4. si aggiunge il checksum all’extended private key e si fa una codifica in Base58 ottenendo così la WIF private key dove WIF sta per Wallet Import Format

La figura sottostante riassume schematicamente tutto il processo.

Procedimento per la generazione della WIF Private Key

L’aggiunta del prefisso 0x80 permette di ottenere alla fine una chiave privata che inizia con il 5. Nel caso in cui una chiave inizi per L o K vuol dire che oltre al prefisso 0x80 è stato aggiunto il suffisso 0x01: in tal caso questo formato di chiave si definisce WIF-compressed private key.

L’utilità del checksum è quella di verificare la correttezza del processo. Infatti dalla WIF Private Key possiamo fare i passaggi inversi come indicati nello schema qui sotto.

Verifica del checksum

CHIAVE PUBBLICA

La chiave pubblica è generata direttamente dalla chiave privata mediante crittografia basata su curve ellittiche secondo l’algoritmo ECDSA e applicando lo standard secp256k1 che definisce il modello della curva stessa (in foto sotto) su cui basare la crittografia. In particolare questa curva ha la seguente funzione: y2 = x3 + 7

Modello di curva ellittica

Questo processo crittografico è unidirezionale, quindi la chiave privata non può essere calcolata a partire dalla chiave pubblica.

La chiave pubblica andrà a rappresentare un punto nella curva avente quindi una coordinata x e una coordinata y.
Un esempio di chiave pubblica è il seguente:
x = 0154887EBD8BCC5248757BF8541A4CBBC548524B8CAD5211428CA6842AB52145
y = 025A45BD587425AB5321ABCD8DF514532584ABDF8541FD252413FDCABDA12547

Come per le chiavi private, anche la chiave pubblica può essere non compressa o compressa.

Chiave Pubblica non compressa

La forma non compressa comprende in un’unica stringa le due coordinate x e y attaccate a cui viene aggiunto il prefisso 04 che serve a distinguere questo formato da quello compresso. Tenendo l’esempio precedente la chiave pubblica non compressa risulterà così:
040154887EBD8BCC5248757BF8541A4CBBC548524B8CAD5211428CA6842AB52145025A45BD587425AB5321ABCD8DF514532584ABDF8541FD252413FDCABDA12547 in cui in grassetto è il prefisso, in corsivo la coordinata x e la stringa sottolineata è la coordinata y. Per quanto concerne il “peso” questo formato è costituito da 130 cifre esadecimali (64 per coordinata + 2 del prefisso) per un totale di 520 bits o 65 byte.

Chiave Pubblica compressa

Per ridurre la pesantezza delle transazioni e, quindi, alleggerire la Blockchain (se non sai come funziona la Blockchain clicca qui) è stata introdotta la chiave pubblica compressa. Invece di considerare entrambe le coordinate x e y, si prende solo la x dato che comunque la y può essere tranquillamente calcolata con l’equazione della curva (y2 = x3 + 7). In questo caso vi è un inghippo matematico perchè vi possono essere due valori per soddisfare l’equazione (y e -y), quindi è necessario distinguere i due casi. Calcolando la curva ellittica in base binaria su un campo finito di primo ordine (se vuoi approfondire ti rimando nuovamente ai link di fine articolo) è dimostrato che se y è pari sarà positivo, mentre se è dispari sarà un numero negativo. Secondo questo concetto sono stati introdotti altri due prefissi da aggiungere alla coordinata x:

  • 02 se y è pari
  • 03 se y è dispari

Ritornando all’esempio precedente la chiave pubblica compressa sarà:
030154887EBD8BCC5248757BF8541A4CBBC548524B8CAD5211428CA6842AB52145 essendo y un numero dispari.
Questo formato permette di dimezzare la quantità di dati sulla Blockchain per quanto riguarda le chiavi pubbliche.

BITCOIN ADDRESS

La seconda stringa presente sul paper wallet è il Bitcoin address che è diverso dalla chiave pubblica: attenzione perchè molto frequentemente noto che i due concetti tendono ad essere sovrapposti.
Il Bitcoin address è un derivato della chiave pubblica. Anche in questo caso torna in gioco la crittografia.
Il primo passaggio è quello di prendere la chiave pubblica e sottoporla a una doppia funzione di hash: prima con lo SHA256 poi con il RIPEMD160. Quest’ultimo ha la funzione, oltre a crittografare ulteriormente la chiave pubblica, di produrre una stringa pari a 160 bit o 20 byte, quindi meno pesante rispetto la chiave pubblica. All’hash della chiave pubblica si aggiunge il prefisso 0x00 e, come per la chiave privata, si va a calcolare il checksum (non rispiego tutto il passaggio, ma metto c’è lo schema sotto). Il tutto si codifica in Base58 ottenendo il Bitcoin address che, grazie al prefisso 0x00, inizierà sempre col numero 1 (lo puoi verificare dall’esempio di paper wallet a inizio articolo).

Passaggi per la generazione di un Bitcoin address

Concludendo, il wallet non deve essere immaginato come un vero e proprio portafoglio perchè non contiene i bitcoin in possesso, ma contiene le chiavi per poter accedere ai bitcoin presenti nella Blockchain. Anche la frase “posseggo 10 bitcoin” è errata dal momento in cui questi 10 bitcoin non appartengono a nessuno se non alla Blockchain.
L’acquisto di bitcoin non comporta una possessione, ma un diritto ad utilizzarli.

Un saluto ed un enorme grazie se sei riuscito ad arrivare fin qui!!
Luca

P.S.: come ricordato più volte ti lascio i link nel caso tu voglia approfondire la crittografia in linea generale e quella utilizzata nel protocollo di Bitcoin.

Elementi di crittografia
Manuale di crittografia. Teoria, algoritmi e protocolli
Understanding Cryptography: A Textbook for Students and Practitioners
Elliptic Curves: Number Theory and Cryptography, Second Edition

Infine altri libri su cui mi sono ispirato per questo articolo
Mastering Bitcoin: Traduzione italiana della guida completa al mondo di bitcoin e della blockchain
Understanding Bitcoin: Cryptography, engineering and economics

Please follow and like us: