Sicurezza dei token: Crittografia - Token-Economy-Book/ItalianTranslation GitHub Wiki

La crittografia è uno strumento fondamentale per la gestione sicura dei token in una rete di soggetti anonimi tra i quali non esiste una relazione di fiducia. Consente la trasparenza delle interazioni, mantenendo la privacy di tutti i partecipanti alla rete. In una rete blockchain la crittografia è utilizzata per identificare ciascuno dei partecipanti in modo affidabile, ed è anche parte integrante del protocollo di consenso.

La crittografia è la pratica e lo studio della comunicazione sicura in presenza di terzi. L'obiettivo è quello di creare sistemi informatici resistenti alle intercettazioni, alle manipolazioni e ad altre forme di attacco. La storia della crittologia risale al tempo in cui furono introdotti i testi scritti a mano, ma si è evoluta in modo significativo da quando sono stati introdotti gli elaboratori (computer). La crittografia rappresenta un sottocampo della crittologia, e si riferisce principalmente al processo mediante il quale un'informazione (testo in chiaro) viene convertita in un testo incomprensibile (testo cifrato). Un testo cifrato è illeggibile senza il corrispondente cifrario, che consente di riportarlo in chiaro.

I codici sono stati una delle prime tecniche di cifratura sviluppate per crittografare un testo in chiaro utilizzando cifrari di sostituzione (che prevedono cioè la sostituzione di unità di testo in chiaro con lettere singole, coppie di lettere o terzine di lettere) o cifrari di trasposizione (che prevedono il riordino delle unità di testo in chiaro in una sequenza diversa, di solito abbastanza complessa). La decodifica è il processo di riconversione dal testo cifrato illeggibile al testo originale in chiaro. Un cifrario è, quindi, una coppia di algoritmi che crea la cifratura e la corrispondente decifratura: è progettato in modo tale che la cifratura di un messaggio sia una operazione facile, mentre sia molto complesso riportarlo in chiaro se non si conosce il codice.

Storicamente la crittografia è stata usata in varie forme, come ad esempio un testo cifrato inciso su una pietra in Egitto. Altre forme di cifrario risalgono alla Persia Sassanide, all'antica Grecia, all'Impero Romano, all'India, ecc. Dallo sviluppo della macchina Enigma (una cifrante meccanica a rotore) nella prima guerra mondiale, e la diffusione dei computer nella seconda guerra mondiale, le applicazioni e i metodi crittografici si sono radicalmente evoluti. I cifrari classici sono diventati inutilizzabili perché erano molto facili da indovinare con semplici "attacchi di forza bruta", così chiamati perché consistono nella esecuzione da parte di un computer di tutte le combinazioni possibili finché non viene indovinato il codice giusto. I computer non solo hanno migliorato le possibilità della crittoanalisi, che si riferisce al processo di rottura della crittografia (ovvero la scoperta del codice segreto), ma hanno anche reso possibile utilizzare tecniche di cifratura più complesse. I moderni algoritmi crittografici sono progettati per essere impossibili da rompere applicando la forza bruta in un lasso di tempo e con una quantità di denaro accettabili. Tuttavia le "ipotesi di resistenza computazionale" devono tenere in considerazione il continuo aumento della potenza di elaborazione dei computer.

I computer hanno anche introdotto nuove forme di crittografia, estendendola a qualsiasi tipo di informazione digitale, non solo al testo scritto. La disponibilità nel prossimo futuro dei computer quantistici pone nuove sfide, e molti ricercatori stanno già studiando il rapporto tra problemi crittografici e fisica quantistica. La crittografia post-quantistica è già oggetto di sviluppo da parte di alcuni ricercatori e ingegneri, che nel progettare nuovi algoritmi hanno già iniziato a considerare i potenziali effetti del calcolo quantistico. L’uso della crittografia solleva, nell'era dell'informazione, anche molte questioni legali. Alcuni governi limitano o proibiscono l'uso della crittografia e, in alcuni casi, la classificano addirittura come un'arma. Alcune giurisdizioni potrebbero consentire alle autorità governative di imporre la consegna delle chiavi di cifratura per documenti che potrebbero essere rilevanti ai fini di un'indagine. Inoltre, nell’era digitale la crittografia può rappresentare un fattore interessante quando si parla di diritti umani. La questione di come garantire la privacy in una società digitalizzata sta già conquistando l’interesse di un pubblico ampio, e probabilmente diventerà ancora più rilevante negli anni a venire. La questione cruciale, in questo contesto, è se e come il diritto costituzionale alla privacy della comunicazione, o alla inviolabilità della propria abitazione possa corrispondere al diritto alla comunicazione criptata o al tracciamento di dati criptati (per approfondire: Parte 3 - I privacy token).

Mentre i primi tentativi di criptare le comunicazioni elettroniche si sono concentrati sulla messa a punto di tecnologie di segretezza e di conservazione per le comunicazioni delle istituzioni governative, il campo si è rapidamente ampliato. Negli ultimi decenni, le tecnologie di crittografia sono state applicate in vari altri settori, come il commercio elettronico, i pagamenti digitali, la gestione dei diritti digitali, la gestione delle password, il controllo dell'integrità dei messaggi, l'autenticazione dell'identità, le firme digitali, le prove interattive e il calcolo sicuro. Nel contesto delle blockchain e di altri registri distribuiti, la crittografia è utilizzata per scopi di identificazione, verifica e sicurezza nell’ambito del protocollo principale. Nel contesto delle blockchain pubbliche e di altre tecnologie Web3 vengono utilizzati tre importanti elementi di costruzione crittografici: (i) funzioni hash, (ii) crittografia simmetrica e (iii) crittografia asimmetrica (crittografia a chiave pubblica).

Le funzioni Hash sono algoritmi matematici che convertono qualsiasi tipo di dato numerico di dimensione arbitraria (messaggio) in dati di dimensione fissa (valore hash). L'unico modo per ricreare i dati originali (messaggio) conoscendone il valore dell’hash è tentare di applicare l’algoritmo di hash a tutte le possibili combinazioni di valori fino a trovare quella che produce il risultato atteso. Anche se ciò è possibile, è un'operazione che richiede tempo ed è quindi costosa, e per questo motivo viene definita come funzione a senso unico. Le funzioni hash possono essere utilizzate per garantire l'integrità dei dati trasmessi e la privacy. Le applicazioni principali sono le firme digitali, i servizi di autenticazione, il rilevamento delle impronte digitali, l'individuazione di duplicati, l'identificazione univoca dei file o la creazione di checksum per rilevare la corruzione dei dati. Per essere considerate resilienti, le funzioni hash crittografico devono soddisfare determinate proprietà: devono essere progettate in modo che siano (i) facili da calcolare; (ii) deterministiche (ovvero dallo stesso messaggio si ottiene sempre lo stesso hash); (iii) dispendiose e costose quando si tenta di generare un messaggio partendo dal suo valore hash con la sola forza bruta; (iv) piccole modifiche al valore di input originale dovrebbero cambiare il valore hash. Dovrebbe inoltre essere (v) impossibile trovare due messaggi diversi (in ingresso) con lo stesso valore hash (in uscita).

Sistemi simmetrici: Prima della nascita della crittografia a chiave pubblica, due parti si affidavano ad una chiave di crittografia che si scambiavano con un metodo non crittografico, attraverso incontri segreti, buste sigillate o corrieri di fiducia. Comunicare in privato con qualcuno richiedeva incontri di persona e lo scambio di una chiave segreta. Nel mondo delle comunicazioni moderne, dove è necessario coordinarsi in una rete di molti attori non fidati (Internet), tali metodi non sarebbero praticabili. Per questo motivo la cifratura simmetrica non viene utilizzata per la comunicazione nelle reti pubbliche. È tuttavia più veloce e più efficiente della cifratura asimmetrica, e quindi viene utilizzata per la cifratura di grandi quantità di dati, per alcune applicazioni di pagamento o per la generazione di numeri casuali.

I sistemi asimmetrici, chiamati anche sistemi di crittografia a chiave pubblica, hanno risolto il problema del coordinamento introducendo due chiavi, una pubblica e una privata. La chiave privata è nota solo al proprietario e deve essere tenuta segreta, mentre la chiave pubblica può essere distribuita liberamente. La chiave pubblica può essere trasmessa alla rete, il che permette a chiunque nella rete di utilizzare le chiavi pubbliche per inviare un messaggio criptato al "proprietario" della chiave pubblica. Questo messaggio cifrato può essere decifrato solo con la chiave privata del destinatario. Il mittente può combinare un messaggio con la propria chiave privata per creare una firma digitale sul messaggio. Ora, chiunque può verificare con la chiave pubblica corrispondente se la firma è valida. Il modo in cui le chiavi vengono generate dipende dagli algoritmi crittografici utilizzati. Esempi di sistemi asimmetrici sono RSA (Rivest-Shamir-Adleman) e ECC (Elliptic-Curve Cryptography), che viene utilizzato anche in Bitcoin. L'uso della crittografia asimmetrica ha aumentato la sicurezza della comunicazione in reti non affidabili, come Internet, in modo scalabile[^1]. I capitoli che seguono si concentreranno su come la crittografia viene utilizzata nella rete Bitcoin e in altre Blockchain.

La rete Bitcoin utilizza principalmente hash in combinazione con le firme digitali per proteggere l'integrità dei dati che fluiscono attraverso la rete utilizzando la crittografia a chiave pubblica. Gli hash sono inoltre utilizzati nel contesto del protocollo di consenso "Proof-of-Work". Bitcoin utilizza la crittografia a chiave pubblica, e più specificamente la crittografia a curva ellittica. Si prega di notare che le blockchain alternative e altri sistemi di contabilità distribuiti potrebbero utilizzare strumenti crittografici alternativi a quelli descritti di seguito. Alcune blockchain, per esempio, utilizzano una crittografia che preserva maggiormente la privacy, come "Zcash" (basata su Zero Knowledge Proof)[^2] e "Monero" (basata su Ring Signatures o Firme ad Anello)[^3]. La stessa comunità Bitcoin sta attualmente cercando schemi alternativi di firma crittografica che siano più rispettosi della privacy e più scalabili, per esempio, con "Mimblewimble" (per approfondire: Parte 3 - I privacy token).


Symmetric Cryptography vs. Assymmetric Cryptography


Crittografia a chiave pubblica

La rete Bitcoin utilizza la crittografia a chiave pubblica per creare un riferimento digitale sicuro sull'identità di un utente mediante due chiavi crittografiche: una chiave privata e una chiave pubblica. I riferimenti digitali sicuri su chi è chi, e chi possiede cosa, sono un elemento basilare per le transazioni P2P. In combinazione con una transazione, queste chiavi possono creare una firma digitale che prova la proprietà dei propri token e permette il controllo dei token con un applicativo di tipo wallet. In modo simile alla firma di un assegno a mano e all’autenticazione con password per l'Internet banking, la crittografia a chiave pubblica viene utilizzata per autenticare e firmare le transazioni Bitcoin.

