I Bitcoin sono sicuri? Ecco cos'è la crittografia

Qualche giorno fa abbiamo appreso della notizia del furto di un valore equivalente a 50000 Bitcoin ai danni di Coincheck, società Giapponese di mediazione di moneta virtuale.

Ma come si fa a proteggere una moneta virtuale? Bitcoin, Ethereum e le altre criptovalute sono sicure? Cerchiamo di capire cosa c'è dietro questo mondo attraverso la crittografia, da cui deriva appunto il termine criptomoneta o criptovaluta.

La crittografia

La crittografia nasce dalla necessità di cifrare, mascherare, ovvero rendere incomprensibile una informazione a chiunque non ne conosca la chiave di lettura.
Le criptovalute sono di conseguenza una moneta virtuale le cui informazioni vengono criptate attraverso evoluti algoritmi che andremo a vedere tra poco, il cui scopo è quello di rendere unica ogni transazione e unico ogni bit virtuale generato, sia esso Bitcoin, Ethereum, Ripple, Litecoin o qualunque altra criptovaluta, sfruttando una tecnologia a blocchi definita Blockchain.

Immaginiamo la lingua dei segni utilizzata dai sordomuti: per molte persone sono soltanto gesti incomprensibili, una sorta di messaggio cifrato. Lo stesso discorso si può applicare al braille per i ciechi.
I messaggi che due persone si inviano attraverso questi linguaggi sono per noi “crittografati”.
E se proprio vogliamo trovare un esempio comune a chiunque ci basta pensare alle varie lingue e scritture che differenziano ogni cultura e paese.
Per un occidentale le frasi scritte in Coreano, Giapponese o Cinese sono rappresentate da caratteri talmente complessi da risultare difficili da ricopiare persino avendo l'originale davanti per un occidentale.

Di conseguenza noi abbiamo a che fare con la crittografia quotidianamente, anche quando il signore anziano del terzo piano ci parla in dialetto stretto. Ma a differenza della crittografia di cui parleremo tra poco però, i casi precedenti non nascono per impedire a qualcuno di comprendere il nostro messaggio, per cui sono tutti assolutamente decifrabili e inefficaci per comunicarsi dati sensibili come ad esempio quelli della propria carta di credito. Per il linguaggio dei segni la chiave può essere ad esempio il “dizionario”, così come per il braille o una qualunque lingua di uso comune. Ad ogni concetto, parola o lettera viene associato un equivalente valore, simbolo o gesto.
Un esempio di "crittografia a chiave segreta" (passatemi il termine) è il GESTUNO, un insieme di 1500 segni comuni per tutti i sordomuti del pianeta che permette a due sordomuti di parlare tra loro anche se provengono da due parti del mondo che in origine parlano lingue diverse.

Per le lingue tuttavia la “conversione” ovvero la traduzione è leggermente più complessa, essendoci un fattore di interpretabilità, soprattutto se ci affidiamo a sistemi inaffidabili come le traduzioni automatiche di Google Translate, come in questo esempio:

TESTO ORIGINALE: Per andare a lavoro di solito uso la bici elettrica, ma durante l'inverno ci vado in slittino.
TRADUZIONE (codifica): I usually use an electric bike to go to work, but I go sledding in winter.
RECUPERO DEL TESTO: Di solito uso una bicicletta elettrica per andare a lavoro, ma vado a fare slittino in inverno.

Un solo passaggio e i dati sono irrimediabilmente compromessi.

Tutto questo ci aiuta a capire quanto sia importante il modo in cui criptiamo una informazione e come sia indispensabile per il destinatario essere in possesso della chiave corretta per decifrarlo.

Cosa rende una crittografia sicura?

Alla base di qualunque crittografia c'è da sempre una funzione matematica, più o meno complessa. Cercherò di rendere i concetti che seguono quanto più semplici possibile.

Giulio Cesare utilizzava un semplice metodo definito anche Cifrario di Cesare, che si limitava a spostare di n posizioni ogni lettera ed a eliminare gli spazi tra le parole.
In questo caso le posizioni erano 3:

Struttura del cifrario di CesareStruttura del cifrario di Cesare

La frase “Ciao sono in Svizzera” diventa “FLDRVRQRLQVYLCCHUD”.
Questo tipo di crittografia si chiama crittografia simmetrica in quanto prevedere l'esecuzione delle operazioni nell'ordine semplicemente inverso a quello usato per criptare il messaggio.
Diversamente la crittografia asimmetrica fa sì che le operazioni da fare per recuperare l'informazione sono diverse da quelle usate per codificare il messaggio.

