Il seguente articolo, tecnico su IOTA, spiega come sono generati gli indirizzi, l'operazione di firma dei messaggi e la validazione.
Generazione indirizzo (Address generation)
Prima di tutto generare una chiave privata (private key) dal seme (seed).
// length = security (1: light client, 2: wallet default, 3: exchange level)
var key = function(seed, index, length) {
... return key; // private key
}
- Avere la chiave privata pronta con la lungezza (length)
= security * 2187[trytes]
- La chiave privata è partizionata in L segmenti distinti, dove
L = security * 27[trytes]
. In questo modo ogni segmente è 81[trytes] - Ogni segmento è hashed 26 volte
- Fare il hash del segmento nel suo insieme. Il prodotto è chiamato
digest
. (precisando: ogni pezzo (chunk) di 27 segmenti è hashed e concatenato. e.g. persecurity = 2
, esistono 2 chunk, ognuno con 27 segmenti; 1-27 e 28-54. Questi sono hashed indipendetemente uno dall'altro per produrre due digest da 81[trytes], quindi concatenati per ottenere un digest finale da 162[trytes]) - Si fa l'hash del
digest
una volta. Il prodotto si chiamaaddress
(indirizzo)
Seme->Chiave Privata->digest->indirizzo (Seed -> Private key -> digest -> address)
Firma (Signature)
La firma (signature) è utilizzata per firmare tutto (=solitamente spendere fondi da un indirizzo di input) con la nostra chiave privata. Altri usi sono i canali MAM.- Avere la chiave privata pronta con la lungezza (length)
= security * 2187[trytes]
- La chiave privata è partizionata in L segmenti distinti, dove
L = security * 27[trytes]
. In questo modo ogni segmente è 81[trytes] - Per ogni i-esimo segmento, fare l'hash N_i volte, dove N_i è calcolato come spiegato sotto: Come ottenere N
- Insieme questi segmenti hashed sono chiamati firma
Signature
Come ottenere N
Per ogni i-esimo tryte del dato della firma (Signature Data), prendere il decimale 'd' del tryte. Convertire qui.
e.g. tryte[9] corrisponde a d=0
, [A] sta a d=1
...[M] sta a d=13
, [N] sta a d=-13
...[Y] sta a d=-2
, [Z] sta a d=-1
).
Formula: N_i = 13 -d
Validazione (regenerazione indirizzo) [Validation (address Re-generation)]
- Avere la chiave privata pronta con la lungezza (length)
= security * 2187[trytes]
- La chiave privata è partizionata in L segmenti distinti, dove
L = security * 27[trytes]
- Per ogni i-esimo segmento, fare l'hash M_i volte, dove M_i è calcolato come spiegato sotto: Come ottenere M
- Fare il hash del segmento nel suo insieme. Il prodotto è chiamato
digest
- Hash il
digest
una volta - Verificare se il prodotto dello step 5 è uguale all'indirizzo di input. Se combaciano allora transaction(=spending from input address) è validato.Come ottenere M
Per ogni i-esimo tryte del dato della firma (Signature Data), prendere il decimale 'd' del tryte. Convertire qui.
e.g. tryte[9] corrisponde a
d=0
, [A] sta ad=1
...[M] sta ad=13
, [N] sta ad=-13
...[Y] sta ad=-2
, [Z] sta ad=-1
). Formula: M_i = 13 +d
Firma multipla (Multisig)
La firma multipla si differenzia unicamente per la lungezza della firma e come si crea la firma. Spiegato qui: https://medium.com/@abmushi/iota-multisig-explained-bca334d250a2 (articolo in inglese, n.d.t. in lista per essere tradotto)Dati firmati (Signed Data)
La firma (signature) è utilizzata per firmare gli indirizzi di input dai quali spendere. La firma è memorizzata nel pacchetto (bundle) che spende l'input firmato. Dati firmati (length = security * 2187tryte) sono memorizzati in frammento di firmasignatureFragment
. Da notare che la capacità di signatureFragment
è 2187trytes, quindi maggiore è la sicurezza richiesta, maggiore è il numero di transazioni necessarie da includere nel pacchetto per memorizzare le firme.
I dati firmati menzionati sopra si riferiscono al hash del pacchetto (81trytes) (bundle hash) che includono la firma. A rigor di termini, i dati firmati sono chiamati hash del pacchetto normalizzato normalized bundle hash
, che è un hash di pacchetto leggermente incrementato, tale che l'esposizione della chiave privata risulta in totale essere la metà.
data[0], data[1], data[2], che sono componenti del hash del pacchetto normalizzato (normalized bundle hash) sono utilizzati come dati firmati (Signed Data). Il numero di volte in cui ciascuno dei 27 segmenti è hashed, corrisponde a ciascun tryte dei 27 tryte di dati firmati. data[i] sopra è 27tryte di dati firmati. Se security = 1
, viene utilizzato il data[0]. se security = 2
, vengono utilizzati i data[0] e i data[1] in modo tale che in totale vengano utilizzati 54trytes per firmare. (vedi tabella sopra) Ricordiamo che quando si crea un pacchetto (bundle), il numero di transazioni che memorizzano la firma dipende anche dal livello di sicurezza. Questo perché aumenta il livello di sicurezza, più data[i] sono utilizzati per firmare.
Anche se l'API genera un errore, il protocollo consente la sicurezza security >= 4
(e.g. la transazione è confermata), in questo caso i data[3] non esiste, quindi è usato nuovamente i data[0] e così via.
Il rischio nel riutilizzo degli indirizzi (Risk of Address Reuse)
Si conosce l'avvertimento "Non riutilizzare l'indirizzo!". Ma cos'è? E perché non possiamo semplicemente usare lo stesso indirizzo? Il segreto è qui. Ricoriamoci:
Come ottenere N
Per ogni i-esimo tryte del dato della firma (Signature Data), prendere il decimale 'd' del tryte. Convertire qui.
e.g. tryte[9] corrisponde a d=0
, [A] sta a d=1
...[M] sta a d=13
, [N] sta a d=-13
...[Y] sta a d=-2
, [Z] sta a d=-1
).
Formula: N_i = 13 -d
Il numero di hash dipende da i-esimo tentativo di dati firmati. Se i dati firmati contengono molto "M", che richiede zero hashing. Ciò potrebbe comportare l'esposizione di parte della chiave privata non elaborata. Inoltre, parte della chiave meno hashed può essere utilizzata come firma di un pacchetto dannoso di un aggressore.Sicurezza quantistica (Quantum Secure)
Il meccanismo di firma origina da Winternitz one-time signature (articolo in inglese, n.d.t. "e qui mi dispiace, ma sono ca**i vostri")Tabella Trits/Tryte a decimale (Trits/Tryte to Decimal Table)
Riferimenti
IOTA iotaledger https://github.com/iotaledger
signing part: JavaScript=>signing.js.
Java=>Signing.java.
I love Markdown: original .mk file here
Sull'autore
Tradotto dal suo articolo originale in giapponese qui
Per donare ad abmushi:
BTC: 1ACGpgpAMgaAKbGpPq2sDa467MnRNdW4wX
IOTA: G9XNCNYYHRKNPKLXFKUSINZ9OIAQGSNGJVODC9TNWQMILXZH9PNHXDGNEUFLEQNNVJUCIWWKZBTJLDXAYOZHZEZSN9
Il testo originale in lingua inglese si trova qui: https://medium.com/@abmushi/iota-signature-and-validation-b95b3f9ec534Pubblicato in origine qui: gist.github.com.
Per ulteriori informazioni in italiano o tedesco trovate i miei contatti a questa pagina.
Se avete trovato utile la mia traduzione, accetto volentieri delle donazioni ;)
IOTA:
CHQAYWPQUGQ9GANEWISFH99XBMTZAMHFFMPHWCLUZPFKJTFDFIJXFWCBISUTVGSNW9JI9QCOAHUHFUQC9SYVFXDQ9D
BTC:
1BFgqtMC2nfRxPRge5Db3gkYK7kDwWRF79
Non garantisco nulla e mi libero da ogni responsabilità.
Posted from my blog with SteemPress : https://antonionardella.it/iota-firma-e-validazione/