Qual è il metodo per voi più sicuro per generare, memorizzare e conservare una chiave privata?
Il modo più "semplice" (dal punto di vista logico, non pratico) di creare una chiave sarebbe quello di lanciare 256 volte una moneta perfettamente simmetrica, ottenendo una stringa lunga 256 caratteri del tipo 10011100011100....
Ovviamente questo metodo ha tra gli altri il grosso svantaggio derivante dal fatto che la memorizzazione del risultato per un essere umano è praticamente impossibile.
Visto che il dato deve stare su un supporto che sia potenzialmente indistruttibile (no file su hard disk/chiavette, no foglio di carta, niente di fisico) e deve essere facilmente recuperabile all'occorrenza, perchè non utilizzare i dati presenti nella blockchain stessa?
Nella blockchain sono presenti decine di milioni di indirizzi utilizzati almeno una volta (sui circa 2^160 possibili). Questi indirizzi sono in qualche modo messi in relazione tra loro mediante le transazioni che modificano le associazioni indirizzi/bitcoin. Le transazioni sono memorizzate in blocchi. Ci sono al momento circa 450k blocchi e centinaia di milioni di transazioni.
L'idea è quella di selezionare, all'interno di questo enorme "vocabolario", alcune parole chiave, come le id di alcune transazioni, primo address di una transazione, la quantità di bitcoin trasferiti...
I dati della blockchain saranno sempre disponibili (e se non lo fossero allora i vostri btc sarebbero persi in ogni caso), bisogna quindi individuare solo un modo personalizzato di estrarre queste informazioni.
Per mantenere alta l'entropia ognuno dovrebbe scegliere per sè un algoritmo personalizzato e andare a pescare i dati che gli interessano, creando così delle specie di "frasi" particolari molto facili per lui da recuperare all'occorrenza.
Faccio un esempio (ma ovviamente è solo un esempio):
decido di memorizzare l'anno corrente (2016) e il nome di 4 persone (arulbero, aldo, giovanni, giacomo).
Di queste 4 persone, che io ovviamente devo conoscere, so per esempio l'età oggi (e questo è un dato che tranquillamente ricorderò anche tra 10 anni)
età (arulbero,aldo,giovanni,giacomo) nel 2016 --> 37 - 24 - 50 - 43 (sono gli unici dati da memorizzare, oltre l'algoritmo)
A questo punto, nel mio algoritmo, le prime 3 coppie di cifre indicano il blocco da cui inizio a estrarre i dati (372450) e le ultime due cifre corrispondono rispettivamente alla prima transazione (la numero 4 del blocco) e al numero di transazioni totali che estrarrò dalla blockchain
Riassumendo:
eta(arulbero,aldo,giovanni,giacomo) nel 2016 --> 37 - 24 - 50 - 43
partenza:blocco 372450, tx 4
totale transazioni da estrarre: 3
Per ogni transazione estraggo i seguenti dati:
dati:idtransazione*primo address di partenza*quantità bitcoin trasferiti (gli asterischi servono solo per facilitare la lettura).
In questo caso:
416f95b89c12b1d8434737de9098cca6c8cbc05618606cbc7d0a2d61baa2f794*12uawNinG9PksdPk6PCCgvoEFUB4FsyZct*0336 <--dati tx1
b0a506c08d6ec17acdc7bf71c46ec41e701c3c148bb93b14a757af2de6655409*1HXfiv2EpL2durJNJuUceBGgHzpewFUH5o*00136486 <-- dati tx 2
2f2a975ddb0b368c21cb2ee7a03476e7b8461722217db62c5ef0d514096ffb29*1HV591kSQ6QC9GPor76UqXnQZrV82Lu7GT*001000077 <-- dati tx 3
Risultato finale, aggiungo i miei 4 nomi ai dati estratti dalla chain:
arulbero+aldo+giovanni+giacomo+416f95b89c12b1d8434737de9098cca6c8cbc05618606cbc7d0a2d61baa2f79412uawNinG9PksdPk6PCCgvoEFUB4FsyZct0336416f95b89c12b1d8434737de9098cca6c8cbc05618606cbc7d0a2d61baa2f79412uawNinG9PksdPk6PCCgvoEFUB4FsyZct0336416f95b89c12b1d8434737de9098cca6c8cbc05618606cbc7d0a2d61baa2f79412uawNinG9PksdPk6PCCgvoEFUB4FsyZct0336b0a506c08d6ec17acdc7bf71c46ec41e701c3c148bb93b14a757af2de66554091HXfiv2EpL2durJNJuUceBGgHzpewFUH5o001364862f2a975ddb0b368c21cb2ee7a03476e7b8461722217db62c5ef0d514096ffb291HV591kSQ6QC9GPor76UqXnQZrV82Lu7GT001000077
Ne faccio hash256 e ottengo la chiave privata:
d3f1ab1fae102c81c6e05b4b7944ac986feafc43a66f47e0a1b6afe40de86f0d (esadecimale)
da cui l'address 1DQ4PbcHB3EUt9gRZbcFwaWZty3SkX9bxt
(per fare i calcoli ho utilizzato i seguenti tool online
http://www.xorbin.com/tools/sha256-hash-calculator e
https://gobittest.appspot.com/Address ma ovviamente nel caso reale andrebbe fatto tutto in locale).
Potrebbe funzionare o secondo voi l'entropia finale sarebbe troppo bassa?
E' pur vero che alla fine ho solo scelto 3 transazioni consecutive (tx1 --> tx 2 --> tx3) ma l'arbitrarietà dei dati che ho scelto di estrarre da ogni tx e il fatto di combinare stringhe pubbliche con dati personali non dovrebbero garantire una sicurezza sufficiente?
Si potrebbero ovviamente pescare più tx e farlo in modo che siano maggiormente slegate tra loro ...