Questo sistema decisamente banale è stato utilizzando anche in tempi moderni da Provenzano per i suoi pizzini, con l'evoluzione per cui anziché scrivere la lettera spostata di 3 posizioni, ne scriveva l'equivalente posizione in numero.
La parola “Ciao” diventava quindi “FLDR” per cui “39115”. Questa è solo una delle evoluzioni del Cifrario di Cesare, di cui esiste anche la variante definita ROT-13 che sposta ogni lettera 13 posizioni avanti (facendo riferimento all'alfabeto internazionale di 26 lettere, comprendendo quindi le lettere K,J,W,X,Y).

Consolidato che la Cifratura di Cesare non è più un algoritmo affidabile sono nate nel tempo crittografie molto più evolute con alla base calcoli matematici che richiedono potenze di calcolo sempre maggiori, tali da vanificare il beneficio di aver decifrato il messaggio in tempo.

Per effettuare un pagamento on line ad esempio, dovrò comunicare al sito web i miei dati della carta di credito: numero della carta, intestatario, cvv, data di scadenza.

Le carte di credito hanno infatti una scadenza: solitamente 4 anni.
Una crittografia così complessa da richiedere più di 4 anni per essere decodificata è più che sufficiente per vanificare l'eventuale decodifica del messaggio cifrato arrivata ad esempio 15 anni dopo, perchè la carta di credito sarà già scaduta.

Tuttavia rimane un problema...

Come facciamo a comunicarci la chiave di cifratura da usare?

Sfrutto l'esempio dei lucchetti in quanto è sicuramente il più semplice per comprendere il concetto:

  1. A mette 100 euro in una scatola destinata a B e la chiude con un lucchetto.
  2. B riceve la scatola e aggiunge un proprio lucchetto alla scatola e la rimanda ad A.
  3. A toglie quindi il proprio lucchetto e rimanda la scatola a B che potrà finalmente aprirla.

Nella realtà questa operazione non richiede lo scambio di chiavi in quanto ognuno apre sempre e solo il proprio lucchetto, ma la versione digitale di questa operazione non è purtroppo fattibile:

Criptando il messaggio con la chiave di A e inviandolo a B, questo non potrà solo aggiungere una sua chiave ma incapsulerà lo stesso contenuto di A, rendendolo inaccessibile ad A.

Per darvi prova di quanto appena spiegato utilizzeremo due metodi di codifica differenti: Base64 Encode/Decoder e Hex Encode/Decoder, immaginando che le due parti non conoscano la crittografia utilizzata dal mittente.

ESEMPIO:

Messaggio = "ciao"
Utente A codifica la parola "ciao" con il Base64 Encode ottenendo: Y2lhbw==
B
riceve il messaggio codificato e ne aggiunge la propria codifica utilizzando Hex Encode, ottenendo: 59326C6862773D3D
Il messaggio verrà ora restituito all'utente A che proverà ad applicare il Base64 Decoder con esito NEGATIVO.

Questo avviene perché l'unico modo per riuscire a recuperare il messaggio iniziale, "ciao", è eseguendo il processo di decodifica nel verso esattamente contrario a quello della codifica, da cui ne deriva il termine Crittografia SIMMETRICA.

Una soluzione immediata per il problema visto qui sopra può essere far sì che B invii il lucchetto aperto ad A (non serve un canale protetto in quanto al massimo perderemo il lucchetto).

ESEMPIO:

A chiuderà la scatola direttamente con il lucchetto di B e quindi B potrà aprirla.

Non è quindi sufficiente l'utilizzo di una chiave privata segreta per cifrare in modo sicuro un messaggio digitale, ma occorre anche la presenza di una chiave pubblica a tutti nota.

Nella realtà tutto è molto semplice ma sul web occorre tradurre in modo matematico quanto appena descritto.

Ho introdotto il concetto di CHIAVE PRIVATA e CHIAVE PUBBLICA in quanto insieme saranno lo strumento che permetterà di completare l'operazione descritta qui sopra in modo definitivo.

Possiamo definire CHIAVE PUBBLICA il Lucchetto APERTO di B e CHIAVE PRIVATA (conosciuta solo da B) la chiave con cui si può aprire il lucchetto di B.

Le motivazioni matematiche per cui da chiave pubblica non sarà invece possibile ricavare la chiave privata sono costretto a saltarla data la complessità dei calcoli logaritmici necessari a giustificare questa affermazione (complessi persino per un elaboratore), ma vi invito a considerarlo concetto consolidato.

Per sfruttare questo mezzo di comunicazione si sfrutta l'algoritmo di Diffie-Hellman.

L'algoritmo di Diffie-Hellman

Questo sistema non è una vera crittografia, bensì un metodo per lo scambio della chiave di cifratura tra due soggetti, ovvero il sistema che i due interlocutori utilizzeranno per criptare i propri messaggi.
Per tale operazione si sfrutta la funzione “mod” che come risultato restituirà il resto di una divisione (es. 5 mod 2 = 1).

ESEMPIO:

Premessa: definirò Apk e Bpk “chiavi pubbliche” per introdurre meglio il concetto che verrà spiegato tra poco insieme alla CRITTOGRAFIA ASIMMETRICA a CHIAVE PUBBLICA, ma in realtà sono semplicemente due valori noti all'interno dell'operazione.

Apk = chiave pubblica di A = 5
Bpk = chiave pubblica di B = 23
Ak = chiave privata di A = 6
Bk = chiave privata di B = 15
A = ApkAk mod Bpk = 56 mod 23 = 8
B = ApkBk mod Bpk = 515 mod 23 = 19
A questo punto le due parti si scambiano i risultati ottenuti ed eseguono una operazione che restituirà loro lo stesso risultato:
A esegue: K = BAk mod Bpk = 195 mod 23 = 2
B esegue: K = ABk mod Bpk = 815 mod 23 = 2

A seguito dell'introduzione di questa forma di calcolo divenne necessario evolvere il mondo della crittografia: questa evoluzione attualmente in uso si chiama CRITTOGRAFIA ASIMETTRICA a CHIAVE PUBBLICA, cifratura che quotidianamente utilizzate per esempio quando inviate messaggi ai vostri amici su Whatsapp, definita anche Crittografia End-To-End.

L'algoritmo di Diffie-Hellman emula il metodo del lucchetto aperto descritto poco fa.

Ogni utente avrà quindi una chiave privata e una chiave pubblica, strettamente legate tra loro.
Nonostante il legame diretto che lega le due chiavi, dalla chiave privata è possibile ricavare la chiave pubblica ma non viceversa. È al momento impossibile infatti, per qualunque elaboratore, eseguire il calcolo inverso.

Se siete arrivati a questo punto della lettura comprenderete immediatamente come il processo consisterà nel cifrare il messaggio da inviare utilizzando la chiave pubblica del destinatario, che di conseguenza sarà l'unico in grado di decifrarlo attraverso la propria chiave privata di cui solo lui è a conoscenza.

Possiamo fare quindi con una rapida osservazione, di cui potete trovare approfondimenti nei documenti che vi suggerirò alla fine dell'articolo:

CRITTOGRAFIA SIMMETRICA: ha il vantaggio di essere un metodo rapido ma richiede un mezzo sicuro per la trasmissione della chiave.

CRITTOGRAFIA ASIMMETRICA: estremamente sicura, non necessità uno scambio di chiavi in segreto ma richiede una maggiore potenza di calcolo per essere gestita, e di conseguenza è più lenta.

Spesso viene adottata una CRITTOGRAFIA IBRIDA:

  • la chiave di codifica viene trasmessa attraverso la CRITTOGRAFIA ASIMMETRICA
  • le informazioni gireranno con CRITTOGRAFIA SIMMETRICA adottando la chiave definita “in privato”.

La firma digitale

Concludo parlandovi velocemente della firma digitale, strumento che serve a garantire l'autenticità o paternità che dir si voglia di un messaggio e la sua integrità attraverso una funzione di hash che ne crea un vera e propria impronta digitale.
Utilizzando quindi termini che avete appreso durante questa lettura vi riassumo in cosa consiste la firma digitale:

L'utente A codifica la sua identità con la propria CHIAVE PRIVATA.
L'utente B riceverà quindi un messaggio crittografato da A.
L'utente B per verificare che il messaggio sia stato realmente creato da A, utilizzerà la CHIAVE PUBBLICA di A per decodificare la firma.
Se il messaggio è stato realmente creato da A, la decodifica avrà esito positivo, altrimenti B comprenderà che il mittente sta inviando un falso.

Questo perché come detto in precedenza, dalla chiave privata possiamo ricavare la chiave pubblica ma non è al momento calcolabile il contrario (quantomeno in tempi utili).

Il mondo della crittografia è in continua evoluzione e da SHA-1 si è passati a SHA-2 (tra cui il SHA-256 sfruttato dal Bitcoin), e da tempo si sta discutendo sullo standard SHA-3 per rendere ancora più complesso l'algoritmo di codifica.
Questo ultimo tema della firma digitale tornerà fuori nel prossimo articolo dedicato alle criptovalute e al mining di Bitcoin, Ethereum e delle altre criptomonete.

APPROFONDIMENTI

Crittografia asimmetrica a chiave pubblica (documento PDF dell'Università degli Studi di Udine)
Cos'è il Gestuno
Cifrario di Cesare
Cifra il tuo messaggio con il Cifrario di Cesare
ROT-13
Crittografia asimmetrica
Algoritmo di Diffie-Hellman
Funzione crittografica di Hash
Le più comuni crittografie sul web