La chiave pubblica è generata per via matematica partendo dalla chiave privata. Mentre è molto facile calcolare la chiave pubblica dalla chiave privata, l'inverso è possibile solo applicando una tecnica di pura forza bruta; indovinare la chiave è possibile ma enormemente costoso. Il supercomputer più potente del mondo impiegherebbe trilioni di anni per decifrarla, rendendo l’operazione praticamente impossibile. Questo significa che, anche se la nostra chiave pubblica è nota a tutti, nessuno può ricavare da essa la nostra chiave privata. Un messaggio cifrato con la chiave pubblica può viaggiare in modo sicuro fino al proprietario della chiave privata, e solo il proprietario di questa chiave privata è in grado di decifrarlo. Questo metodo funziona anche al contrario. Un messaggio firmato o cifrato utilizzando una chiave privata può essere verificato o decifrato utilizzando la chiave pubblica corrispondente.

Un corrispondente analogico della chiave pubblica può essere un lucchetto. Se Bob vuole mandare un messaggio ad Alice, ma ha paura che qualcuno possa intercettarlo e leggerlo, chiederà ad Alice di mandargli il suo lucchetto (sbloccato), trattenendone la chiave. Bob può mettere la sua lettera in una piccola scatola e chiuderla con il lucchetto che Alice gli ha mandato, chiudendola con una semplice spinta. La lettera può ora essere inviata in tutto il mondo senza essere intercettata da una persona non autorizzata. Solo Alice, che ha la chiave del suo lucchetto, può aprire la lettera. Naturalmente, qualcuno potrebbe provare a rompere la scatola utilizzando la forza bruta, invece di usare la chiave. Anche se è possibile, la difficoltà dipenderebbe dalla robustezza della scatola e dalla forza del lucchetto. Gli stessi principi di base si applicano alla crittografia moderna.

Algoritmi Sicuri

La questione cruciale nella crittografia a chiave pubblica ruota intorno alle ipotesi di complessità computazionale: come si può ampliare lo sforzo computazionale richiesto per ricavare la chiave privata dalla chiave pubblica, rispetto a quello richiesto per calcolare la chiave pubblica dalla chiave privata? Quanto è difficile rompere la crittografia indovinando il risultato? Quanto tempo ci vorrebbe per indovinare la chiave privata, e quanto sarebbe costoso? La chiave privata è rappresentata da un numero (casuale), e più tale numero è grande, più difficile è - per una persona che non lo conosca - indovinarlo. Se ci vogliono un paio di decenni per indovinare un numero casuale, il numero è considerato sicuro. Tuttavia, ogni algoritmo crittografico è vulnerabile all'attacco di tipo forza bruta, che consiste - nel caso della chiave pubblica e chiave privata - nel provare a indovinare la chiave privata (conoscendo quella pubblica) provando tutte le possibili combinazioni fino a quando non si ottiene la chiave pubblica desiderata. Dato che i computer stanno diventando sempre più veloci ed efficienti, occorre rendere più sofisticati gli algoritmi, o usando numeri più grandi o inventando algoritmi più resistenti.

Per assicurarsi che sia difficile indovinarla, una chiave privata deve presentare, per essere resistente, dei requisiti minimi: deve essere (i) un numero generato casualmente; (ii) un numero molto grande; (iii) deve derivare da un algoritmo sicuro per la generazione delle chiavi. La casualità è importante, poiché non vogliamo che nessun'altra persona o elaboratore usi la stessa chiave, e gli esseri umani non sono bravi ad inventare la casualità. Chiavi di grandi dimensioni permettono una maggiore distribuzione della casualità e sono molto più difficili da decifrare con la forza bruta, ma anche più lente da calcolare. A causa della loro complessità, gli algoritmi sicuri devono essere provati scientificamente e sottoposti a stress test contro le violazioni della sicurezza. È buona norma evitare di inventare il proprio algoritmo. Questo problema è diventato ovvio quando il team che sviluppa la rete IOTA ha deciso di implementare la propria funzione di hash, chiamata Curl. IOTA è una soluzione alternativa alla blockchain, che propone di risolvere il problema della scalabilità di Bitcoin con un meccanismo di consenso alternativo e una crittografia alternativa. La loro funzione Curl autocostruita, tuttavia, è stata poi scoperta essere "non resistente alle collisioni"[^4]. Gli algoritmi crittografici utilizzati nella rete Bitcoin hanno resistito, fin dalla nascita di quella tecnologia, a tutti i tentativi di manomissione dei dati.

Senza la crittografia non sarebbe possibile ottenere un consenso distribuito in una rete di attori che non si conoscono o non si fidano l'uno dell'altro. Poiché i computer diventano più potenti e possono indovinare i numeri più velocemente, per mantenere l'attuale livello di sicurezza gli algoritmi utilizzati dovranno resistere al tempo e agli standard tecnologici in rapida evoluzione. Molti ricercatori e sviluppatori sostengono che i supercomputer, in particolare i computer quantistici, saranno presto in grado di decifrare la maggior parte degli algoritmi di crittografia convenzionali attraverso la forza bruta. Questo non è del tutto vero e dipende dall'algoritmo crittografico. Mentre i computer quantistici non sono significativamente migliori nel cracking degli hash, sono molto più potenti quando si tratta di curve ellittiche e di fattorizzazione in numeri primi. Le risposte sono complesse e non ancora completamente definite . Gli algoritmi crittografici resistenti ai computer quantistici sono, quindi, un'area di ricerca mission-critical. Si vedano per maggiori dettagli su questo argomento i riferimenti riportati alla fine di questo capitolo.

