lunedì 2 settembre 2019

[BITCOIN] Chiave pubblica

Spero non abbiate letto "chiava in pubblico" perché non é l'oggetto del post.

Per comprendere le criptovalute, é necessario armarsi delle basi tecniche.

Parto sempre dai fondamentali quando studio qualcosa, e fatico non poco a separare il segnale utile dal rumore. Nessun problema é di per sé complicato. Se un problema viene decomposto nei suoi mattoni fondamentali e i collegamenti fra i mattoni sono definibili in modo chiaro e coerente, anche i problemi piú complessi diventano semplici da comprendere.

La difficoltá nell'analizzare un problema complesso é capire quali sono i mattoni fondamentali e il modo in cui interagiscono.

Uno dei mattoni fondamentali di Bitcoin é la firma digitale.

Bitcoin di per sé, anche se viene chiamata criptovaluta, non usa la crittazione.

Bitcoin non usa una crittazione per inviare l'informazione tra due utenti.

Bitcoin viene considerata criptovaluta perché i bitcoin che due entitá (Alice e Bruno, per esempio) si scambiano non vengono registrati con i nomi Alice e Bruno sul registro delle transazioni; Alice e Bruno vengono registrati con le loro chiavi pubbliche, numerelli fatti da uni e zeri. Le chiavi pubbliche sono in chiaro nei registri di bitcoin, quelli che i miner validano. Non c'é crittazione dei registri proprio perché le transazioni sono in chiaro, cioé posso ripercorrere tutta la scia delle transazioni di Alice indietro nel tempo seguendo la sua chiave pubblica.

 La chiave pubblica é una parte fondamentale della firma digitale. 
Di fatto é quella che "garantisce" l'anonimato di chi invia e riceve pagamenti in bitcoin, assicurandone al contempo che si tratta sempre della stessa persona.

Fin qui, sono cose note a quasi tutti.
Meno noto é il fatto che esistono molti protocolli per creare firme digitali. Per lavoro, ad esempio, uso Adobe Reader per validare digitalmente i documenti che approvo con la mia firma digitale.

Il protocollo piú famoso per creare firme digitali é il RSA (1983) , basato sulla difficilissima  fattorizzazione di un numero ottenuto dalla moltiplicazione di due enormi numeri primi.

Per creare firme digitali, invece, Bitcoin usa l'algoritmo ECSDA, con curva ellittica secp256k1.
Capiamo che la matematica che sta dietro il funzionamento della firma digitiale é sofisticatissima.
Se volete avere un posto sicuro, laureatevi in matematica e specializzatevi in crittografia.
Tutti i protocolli che generano firme digitali sono basati su numeri primi, in un modo o nell'altro. Perché? perché trovare quei numeri primi che, moltiplicati, diano come risultato il numero reso pubblico richiede calcoli, lunghissimi e quindi spesa in corrente enorme.

Cosa succederebbe se un computer quantistico, che nella fattorizzazione dei numeri primi in breve tempo trova la sua ragoine d'essere venisse sviluppato da qualche agenzia governativa militare (se non l'hanno giá fatto)? Come agenzia governativa, quindi al servizio del governo, come minimo mi fregherei tutti i Bitcoin di Satoshi Nakamoto perché ricostruirei la sua chiave privata segreta che ha associati i suoi bitcoin. Non direi nulla a nessuno, e alla bisogna ne farei un bel dump in rete se volessi far collassare il valore di bitcoin. Ma questa é fantascienza, per ora.

Vediamo come funziona la ECDSA.
Si crea una stringa di 256 bit del tutto casuale. Piú é casuale, meglio é. Le funzioni che generano valori che sembrano casuali, vi assicuro, non sono banali da inventare. Questa stringa deve essere tenuta segreta, e si chiama chiave privata. E'come la chiave di casa nostra, e non la diamo agli sconosciuti.

Creiamo poi una chiave pubblica, con cui "certifichiamo"che tutto quello che proviene da noi (email, bitcoin, pagamenti, documenti, etc) proviene SOLO da noi e non da un'altra entitá.

Il trucco é inventarsi un sistema per cui, nota a tutti la chiave pubblica, sia difficilissimo, se non impossibile, capire quale é la stringa casuale, la chiave privata, da cui si é partiti per generare la chiave pubblica.

Tutto qua. RSA, ECDSA e altri sistemi hanno questo obiettivo. Non solo. Devono anche assicurarsi che la generazione della chiave pubblica sia semplice. Vogliamo che l'hacker impieghi migliaia di anni a trovare la nostra chiave privata, ma vogliamo generare la chiave pubblica in pochi secondi.

