Comunque in generale penso sia importante avere una "scatola nera" disconnessa da internet con un rigido protocollo di comunicazione, la quale si occupi di firmare internamente le transazioni senza esporre chiavi private, per poi semplicemente buttarle fuori.
Poi che questo sia un pc o hardware dedicato se ne può discutere
In effetti serve una scatola che
1) generi sequenze pseudocasuali di 256 bit
2) sia in grado di calcolare una chiave pubblica da una privata (curva ellittica)
3) sia in grado di firmare una transazione, cioè di generare una coppia (r, s) di sequenze di 256 bit che dipendono dalla chiave privata e dalla transazione
Sarebbe interessante verificare quanto di questo processo si possa fare a "mano", non letteralmente ma utilizzando strumenti su cui si abbia il controllo massimo possibile.
Generare "s" da "r" è relativamente semplice, si tratta di 3-4 operazioni algebriche modulo n, per generare "r" invece bisogna lavorare con la matematica delle curve ellittiche.
Il punto 1) rimane un punto intrigante, e cioè riuscire a costruire una sorgente di sequenze pseudocasuali che abbia un'entropia sufficiente.
Per quanto riguarda la comunicazione scatola <-> pc connesso a Internet, dal pc bisogna importare lo sha256 della tx non firmata nella scatola che deve restituire solo la firma (r, s) al pc connesso, dove infine viene formata la tx finale firmata e inviata.
La cosa più facile che mi viene in mente sarebbe quella di utilizzare come scatola un vecchio pc in disuso (senza scheda di rete, wifi, microfono, scheda audio, videocamera, ovviamente quindi non connesso a Internet), sul quale utilizzare una distro live minima con un paio di programmini in Python che assolvano alle funzioni 1) 2) e 3).
Per quanto riguarda la comunicazione scatola <-> pc connesso, bisognerebbe trovare un modo di trasportare i dati tra i due dispositivi. Io utilizzerei la seguente procedura:
ogni stringa di 256 bit viene convertita in un insieme di 12 (o quante ne servono) parole prese da una lista precaricata. In questo modo l'operatore umano può copiare abbastanza agevolmente i dati a mano, eliminando ogni contatto diretto tra i due dispositivi. Poi la sequenza di 12 parole viene automaticamente riconvertita nella stringa a 256 bit (64 cifre hex) ed eventualmente si controlla a mano di non aver fatto errori (ma se la firma è sbagliata in ogni caso la procedura si bloccherebbe da sola).
Sulla carta è tutto abbastanza facile da realizzare (anche se non praticissimo, ovvio) tranne il punto 1), cioè costruire in maniera autonoma un generatore pseudocasuale con tutta quella entropia. Questo sarebbe il punto più intrigante di tutta la faccenda.
EDIT: per chi volesse iniziare a implementare da solo (o capire meglio) il funzionamento di queste funzioni essenziali:
https://medium.com/coinmonks/introduction-to-blockchains-bedrock-the-elliptic-curve-secp256k1-e4bd3bc17d