Hashing

L'hashing è un metodo per trasformare grandi quantità di dati in numeri rappresentati su un numero di cifre definite che sono difficili da indovinare. Si può convertire un testo o un'immagine, rappresentati da una sequenza di bit di lunghezza variabile, ottenendo una sequenza di bit di lunghezza fissa sotto forma di hash. Queste funzioni assicurano l'integrità dei dati. La rete Bitcoin utilizza algoritmi di hash sicuri (SHA), come SHA-256. Una importante proprietà degli hash è che se un singolo bit dei dati di input viene cambiato, l'output cambia significativamente, il che rende facile, ad esempio, rilevare anche minimi cambiamenti in grandi file di testo. Come potete vedere dall'esempio di testo riportato qui sotto[^5], un hash completamente diverso viene generato quando nella frase viene cambiato anche un solo carattere. Questo fenomeno avviene per il cosiddetto "effetto valanga", ed è utile per verificare facilmente l'integrità dei dati. Una stringa completamente diversa risulta dall'hashing della sequenza di hash.

Hash della frase “How to buy Bitcoin?”:
156aedcfab1d49f73abddd89faf78d9930e4b523ab804026310c973bfa707d37

Hash della frase “How to buy Bitcoin”:
4314d903f04e90e4a5057685243c903fbcfa4f8ec75ec797e1780ed5c891b1bf

Applicando l’hashing all’ hash si ottiene:
4c9622e1148ff0b855de50e62999d194039eb2faa9e715cc9d9ef604015aa1fe

L'effetto valanga descrive il comportamento di una funzione matematica in cui anche un piccolo cambiamento in una stringa di input causa un cambiamento significativo del valore hash risultante. Questo significa che se si aggiunge solo una parola, o anche una virgola, ad un documento di diverse centinaia di pagine, l'hash di quel documento cambierà. Il valore dell'hash di un documento può, quindi, servire come un gemello crittografico del documento, motivo per cui viene spesso chiamato "impronta digitale". Come risultato di ciò, non c'è bisogno di criptare l'intero documento con la chiave privata del mittente, poiché questo consuma tempo, larghezza di banda e denaro. Invece per garantire l’integrità del documento si può calcolare (e verificare) il valore dell'hash di quel documento. L'effetto valanga descrive il comportamento di una funzione matematica in cui anche un piccolo cambiamento in una stringa di input causa un cambiamento significativo del valore hash risultante. Questo significa che se si aggiunge solo una parola, o anche una virgola, ad un documento di diverse centinaia di pagine, l'hash di quel documento cambierà. Il valore dell'hash di un documento può, quindi, servire come un gemello crittografico del documento, motivo per cui viene spesso chiamato "impronta digitale". Come risultato di ciò, non c'è bisogno di criptare l'intero documento con la chiave privata del mittente, poiché questo consuma tempo, larghezza di banda e denaro. Invece per garantire l’integrità del documento si può calcolare (e verificare) il valore dell'hash di quel documento.

L'hash nella rete Bitcoin fa parte dei seguenti processi: (i) codifica degli indirizzi dei wallet; (ii) codifica delle transazioni tra wallet; (iii) verifica e convalida dei saldi dei conti dei wallet; e (iv) del meccanismo di consenso detto Proof-of-Work.

Wallet e Firme Digitali

Un wallet blockchain è una applicazione software che memorizza la nostra chiave privata, quella pubblica e il nostro indirizzo nella blockchain, e comunica con la rete blockchain. Il software del wallet può essere eseguito su un computer o un telefono cellulare (come "Bitcoin Core", "Electrum") o un dispositivo hardware dedicato (come "Trezor", "Ledger"). Il software del wallet permette l'autenticazione dell'utente e la gestione dei token. Con un wallet possiamo inviare token e controllare la avvenuta ricezione dei token che ci sono stati inviati. Ogni volta che si inviano token Bitcoin è necessario utilizzare un wallet per firmare la transazione con la propria chiave privata. In seguito, il saldo personale di token è aggiornato su tutte le copie del ledger, che è distribuito sulla rete P2P di computer.

