Bcademy

CAPIRE BITCOIN | PARTE QUINTA: CHIAVI E INDIRIZZI | SEZIONE SECONDA: LE CHIAVI

2020-01-09 11:01:47

Il testo è una guida completa, che partendo dalla parte teorica e toccando quella pratica, entra in profondità nelle dinamiche interne di Bitcoin. Per approfondimenti: "Mastering Bitcoin" di A. Antonopoulos e "The Bitcoin Standard" di S.Ammous. Per info sui corsi [email protected]

Chiavi

Il possesso dei bitcoin si determina attraverso:

  • chiavi digitali;
  • indirizzi bitcoin;
  • firme digitali.

Le chiavi non sono memorizzate in rete, ma dagli utenti nel wallet (file o database di creazione e memorizzazione delle chiavi). Sono coppie di chiavi composte da una chiave privata ed una chiave pubblica. L’unica rappresentazione delle chiavi che gli utenti vedono è l’indirizzo bitcoin, solitamente (ma non esclusivamente) generato da e corrispondente a una chiave pubblica. Bitcoin utilizza la moltiplicazione a curva ellittica come base per la sua crittografia a chiave pubblica: la coppia di chiavi consiste in una chiave privata (per spendere bitcoin) e in un’unica chiave pubblica (per ricevere bitcoin) che ne deriva. La relazione matematica tra le due chiavi permette alla privata di essere utilizzata per generare firme sui messaggi, e alla pubblica di validare tale firma senza rivelare la privata.

Un wallet contiene una raccolta di coppie di chiavi, dove:

  • la chiave privata (k) è un numero (di solito scelto a caso prima dell’avvento dei wallet deterministici, che ora costituiscono la best practice e verranno trattati all’interno di un ulteriore approfondimento);
  • da k attraverso la moltiplicazione a curva ellittica (una funziona di crittografia unidirezionale) viene generata una chiave pubblica (K);
  • da K attraverso un algoritmo di hashing  (una funzione di crittografia unidirezionale) viene generato un indirizzo bitcoin (A).

Chiavi private. Una chiave privata è un numero casuale, che non deve essere in nessun caso rivelata (o smarrita, pena la perdita dei bitcoin associati), ergo la modalità più sicura per generare una chiave privata è trovare una fonte di entropia o casualità. Il client bitcoin utilizza il generatore di numeri casuali dell’OS (generalmente inizializzato da una fonte di casualità – nel caso di wallet deterministici HD il generatore si usa per generare il seed da cui si generano le chiavi) per produrre 256 bit di entropia. La chiave privata potrebbe essere un qualsiasi numero tra 1 e n-1, dove n è una costante (1.158 * 1077un po’ meno di 2256) definita come l’ordine della curva ellittica in bitcoin. Generato un numero casuale da 256 bit (solitamente sottoponendo all’algoritmo di hash SHA256 una stringa più lunga di bit casuali) se il risultato è inferiore a n-1 la chiave è adeguata.

La seguente è una chiave privata generata randomicamente (k) mostrata nella sua rappresentazione esadecimale (256 cifre mostrate come 64 cifre esadecimali, ognuna da 4 bit):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

Chiavi pubbliche. La chiave pubblica è generata dalla chiave privata attraverso la moltiplicazione a curva ellittica, irreversibile, K = k * G dove:

  • k è la chiave privata;
  • G è un punto costante chiamato generator point.

L’operazione inversa, conosciuta come “finding the discrete logarithm”, calcolare k conoscendo K ha la medesima difficoltà di trovare il valore di k attraverso un attacco brute-force.

Bitcoin utilizza una curva ellittica specifica e un set di costanti matematiche, definite in uno standard detto secp256k1, stabilita dal National Institute of Standards and Technology (NIST).

Partendo con una chiave privata k, e moltiplicandola per un punto predeterminato della curva chiamato il generator point G, si produce un altro punto sulla curva, che corrisponde alla chiave pubblica K. Il generator point G è specificato come parte dello standard secp256k1 ed in bitcoin è il medesimo per tutte le chiavi, ergo una chiave privata k moltiplicata per G avrà come risultato sempre la stessa chiave pubblica K. La relazione tra k e K è fissa, ma può essere calcolata solo in un’unica direzione, da k a K.

Implementando la moltiplicazione a curva ellittica si prenda la k riportata in precedenza e la si moltiplichi per G al fine di ottenere K:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G

La chiave pubblica è definita dalle coordinate del punto K = (x, y):
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

Per visualizzare la moltiplicazione di un punto con un intero, si utilizza la curva ellittica più semplice rispetto ai numeri reali (la matematica è la stessa). L’obiettivo è trovare kG, multiplo di G, che equivale ad aggiungere G a se stesso, k volte di seguito. Nelle curve ellittiche, aggiungere un punto a se stesso equivale a tracciare una tangente alla curva nel punto e trovare dove interseca nuovamente la curva, quindi riflettere quel punto rispetto all’asse x.

 


Alessio Salvetti, Co-founder di Bcademy e board member (VP), business developer, filosofo per formazione e bitcoiner per passione, esperto di modeling e lean startup, è co-founder di Inbitcoin e responsabile prodotto di Bcademy (CPO).

10