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
}

  1. Avere la chiave privata pronta con la lungezza (length) = security * 2187[trytes]
  2. La chiave privata è partizionata in L segmenti distinti, dove L = security * 27[trytes]. In questo modo ogni segmente è 81[trytes]
  3. Ogni segmento è hashed 26 volte
  4. Fare il hash del segmento nel suo insieme. Il prodotto è chiamato digest. (precisando: ogni pezzo (chunk) di 27 segmenti è hashed e concatenato. e.g. per security = 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])
  5. Si fa l’hash del digest una volta. Il prodotto si chiama address (indirizzo)
dal seme all'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.

  1. Avere la chiave privata pronta con la lungezza (length) = security * 2187[trytes]
  2. La chiave privata è partizionata in L segmenti distinti, dove L = security * 27[trytes]. In questo modo ogni segmente è 81[trytes]
  3. Per ogni i-esimo segmento, fare l’hash N_i volte, dove N_i è calcolato come spiegato sotto: Come ottenere N
  4. 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)]

  1. Avere la chiave privata pronta con la lungezza (length) = security * 2187[trytes]
  2. La chiave privata è partizionata in L segmenti distinti, dove L = security * 27[trytes]
  3. Per ogni i-esimo segmento, fare l’hash M_i volte, dove M_i è calcolato come spiegato sotto: Come ottenere M
  4. Fare il hash del segmento nel suo insieme. Il prodotto è chiamato digest
  5. Hash il digest una volta
  6. 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 a d=1…[M] sta a d=13, [N] sta a d=-13…[Y] sta a d=-2, [Z] sta a d=-1).
    Formula: M_i = 13 +d

03 validazione

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 firma signatureFragment. 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à.

04 dati firmati

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)

05 trytes a decimale

Riferimenti

IOTA iotaledger https://github.com/iotaledger

signing part: JavaScript=>signing.js.

Java=>Signing.java.

I love Markdown: original .mk file here

Sull’autore

@abmushi on twitter, Discord

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-b95b3f9ec534


Pubblicato 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à.


Also published on Medium.