La specifica BIP-39 descrive principalmente l'algoritmo e il processo per generare portafogli deterministici basati su mnemonici (un insieme di parole facili da ricordare).
La specifica è composta da due parti principali:
Come generare il mnemonico.
Come trasformare il mnemonico generato in un seme binario.
Quello che segue è uno sguardo su come generare portafogli deterministici descrivendo prima ciascuna di queste due parti.
Generazione di un messaggio
Il processo algoritmico per generare un mnemonico è il seguente:
Il processo è il seguente:
Crea una sequenza casuale (entropia) da 128 a 256 bit (dimensione del passo 32 bit)
Esegui SHA256 sulla sequenza casuale generata nel passaggio precedente per generare un valore Hash e prendi i primi N bit del valore Hash (lunghezza entropia / 32, ad esempio 128 bit, quindi N = 4) come checksum della sequenza casuale.
Aggiungere Checksum alla fine della sequenza casuale generata nel primo passaggio, in modo che per l'esempio in figura la sequenza casuale con Checksum sia 128 + 4 = 132 bit.
Separare la sequenza casuale dal passaggio precedente con segmenti da 11 bit (divisi), in modo che per una sequenza con lunghezza entropica di 128 bit vengano generati 12 segmenti (132/11 = 12).
A questo punto si mappa ciascun valore contenente un segmento da 11 bit su un dizionario predefinito di 2048 parole.
L'ultimo gruppo di parole generate nell'ordine del taglio è il mnemonico.
Generazione di semi da mnemonici
Dopo la generazione mnemonica possiamo generare il seed utilizzando l'algoritmo della funzione di generazione chiave PBKDF2.
PBKDF2 richiede due parametri: un mnemonico e un sale. Lo scopo del sale è rendere più difficile il cracking e in BIP-39 possiamo introdurre la passphrase come ulteriore fattore di sicurezza per proteggere i semi.
"PBKDF2 fa parte della serie PKCS (Public-Key Cryptography Standards) di RSA Laboratories, in particolare PKCS #5 v2.0, pubblicato anche come RFC 2898 della Internet Engineering Task Force.
Dopo la generazione mnemonica di cui sopra, il diagramma seguente mostra l'algoritmo per la generazione del seme.
Il primo parametro di PBKDF2 è il mnemonico generato sopra.
Il secondo parametro di PBKDF2 è il salt, che generalmente consiste in una stringa e una concatenazione opzionale di stringhe cifrate fornite dall'utente.
PBKDF2 utilizza l'algoritmo HMAC-SHA512, che utilizza 2048 hash per produrre un valore a 512 bit come seme.
Generazione del portafoglio HD dal seed
Il seme generato sopra verrà utilizzato come Root Seed del portafoglio HD e il Root Seed di qualsiasi portafoglio HD potrà ricreare l'intero portafoglio HD.
L'inserimento del Root Seed nell'algoritmo HMAC-SHA512 produce un hash da 512 bit, i cui 256 bit di sinistra vengono utilizzati come chiave privata principale e i 256 bit di destra come codice della catena principale. Successivamente, la Master Public Key (264 bit) può essere generata dalla Master Private Key m.
Come puoi vedere dalla figura sopra, la chiave HD viene generata con i seguenti parametri.
Chiave privata principale o Chiave pubblica principale; (entrambi sono chiavi ECDSA a 256 bit non compresse).
Codice catena principale di 256 bit.
Un numero di indice intero a 32 bit.
Inoltre, il processo sopra descritto è ricorsivo e la Chiave privata figlio nel diagramma può essere utilizzata come Chiave privata genitore al livello successivo.
Inserendo (chiave pubblica principale, codice catena principale, numero di indice) nell'algoritmo HMAC-SHA512, possiamo generare le sue sottochiavi e possiamo regolare il numero di indice per generare più sottochiavi allo stesso livello.
Informazioni sulla chiave estesa
Poiché questa funzione di derivazione della chiave è unidirezionale, tutte le sottochiavi non possono essere utilizzate per derivare le chiavi principali o sorelle allo stesso livello, solo la chiave principale e il codice della catena principale (che vengono generati dalla chiave del livello principale e dal codice della catena del genitore) possono essere utilizzati per derivare tutte le sottochiavi e i codici della sottocatena e successivamente generare le chiavi secondarie e gli indirizzi corrispondenti per la firma delle transazioni.
La combinazione di chiave e codice catena è chiamata chiave estesa e la chiave estesa può essere utilizzata per generare tutti i rami da lì in giù.
La chiave fornita nella chiave estesa può essere una chiave privata o una chiave pubblica, combinata con il codice della catena chiamato Chiave privata estesa e Chiave pubblica estesa, rispettivamente, e indicato rispettivamente come (k, c) e (K, c), dove la chiave pubblica K = punto(k).
Possiamo derivare la chiave pubblica estesa dalla chiave privata estesa e non viceversa, quindi per alcuni scenari di transazione (ad esempio, e-commerce), è possibile generare una nuova chiave pubblica e un nuovo indirizzo per ogni transazione per ricevere il pagamento, mentre la chiave privata estesa può essere archiviata in un portafoglio cartaceo o in un portafoglio hardware per la firma offline sicura delle transazioni. Come possiamo vedere, la sicurezza della chiave pubblica estesa è relativamente elevata e il diagramma seguente mostra il meccanismo di trasmissione della chiave pubblica genitore estesa per derivare la chiave privata figlio e generare la chiave pubblica figlio:




