Citesc BIP340 și întâmpin probleme în a înțelege această parte:
De exemplu, fără hashing etichetat, o semnătură BIP340 ar putea fi valabilă și pentru o schemă de semnătură în care singura diferență este că argumentele funcției hash sunt reordonate. Mai rău, dacă funcția de derivare a nonce BIP340 a fost copiată sau creată în mod independent, atunci nonce ar putea fi reutilizată accidental în cealaltă schemă care scăpa cheia secretă.
Presupun că prima propoziție este valabilă numai în cazul în care argumentele se întâmplă să împărtășească valori, este corect? De exemplu, hash-ul folosit de BIP340 este $\text{hash}(R||P||m)$. Dacă se folosește o schemă diferită $\text{hash}(R||m||P)$, atunci aceste două scheme ar avea ca rezultat o coliziune dacă mesajul $m$ semnat sa întâmplat să fie egal cu cheia publică $P$, determinând ca o semnătură într-o schemă să fie valabilă în cealaltă schemă.
Întrebarea mea principală se referă la a doua propoziție. Cum anume nu etichetarea hash-urilor ar determina reutilizarea unui nonce într-o schemă separată pentru a scurge cheia privată? Încerc să trec la matematică pentru a vedea cum ar funcționa asta.
Să presupunem că avem două scheme Schnorr care își creează hashurile după cum urmează:
Schema 1: $e_1=\text{hash}(R||P||m)$
Schema 2: $e_2=\text{hash}(R||m||P)$
Am putut vedea cum reutilizarea unui nonce ar scurge cheia privată dacă aceeași cheie ar fi folosită în ambele scheme și hashurile ar fi diferențe. Pentru un nonce $k$, cheie privată $d$, și semnături $s_1$ și $s_2$ avem:
\begin{align}
s_1 &= k + e_1 \cdot d \
s_2 &= k + e_2 \cdot d \
s_1 - s_2 &= d (e_1 - e_2) \
d &= (s_1 - s_2) (e_1 - e_2) ^ {-1}
\end{align}
Cu toate acestea, dacă hashurile erau deja diferite, atunci modificarea argumentelor hash cu o etichetă specifică schemei nu ar face nicio diferență.
Cealaltă abordare pe care am putut-o vedea este dacă cheile private erau diferite și hashurile erau aceleași, așa cum presupun că este subînțeles de prima propoziție din citatul BIP. Dacă cheile private ar fi $d_1$ și $d_2$, iar hashurile au avut o coliziune și au fost ambele $e$, atunci diferența dintre cheile private ar putea fi scursă după cum urmează:
\begin{align}
s_1 &= k + e \cdot d_1 \
s_2 &= k + e \cdot d_2 \
s_1 - s_2 &= e \cdot (d_1 - d_2) \
d_1 - d_2 &= (s_1 - s_2) \cdot e^{-1}
\end{align}
Deși acest lucru scurge diferența dintre cheile private, ceea ce probabil nu este ideal, nu văd cum se scurg cheile private în sine.
Poate că o să fac asta în mod greșit. Cum funcționează matematica în ceea ce privește scurgerea cheii private ca urmare atât a reutilizarii unui nonce, cât și a neetichetării hashurilor?