Lo scopo di questo post è di essere un’introduzione a un meccanismo crittografico fondamentale in gioco nella criptovaluta. Se ti sei chiesto come funzionano le criptovalute sotto il cofano, ma non hai avuto il tempo di ricercarle per qualsiasi motivo, allora spero che questo post sia informativo e divertente per te. Ai fini di questo post mi riferirò all’uso di ethereum come esempio solo per mia familiarità. Dovrei anche notare che mentre mi sono preso il tempo per fare ricerche su questo prima di postare, la crittografia è un campo super interessante di cui non sono un esperto. Mi piace usarlo e ne sono appassionato, ma da un punto di vista matematico sto ancora imparando. Se ci sono errori, sentiti libero di gridarlo in un commento qui sotto.
Per chi non lo conosce, è facile presumere che la crittografia sia la crittografia nelle criptovalute. Crittografia, ovvero l’atto di trasformare un messaggio in un codice destinato solo a essere decodificato da un pubblico specifico. Potrebbe essere allettante per le nuove persone vedere un hash di transazione grezzo e pensare che lo strano fascio di lettere risultante che inizia con 0x sia la crittografia in crittografia e chiamalo un giorno. Considera per un momento, tuttavia, che chiunque può decifrare quei messaggi (se conosci già la differenza tra crittografia e codifica, scoprilo con me). Se sono tutti leggibili e non nascosti in base alla progettazione, allora qual è il vero senso di tutto questo? Diamo un’occhiata alla seguente transazione grezza:
0xf901a1808459682f07831e8480949901ead10f6a379758c866febf9ad62184bfa643843b9aca00b901374e6f742065766572792077616c6c657420616c6c6f777320796f7520746f20696e636c75646520796f7572206f776e20646174612c2062757420746865206162696c697479206973206275696c7420696e746f20657468657265756d2e20596f75206a7573742074616b6520796f7572206d65737361676520616e6420636f6e766572742069742066726f6d205546543820746f2068657861646563696d616c2e20554654206973206772656174206265636175736520796f752063616e20696e636c7564652063686172616374657273207375636820617320e697a5e69cace8aa9e20666f72206578616d706c652e0a0a416e797761792c204920686f7065207468617420736561726368696e6720666f722074686973206561737465722065676720696e206d7920706f7374207761732066756e2e2ea0b02c1518b611a5a0bec7ab7aec4629730d9c437ed0dd7b752113741ced9a73b2a049b9221c1780e956a7f565889bca08859c794dafeb60846462782385d1d8f72b
Quello strano elenco di numeri e lettere si chiama esadecimale ed è un modo per scrivere quello che vuoi usando un sistema in base 16.
In questo sistema il numero 0x1 è 1 nel nostro sistema in base 10, 0xF = 15 e 0x10 = 16.
Perché usare questo sistema? Perché è molto più facile da scrivere rispetto al semplice binario e anche molto più compatto. È più conveniente rappresentare questi dati in un formato che utilizza meno caratteri, ma è anche facilmente convertibile in binario.
Un messaggio UFT-8 in esadecimale può essere letto da chiunque. Tuttavia, il messaggio ethereum non è UFT-8.
Ciò in cui consiste effettivamente il messaggio di ethereum è un messaggio strutturato che viene firmato e quindi codificato con RLP. Questo viene quindi convertito in byte e scritto in esadecimale. RPL è progettato per essere una strada a doppio senso. La struttura del messaggio è la seguente:
nonce: #the sequential number of this transaction from the pov of the from address
gasPrice:
gasLimit:
to:
value: # the value of the transaction
data: # the data included as part of the transaction
v:
r:
s:
Con queste informazioni chiunque può decodificare il messaggio. L’esempio che ho fornito può essere decodificato da https://antoncoding.github.io/eth-tx-decoder/ per esempio (nessuna affiliazione, ho solo pensato che la sua pagina statica fosse interessante e conveniente per dimostrare un punto). Questo sito Web di decodifica è solo un’app nel browser e funzionerà offline. Questo illustra il punto in cui questo può essere decodificato da chiunque con relativa facilità, senza necessità di rete.
Il fatto è che questi messaggi sono progettati per essere decodificati. Se non fossero decodificabili da tutti, niente di tutto questo funzionerebbe. Vedi e fino ad ora abbiamo lavorato con la codifica e la decodifica, che consiste semplicemente nel trasferimento da un formato all’altro. Finora non abbiamo crittografato nulla. Né noi.
La vera magia della crittografia avviene con i valori v,r,s. Queste tre variabili insieme formano la firma della transazione. Per le transazioni ethereum, il messaggio viene firmato prima della codifica rlp, ma aggiunge semplicemente questi tre campi. Puoi decodificare tramite RPL e ottenere tutti i campi senza alcuna conoscenza avanzata della firma. ECDSA è progettato in modo che ogni transazione e messaggio firmato abbia un modo integrato per ottenere la chiave pubblica (e nel caso della criptovaluta l’indirizzo del portafoglio di quella chiave).
Usando questi 3 valori insieme al resto del messaggio puoi calcolare la chiave pubblica. La chiave pubblica, se scritta in esadecimale, contiene l’indirizzo del portafoglio. Quindi, se riesci a calcolare una chiave pubblica che contiene l’indirizzo del portafoglio per questa transazione, hai la prova che è stata firmata dalla chiave privata corretta.
Il meccanismo su come funziona è chiamato algoritmo di firma digitale a curva ellittica (ECDSA). ECDSA è fantastico e un po’ complesso. Il problema è che hai una curva su un grafico, valori xey, e ci sono regole per spostare i punti su questa curva. La tua chiave privata è il numero di passaggi che muovi quando interagisci con questo schema. Il messaggio è stato convertito in un numero che può essere rappresentato su questo grafico, quell’hash è conoscibile da tutti perché come abbiamo mostrato lo abbiamo già e possiamo decostruirlo (è così che abbiamo ottenuto i valori per v,r,s) . Anche la chiave pubblica è un punto su quel grafico. Ecco una rappresentazione visiva della curva:

Curva ECDSA
Il gaph utilizza un campo finito, quindi se un numero è molto grande, viene semplicemente riprodotto su un asse ogni volta che supera la dimensione massima del campo. Quando una chiave privata firma un messaggio, prende l’hash del messaggio, un punto di partenza, un numero segreto molto grande (K) e poi lo usa per calcolare i valori r e s (sono stati aggiunti v valori per ethereum per selezionare quale dei possibili chiavi [yes ECDSA creates two public keys, you gotta pick one] per utilizzare e proteggere e contro gli attacchi di riproduzione incrociata[by using two different numbers per chainId]).
Qualcosa di interessante, ed estremamente importante, è che quel valore K deve essere sempre unico. Quel valore K, anche il numero molto grande segreto, se mai usato due volte fornisce informazioni sufficienti per calcolare la chiave segreta. Sony ha utilizzato lo stesso valore su un sacco di firme ed è stato facilmente violato di conseguenza, credo nel 2011.
La cosa interessante qui è che la nostra chiave segreta è solo il numero di passaggi utilizzati per firmare il messaggio e finché K è univoco ogni volta, la firma conterrà sempre informazioni sufficienti per rivelare la chiave pubblica corrispondente. È divertente pensare che il numero di passaggi sia una chiave segreta, ma ha senso. Se hai un grafico pieno di punti della trama apparentemente casuali e hai a che fare con una vasta gamma di numeri, chiedendo quanti passaggi sono necessari per passare da un punto all’altro, è molto difficile da calcolare, a meno che tu non sappia già:

Mi è piaciuto prendermi il tempo per organizzare i miei pensieri su questo argomento e scriverlo. Spero che sia stato divertente e informativo per almeno alcune persone là fuori. Fammi sapere se hai trovato il mio secondo messaggio “nascosto” in questo post.
Fonti / Letture aggiuntive:
https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f
https://medium.com/mycrypto/the-magic-of-digital-signatures-on-ethereum-98fe184dc9c7
https://github.com/ethereumjs/rlp https://github.com/ethereumjs/ethereumjs-util
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-accounts.html
Video:
https://youtu.be/NmM9HA2MQGI (Secret Key Exchange (Diffie-Hellman) – Computerphile)
https://youtu.be/NF1pwjL9-DE (Curve ellittiche – Computerphile)
https://youtu.be/dCvB-mhkT0w (Panoramica della crittografia a curva ellittica)
https://youtu.be/QzUThXGRFBU (Elliptic Curve Digital Signature Algorithm ECDSA | Part 10 Cryptography Crashcourse)
https://youtu.be/6FlK3AZTz5k (Curve ellittiche ed ECDSA – Bitcoin, Blockchain e Cryptoassets)