La chiave privata viene "data in pasto" ad una funzione che produce una chiave pubblica di 512 bit. La funzione che effettua questa conversione si chiama funzione di curva ellittica, nel caso fi bitcoin, che fa sí che il risultato finale, la chiave pubblica, varii enormemente se anche un singolo bit della chiave privata passa da 0 a 1 o viceversa. In altri termini, non é possibile identificare un pattern significativo di cambiamenti nella chiave pubblica per inferire quale era la chiave privata.

Facciamo un esempio.

Se la funzione ellittica fosse banalmente una funzione di primo grado, es y = 3x+2, in cui x é la chiave privata, se la chiave pubblica fosse 11, capisco che la chiave privata é 3. Banale. Osserviamo che se la chiave privata fosse 5, anziché 3, la chiave pubblica sarebbe 17, ben vicina al risultato precedente.

Questo, per una funzione che produce chiavi pubbliche, non é accettabile. I risultati devono apparire "scrambled, cioé sparpagliati, in modo da non offrire INDIZI sulla natura della chiave privata se questa dovesse variare anche di pochissimo.

Come é fatta questa funzione ellittica?
Chiariamo che questa funzione era semisconosciuta ed é solo grazie a Bitcoin che é diventata popolare. Satoshi Nakamoto, il leggendario e supersegreto creatore di Bitcoin e di BlockChain, a mio avviso era un gruppo di persone che lavoravano sotto lo stesso pseudonimo perché trovare cosí tante competenze in una singola persona fisica é difficilmente immaginabile.

La funzione ha questa espressione

y^2 = x^3 + 7,

quindi é una funzione abbasatanza semplice, se consideriamo di plottarla su un dominio reale. Basta avere fatto la quinta di liceo scientifico per disegnarla. Passa per (-7^1/3,0), incrocia l'asse delle ordinate in + e - sqrt(7), diverge all'infinito ed é simmetrice rispetto all'asse x.

Eccola.



Quindi 'sta funzione starebbe alla base della firma digitale di Bitcoin? all'esame di maturitá ne ho risolta una ben peggiore....
Risposta: Sí.

Il trucco peró é che il dominio dove questa funzione é definita, i valori dell'asse x per intenderci, non sono tutti i numeri reali, per cui la funzione é continua ed é carina disegnarla a matita.
No, il dominio dove é x assume i suoi valori é non banale, si chiama campo di Galois e assume valori sparsi sull'asse x. Il campo di Galois é un set finito (quindi non infinito come i numeri reali in un intervallo finito) all'interno del quale le classiche operazioni di addizione, sottrazione, logaritmo,  divisione e quindi modulo hanno regole specifiche, non le solite che applichiamo.


In pratica ció comporta che i valori che x puó assumere, sono interi a 256 bit e che se si cambia la x di poco, la y assume un valore completamente differente.
Visivamente, abbiamo una cosa di questo tipo, con un campo di Galois di ordine basso.




Vedete dal grafico sopra che se la x cambia di poco, la y cambia di molto (va su e giú). La simmetria tra la metá inferiore e quella superiore del grafico é preservata, ma giá con questo esempio, campo a F59, i numeri appaiono casuali. Sembra una matrice sparsa.
Se incrementiamo l'ordine del campo, che so, lo portiamo a F127, i punti appaiono distribuiti ancora piú casualmente (lasciate perdere le righe e guardate i puntini, nel grafico sottostante).

Avete capito il concetto, spero. Creare puntini il piú sparsi possibile, in modo da assomigliare a rumore bianco, cioé a rumore in cui non si riesce a trovare un "disegno"interno utile a capire da quali puntini si é partiti.


La domanda che dovremmo porci é: perché i creatori di bitcoin hanno deciso di usare questa particolare funzione ellittica per creare le chiavi pubbliche?

Sembra, da un post del 2011, che Satoshi abbia scelto questo sistema per nessun motivo in particolare.
Non voglio fare il complottista, ma decidere di optare per un sistema crittografico anziché un altro dovrebbe essere soggetto a profonda disamina.
Secondo me Satoshi o chi per lui ha riflettuto su quale sistema offrisse la maggiore resistenza crittografica (cryptographic strength) a paritá della dimensione della chiave privata.


Dalla tabella sopra, si evince che RSA é piú fiacca di una curva ellittica, perché la curva ellittica richiede molti meno bit da elaborare e trasmettere per offrire la stessa sicurezza ad un attacco. Ad esempio, una chiave da curva ellittica lunga 256 bit é equivalente ad una chiave RSA lunga 3072, che é giá il 50% piú lunga delle chiavi a 2048 bit in uso oggi. L'RSA é semplicemente il metodo piú usato perché é da piú tempo in circolazione ma non é il piú efficace.

Altri ambiti in cui questo sistema di firma digitale basato su curve ellittiche é attualmente usato sono  il progetto TOR e l'Apple iMessage service.

Bene, questo é tutto per oggi, spero di non avervi annoiato troppo.

Nessun commento:

Posta un commento