Una funzione hash è definita come
-
collision free: non è computazionalmente fattibile trovare due valori
$x, y: x \ne y, H(x) = H(y)$ -
hiding: con la sola conoscenza di
$H(x)$ , non è non è computazionalmente fattibile risalire ad$x$ -
aggiunta di randomness: se si sceglie una stringa
$r$ con alta entropia minima1, posso costruire un valore$H(r|x)$ da quale non è possibile ricavare$x$
-
aggiunta di randomness: se si sceglie una stringa
-
puzze friendly: per ogni possibile output della funzione di hash, scelto un valore casuale
$k$ da una distribuzione con alta entropia minima1, non è computazionalmente fattibile trovare un valore di$x$ tale che$H(k|x) = y$
Dupla composta da due algoritmi:
Bisogna assicurarsi che siano verificate sia la proprietà di hiding che di binding. Con binding si intende che non deve essere possibile per chi ha prodotto l'hash sulla coppia
- è hiding perché non è possibile testare direttamente la funzione hash su un valore, poiché senza conoscere la randomness non è possibile calcolare il valore hash corretto
- è binding, poiché se
$m \ne m'$ , ne segue che$r|m \ne r'|m'$ . Se i due hash coincidono, l'avversario avrebbe trovato una collisione. Nell'ipotesi che la funzione$H$ scelta sia collision resistant, ciò non è possibile
Fissato un "puzzle ID"
Un hash pointer è un puntatore a una locazione dove l'informazione è immagazzinata, nonché l'hash crittografico di suddetta informazione. Ciò ci da, in un colpo solo, sia un modo per ritrovare il dato che per verificare che questo non sia stato modificato.
In generale è possibile usare gli hash pointers in qualsiasi struttura priva di cicli.
Una linked list che utilizza gli hash pointers per puntare al nodo precedente è la forma più semplice di blockchain. Ciò che questa struttura garantisce è che, se avviene una modifica in uno qualsiasi dei nodi, ciò è subito individuato con un controllo sui nodi successivi, in quanto l'hash pointer risulterà scorretto.
I Merkle tree sono alberi binari che utilizzano gli hash pointers per indicare i figli destro o sinistro. Poiché è necessario memorizzare solo la radice dell'albero, forniscono un modo estremamente compatto per assicurare che tutti i dati presenti siano rimasti inalterati. Inoltre, per assicurarsi che uno specifico valore appartenga effettivamente all'albero, p sufficiente fare
Se il Merkle tree è ordinato, inoltre, lo si può usare per verificare la non appartenenza di un elemento in tempo
stateDiagram-v2
1 : Merkle Root
2 : H(AB)
3 : H(CD)
4 : H(A)
5 : H(B)
6 : H(C)
7 : H(D)
1 --> 2
1 --> 3
2 --> 4
2 --> 5
3 --> 6
3 --> 7
Le firme digitali sono primitive crittografiche con le seguenti proprietà:
- solo chi possiede la chiave segreta associata alla firma è in grado di forgiarla
- chiunque può verificare che la firma sia autentica
- la firma è associata ad un particolare documento (o dato)
Una firma digitale ha bisogno della tripla
Perché tutto questo funzioni, è necessario che una firma valida è sempre riconosciuta come tale e che un avversario che conosca solo la chiave pubblica non sia in grado di forgiare una firma che passi la validazione.
sequenceDiagram
participant A as Attacker
participant V as Verifier
note left of A: pk
note right of V: sk, pk
loop
A ->> V : mi
V ->> A : sign(sk, mi)
end
A ->> V : m, sig
alt verify(pk, m, sig) = 1
V ->> A: win
else verify(pk, m, sig) = 0
V ->> A : lose
end
Ci sono alcune limitazioni che spesso sono aggirate o ignorate nella pratica:
- gli algoritmi, specie quello di generazione della chiave, potrebbe aver bisogno di una buona fonte di randomness
- c'è un limite sulla dimensione del messaggio che si può firmare
- possiamo però firmare l'hash del messaggio
Piuttosto che utilizzare uno schema di firma tradizionale, la maggior parte delle criptovalute ha optato per utilizzare un schema di firma basato sulle curve ellittiche. Nello specifico, la curva utilizzata è Secp256k1. Questa è definita come
Parametro | Dimensione |
---|---|
Private Key | 256 bit |
Public key (non compressa) | 512 bit |
Public key (compressa) | 257 bit |
Messaggio da firmare | 256 bit |
Firma | 512 bit |
Si noti che, sebbene le dimensioni del messaggio che ECDSA è in grado di firmare siano decisamente limitate, questo non rappresenta un problema nel momento in cui il messaggio può essere hashato prima di essere firmato.
Scendendo ora nei dettagli dell'algoritmo di firma, una firma digitale
In un sistema che si basa sulla firma digitale, l'idea di identità si sposa perfettamente con la chiave pubblica di quella entità. In altre parole, vedendo un messaggio msg che verifica