Quando viene lanciato per la prima volta, un wallet Bitcoin genera una coppia di chiavi composta da una chiave privata e una chiave pubblica. In una prima fase, la chiave privata è un numero intero di 256 bit generato casualmente. La chiave pubblica è poi derivata matematicamente dalla chiave privata usando la crittografia a chiave ellittica. In una seconda fase, l'indirizzo della blockchain è derivato dalla chiave pubblica, usando un tipo diverso di funzione crittografica da quella usata per derivare la chiave pubblica, aggiungendo anche metadati come checksum e prefissi. Usare un diverso tipo di funzione crittografica per derivare l'indirizzo aggiunge un ulteriore livello di sicurezza: se il primo livello di sicurezza, la crittografia a chiave ellittica, venisse violato, qualcuno che ha la chiave pubblica sarebbe in grado di ottenere la chiave privata. Questo è importante, poiché la crittografia a chiave ellittica potrebbe essere particolarmente vulnerabile se i computer quantistici diventassero una realtà, mentre l'algoritmo di hashing, usato in un secondo livello per derivare l'indirizzo, non è altrettanto vulnerabile agli attacchi di forza bruta dei computer quantistici. Questo significa che se qualcuno ha l'indirizzo della blockchain, ed è in grado di violare la crittografia a chiave ellittica, dovrebbe ancora superare il secondo strato di sicurezza usato per ricavare l'indirizzo partendo dalla chiave pubblica. Questo è simile al motivo per cui bloccando la vostra bicicletta - quando la lasciate in strada - con due lucchetti che hanno meccanismi di chiusura diversi (chiave o serratura a numeri), ottenete un livello di sicurezza maggiore. Di conseguenza l'indirizzo agisce come un'impronta digitale della chiave pubblica, ma non fornisce alcuna informazione sulla chiave pubblica della persona (fino all’invio della prima transazione). Gli indirizzi Blockchain hanno una funzione simile a quella di un numero di conto corrente bancario nel contesto delle transazioni finanziarie tradizionali, o di un indirizzo email quando si invia un messaggio di posta elettronica.

Le firme digitali nella rete Bitcoin e in reti blockchain simili vengono eseguite utilizzando un wallet software. Simile a una firma scritta a mano, una firma digitale è usata per verificare che chi firma sia chi dice di essere. Se implementate correttamente, sono più difficili da falsificare rispetto alle firme scritte a mano. Le firme digitali sono in uso da decenni, soprattutto nel contesto di transazioni finanziarie, licenze software o software di gestione dei contratti. Nelle reti blockchain, le firme digitali sono utilizzate per l'autenticazione (prova della identità del mittente dei token) e l'integrità della transazione (cioè la quantità di token inviati). La chiave privata è usata per firmare le transazioni di token. La chiave pubblica è usata dai nodi validatori della rete per verificare la firma. In questo modo un wallet non può fingere di essere un altro wallet. Questo viene anche chiamato "non ripudio". In pratica, questo significa che una persona non può fingere di avere il controllo del nostro portafoglio, a meno che non abbia la nostra chiave privata.


Generation of keys and addresses


Tipologie di wallet e gestione delle chiavi

La chiave privata deve essere sempre tenuta segreta e non dovrebbe essere condivisa con altre persone a meno che non si voglia deliberatamente dar loro accesso ai nostri token. Considerando il funzionamento del processo in due fasi che permette di ricavare la chiave pubblica dalla chiave privata e l'indirizzo dalla chiave pubblica, è sufficiente fare il backup sicuro della sola chiave privata; tutto il resto può essere derivato dalla chiave privata con l'algoritmo crittografico usato nella rete. Se perdiamo l'accesso al nostro portafoglio, senza avere un backup della frase di partenza[^6] o della chiave privata, perderemo l'accesso ai tuoi token. I nostri token esisteranno ancora nella rete, ma non saremo in grado di accedervi.

Contrariamente a quanto spesso di crede, un wallet blockchain non memorizza alcun token. Memorizza invece solo la coppia di chiavi pubblica e privata associate al nostro indirizzo blockchain. Il wallet tiene anche traccia di tutte le transazioni in cui sono coinvolte le chiavi pubbliche in esso contenute, insieme ad altri dati. Pertanto, il termine wallet (letteralmente "portafoglio") è fuorviante. Sarebbe più appropriato il termine "portachiavi", in quanto agisce come luogo di conservazione sicura delle chiavi oltre che come strumento di comunicazione con la rete blockchain. Un wallet blockchain è più simile a un portachiavi che contiene le nostre chiavi di casa. Se perdiamo le chiavi del nostro appartamento, l'appartamento è ancora nostro ma non possiamo accedervi finché non recuperiamo la chiave; potremmo avere una chiave di riserva lasciata ad un vicino, un amico o un membro della famiglia, oppure dovremmo trovare un fabbro che ci aiuti a entrare in casa. Rompere la serratura è equivalente ad un attacco di forza bruta per indovinare la nostra chiave privata. Ci sono due diversi tipi di wallet, indicati con i temini custodial e non custodial:

**I wallet non custodial (controllati dall'utente)**o.ffrono all’utente stesso un controllo univoco e totale sui propri token. Le chiavi private sono sotto la sola custodia e responsabilità degli utenti e le transazioni sono firmate direttamente dai loro dispositivi. Con i wallet controllati dall'utente, tuttavia, l'utente diventa un unico punto di fallimento in caso di perdita o furto delle sue chiavi.

I wallet custodial (ospitati su un server) sono servizi di custodia, offerti da siti online di exchange, in cui il fornitore di servizi gestisce il wallet sui propri sistemi. Nella maggior parte dei casi anche le chiavi private relative al proprio wallet sono gestite da questi intermediari. Il software del wallet replica la chiave privata dell'utente in modo tale che una terza parte possa inviare transazioni per conto dell'utente stesso. Molte persone, quindi, preferiscono ospitare i loro token su siti di exchange e delegare a queste istituzioni fidate le responsabilità di gestione delle chiavi. Simili alle banche, questi servizi di exchange di token agiscono come custodi dei nostri fondi (per approfondire: Parte 3 - Exchange).

Una soluzione più autonoma al problema della perdita delle chiavi private è la cosiddetta "soluzione sociale di recupero delle chiavi", che prevede di nominare un insieme di amici fidati, membri della famiglia o istituzioni per confermare la vostra identità e permettere il recupero delle chiavi in un processo a più firme. Si potrebbero ad esempio nominare cinque persone di fiducia da contattare in caso di perdita della chiave privata. La procedura potrebbe essere configurata in modo che una maggioranza di tre su cinque di loro potrebbero consentire il recupero della nostra chiave privata utilizzando congiuntamente le loro chiavi private. In questo modo si scelgono con cura alcuni soggetti fidati, evitando di rappresentare un unico punto di fallimento. Se tuttavia queste persone si conoscono, potrebbero allearsi o essere corrotte per allearsi contro di noi. Al fine di consentire una vera economia P2P dei token, nella quale le persone possono inviare e ricevere token da wallet a wallet senza necessità di terze parti fidate, avremo bisogno di migliori soluzioni di gestione dei wallet, nelle quali l'individuo abbia “sovranità” sui propri token, mantenendo alti livelli di sicurezza e usabilità. Una soluzione meno sofisticata per il recupero delle chiavi è quella di creare automaticamente un backup su un servizio cloud come Google Drive. Pur essendo una soluzione assolutamente non consigliabile, sembra essere diventata, per motivi di convenienza, una tendenza per alcuni siti di exchange, come Coinbase.

Al momento della scrittura di questo libro la maggior parte dei wallet permette solo la gestione di un tipo di token, o in alcuni casi un numero limitato di token. Questo è dovuto al fatto che i diversi sistemi di ledger distribuiti non sono, per la maggior parte, interoperabili. La maggior parte dei sistemi di token hanno specifiche tecniche diverse, che dipendono dal tipo di ledger distribuito su cui sono emessi, e quindi richiedono uno sviluppo personalizzato del wallet. Sviluppare wallet compatibili multi-ledger richiede molto tempo e costi elevati. La compatibilità multi-ledger inoltre comporta una dimensione del software del wallet molto maggiore. Un altro aspetto della progettazione di un wallet è il fatto che il wallet (in combinazione con il ledger distribuito sottostante) consenta la co-firma delle transazioni. Molte reti blockchain, come Ethereum, non permettono transazioni native con più firme. Nel caso di Ethereum questo si può risolvere utilizzando uno smart contract, cosa che in passato ha creato problemi di sicurezza.

Le firme ad anello, le firme collettive e la "condivisione del segreto di Shamir"[^7] sono tutti esempi di algoritmi crittografici alternativi che devono essere abilitati dalle reti blockchain e supportati dal software del wallet per consentire la co-firma delle transazioni. Le co-firme sono una caratteristica importante che permette di trasferire la custodia dei token ad altri (una banca o un sito di exchange che gestiscono i token), la gestione collettiva dei beni (nei casi di proprietà collettiva di uno stesso bene o di gestione collettiva come nel caso di una DAO, Decentralized Autonomous Organization), o il recupero sociale delle chiavi. I successivi capitoli 3 e 4 approfondiranno gli aspetti della gestione dei token e dei casi d'uso dei token, dove il ruolo dei wallet diventerà più chiaro ed evidente.


DigitalSignatures BlockchainWallets


Invio di Token

Se Alice vuole inviare dei token Bitcoin a Bob, utilizza un wallet per autenticarsi, specifica la quantità che vuole inviare e indica l'indirizzo di Bob. Il suo wallet trasmette la transazione a tutti i computer della rete. Ogni computer della rete può così controllare se la transazione è valida, secondo le regole della rete. I passi sono i seguenti:

  • Alice usa un wallet che gestisce la sua chiave privata. Eseguendo operazioni matematiche standard, il wallet può ricavare dalla chiave privata la sua chiave pubblica e il suo indirizzo
  • Se Alice vuole inviare dei token a Bob, usa il suo wallet per creare una transazione che include tutti i dettagli necessari e la sua chiave pubblica. Alice deve specificare l'indirizzo di Bob e il numero di token che vuole inviare. Successivamente Alice crea e inserisce la firma digitale di questa transazione, ovvero un hash (calcolato anch’esso dal wallet).
  • Per provare al resto della rete che lei è la proprietaria dell'indirizzo e quindi dei token, Alice firma l'hash con la sua chiave privata (operazione eseguita automaticamente dal suo wallet).
  • Alice ora trasmette questa transazione ad uno qualsiasi dei computer della rete: invia sia la transazione in chiaro sia l'hash firmato (eseguito automaticamente dal wallet).
  • Ogni computer della rete che riceve la transazione può verificare a questo punto la validità della transazione. Userà la chiave pubblica di Alice per verificare matematicamente se l'hash firmato è stato davvero firmato da lei. Applicherà le operazioni di hashing alla transazione (che è leggibile) verificando di ottenere lo stesso valore hash. Potrà anche usare la chiave pubblica di Alice per verificare se l'hash firmato è stato davvero firmato da lei.
  • Dopo aver confermato tutti questi dettagli, le transazioni convalidate vengono memorizzate in un blocco e sottoposte ad hash. Il blocco viene inviato alla rete per ottenere il consenso di tutti i nodi partecipanti. Questo blocco diventa parte del ledger aggiornato se gli altri computer della rete convalidano il numero di hash riportato nel blocco. Questo processo di creazione di nuovi blocchi di transazioni è soggetto al meccanismo di consenso detto Proof-of-Work (nel prossimo capitolo sono riportate maggiori informazioni sul meccanismo della Proof-of-Work).

Tutti i nodi della rete modificheranno il loro ledger come conseguenza della creazione di questo ultimo blocco, certificando che Bob ora possiede i fondi che Alice gli ha inviato. Questa transazione diventa parte dello stato universale della rete Bitcoin ed è resistente alle manomissioni. Le informazioni sul ledger possono essere alterate, ma a costi proibitivi (maggiori informazioni sono riportate nel prossimo capitolo)

Riassunto del capitolo

La crittografia è la pratica e lo studio della comunicazione sicura in presenza di terzi. L'obiettivo è quello di creare sistemi di informazione che siano resistenti alle intercettazioni, alla manipolazione e ad altre forme di attacco.

La crittografia nelle reti blockchain permette la trasparenza delle interazioni mantenendo la privacy di tutti gli attori della rete.

La crittografia a chiave pubblica è usata per provare la propria identità con due chiavi crittografiche, una chiave privata e una chiave pubblica, che in combinazione con una transazione creano la nostra firma digitale. Questa firma digitale prova la proprietà dei nostri token e ci permette di controllarli attraverso un software chiamato "wallet".

In modo simile ad una firma apposta manualmente, la firma digitale è usata per verificare che chi firma sia chi dice di essere. In Bitcoin e in altre blockchain, le firme digitali sono funzioni matematiche che fanno riferimento a uno specifico indirizzo del wallet che gestisce i nostri token su una blockchain.

Una funzione hash è un algoritmo matematico che può prendere qualsiasi tipo di input, come una stringa, un file di testo o un file immagine, e trasformarlo in una stringa di output di dimensioni fisse chiamata hash. È una funzione unidirezionale, il che significa che l'unico modo per ricreare i dati di input originali (messaggio) dall'hash è provare ad applicarlo a tutte le possibili combinazioni di dati in ingresso per vedere se producono il risultato atteso. Anche se questo è possibile, richiede molto tempo ed è estremamente costoso.


Riferimenti e approfondimenti

* Alonso, Kurt M.: “Zero to Monero: First Edition a technical guide to a private digital currency; for beginners, amateurs, and experts”, June 26, 2018 (v1.0.0): https://www.getmonero.org/library/Zero-to-Monero-1-0-0.pdf

* Antonopoulos, Andreas M.: “Mastering Bitcoin: Programming the Open Blockchain”, O’Reilly, 2017

* Becket, B.: “Introduction to Cryptology”, Blackwell Scientific Publications, 1988

* Ben-Sasson, Eli;Chiesa, Alessandro; Garman, Christina; Green, Matthew; Miers, Ian; Tromer, Eran; Virza, Madars: „Zerocash: Decentralized Anonymous Payments from Bitcoin“ May 18, 2014 (extended version): http://zerocash-project.org/media/pdf/zerocash-extended-20140518.pdf

* Ben-Sasson, Eli; Chiesa, Alessandro; Tromer, Eran; Virza, Madars: “Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture”, February 5, 2019 (updated version): https://eprint.iacr.org/2013/879.pdf

* Boyle, David: “The Little Money Book”, Alastair Sawday Publishing, 2003

* Buterin, Vitalik: “Bitcoin Is Not Quantum-Safe, And How We Can Fix It When Needed”: https://bitcoinmagazine.com/articles/bitcoin-is-not-quantum-safe-and-how-we-can-fix-1375242150/

* Buterin, Vitalik: “Privacy on the Blockchain”, January 2016: https://blog.ethereum.org/2016/01/15/privacy-on-the-blockchain/

* Castryck, Wouter: “ELLIPTIC CURVES ARE QUANTUM DEAD, LONG LIVE ELLIPTIC CURVES”, n COSIC Cryptography Blog, 31/05/2017: https://www.esat.kuleuven.be/cosic/elliptic-curves-are-quantum-dead-long-live-elliptic-curves/

* Esslinger, Bernhard: “The CrypTool Script: Cryptography, Mathematics, and More”, 10th edition, distributed with CrypTool version 1.4.30: https://web.archive.org/web/20110722183013/http://www.cryptool.org/download/CrypToolScript-en.pdf

* Flannery, Sarah; Flannery, David: “In Code: A Mathematical Journey”, Workman Publishing Company, 2001

* Goldreich, Oded: “Foundations of Cryptography” Cambridge University Press, 2001

* Ito, Joi: “Our response to „A Cryptocurrency Without a Blockchain Has Been Built to Outperform Bitcoin“, Dec. 20, 2017: https://www.media.mit.edu/posts/iota-response/

* Katz, Jonathan; Lindell, Yehuda: “Introduction to Modern Cryptography”, Chapman & Hall/CRC, Cryptography and Network Security Series, 2nd Edition, 2014

* Nakamoto, Satoshi: “Bitcoin: A Peer-to-Peer Electronic Cash System”, 2008: https://bitcoin.org/bitcoin.pdf

* Narula, Neha: “Cryptographic vulnerabilities in IOTA”, September 7, 2017 https://medium.com/@neha/cryptographic-vulnerabilities-in-iota-9a6a9ddc4367

* Narula, Neha:“IOTA Vulnerability Report: Cryptanalysis of the Curl Hash Function Enabling Practical Signature Forgery Attacks on the IOTA Cryptocurrency”, 7 September, 2017: https://github.com/mit-dci/tangled-curl/blob/master/vuln-iota.md

* N.N.: “Bitcoin”, Github repository: https://github.com/bitcoin

* N.N.: “Bitcoin Core”, Github repository, https://github.com/bitcoin/bitcoin

* N.N.: “Bitcoin Core Integration”, Staging tree: https://bitcoincore.org/en/download

* N.N.: “Mimblewimble Protocol”, Github Archives: https://github.com/mimblewimble/grin/blob/master/doc/intro.md

* N.N.: Monero Research Lab, Technical Resources: https://ww.getmonero.org/resources/research-lab/

* N.N.: “Post-Quantum Cryptography” Information Technology Laboratory, COMPUTER SECURITY RESOURCE CENTER: https://csrc.nist.gov/projects/post-quantum-cryptography/round-1-submissions

* Prasanna: “Litecoin To Implement Mimblewimble”, Altcoin News, February 8, 2019: https://cryptoticker.io/en/litecoin-implement-mimblewimble/

* Rogaway, Phillip; Bellare, Mihir: “Introduction to Modern Cryptography”, May 11, 2005: http://web.cs.ucdavis.edu/~rogaway/classes/227/spring05/book/main.pdf

* Schär, Fabian; Berentsen, Aleksander: “Bitcoin, Blockchain und Kryptoassets: Eine umfassende Einführung”, Books on Demand, 2017

* Schor, Lukas: “On Zero-Knowledge Proofs in Blockchains”, Argon Group, March 2018: https://medium.com/@argongroup/on-zero-knowledge-proofs-in-blockchains-14c48cfd1dd1

* Stallings, William: “Cryptography and Network Security: Principles and Practice”, Prentice Hall, 6th ed., 2013

* Stolbikova, Veronika: „Can Elliptic Curve Cryptography be Trusted? A Brief Analysis of the Security of a Popular Cryptosystem“, ISACA Journal Volume 3, 2016 https://www.isaca.org/Journal/archives/2016/volume-3/Pages/can-elliptic-curve-cryptoraphy-be-trusted.aspx

* Tibco, Nelson Petracek: “What zero-knowledge proofs will do for blockchain”, Venturebeat, Dec 16, 2017: https://venturebeat.com/2017/12/16/what-zero-knowledge-proofs-will-do-for-blockchain/

* Wetzel, Tyler: “Understanding the Jargon of the Blockchain and Cryptocurrency World” Medium, Aug 23, 2018: https://medium.com/@twwetzel76/understanding-the-jargon-of-the-blockchain-and-cryptocurrency-world-64b5f431bcd5

* Wikipedia contributors, "Cryptography," Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/wiki/Cryptography (accessed Jun 10, 2017).

* Wikipedia contributors, "Digital signature," Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/wiki/Digital_signature (accessed Jun 10, 2017).

* Wikipedia contributors, "Cryptographic hash function," Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/wiki/Cryptographic_hash_function (accessed Jun 10, 2017).

* Young, Joseph: “Anonymous Cryptocurrencies: Why Edward Snowden Supports Zero-Knowledge Proofs”, January 2018: https://journal.binarydistrict.com/anonymous-cryptocurrencies-why-edward-snowden-supports-zero-knowledge-proofs/

* Bitcoin Core: https://bitcoin.org/de/download

* Electrum: https://electrum.org/

* Ledger: https://www.ledger.com/

* Monero: https://getmonero.org/

* Mimblewimble: https://github.com/mimblewimble/grin/blob/master/doc/intro.md

* Trezor: https://trezor.io/

* Zcash: https://z.cash/


Notes

[^1]: Mentre la crittografia a curva ellittica fornisce lo stesso livello di sicurezza dell'RSA, ha bisogno di meno calcoli e di chiavi più piccole, riducendo così i requisiti di memorizzazione e trasmissione. Consente quindi di ridurre i requisiti di memorizzazione e trasmissione.

[^2]: La crittografia zero-knowledge proofs permette la convalida delle informazioni senza rivelare tali informazioni con il verificatore di tali informazioni.

[^3]: Le firme ad anello possono essere utilizzate per offuscare l'identità dei proprietari di token, combinando un gruppo di firme digitali parziali da varie transazioni inviate da diversi utenti, per formare una firma unica che viene utilizzata per firmare una transazione._

[^4]: Le funzioni di hashing prendono un input di lunghezza arbitraria e restituiscono un output apparentemente casuale ma di lunghezza fissa. Quando più di un input si risolve nello stesso output, seri problemi possono derivare da tale collisione. Un team di ricercatori del MIT e della Boston University ha trovato esattamente queste falle nella funzione IOTA Curl. Mentre il team IOTA ha corretto tali vulnerabilità, hanno affermato che questi difetti sono stati introdotti di proposito, il che è stato altamente criticato dalla comunità open-source.

[^5]: Puoi calcolare valori hash utilizzando questo link: https://www.browserling.com/tools/all-hashes

[^6]: Una frase seme o di partenza, chiamata anche "seme mnemonico", è un metodo per legare le chiavi private con una combinazione di parole facile da ricordare, che può essere fornita e gestita dal wallet. "Mnemonica" è una tecnica di mappatura che aiuta a riprodurre, utilizzando parole casuali di facile memorizzazione, qualcosa che è molto difficile da ricordare.

[^7]: La Condivisione del Segreto di Shamir è un algoritmo crittografico che divide un segreto (chiave) in parti, distribuendo frammenti del segreto a diverse persone. Per ricostruire il segreto, tutti i frammenti devono essere disponibili. Nella configurazione "a soglia", solo un certo numero di parti è necessario per ricostruire il segreto.

⚠️ **GitHub.com Fallback** ⚠️