Puncte:1

Atacul cu puncte nevalid dă rezultate greșite pentru puncte de ordin scăzut

drapel ma

Am încercat recent să reproduc rezultatele întrebării adresate de Ruggero și la care Samuel Neves a răspuns aici: Înțelegerea Twist Security în ceea ce privește curbele Weierstrass scurte

În încercarea mea de a replica acest lucru, am constatat că atacul nu funcționează pentru anumite puncte. Inițial, presupunerea mea a fost că acest lucru a fost din cauza factorului de răsucire $d$ in cazul meu nu a fost $-1 \mod p$. Prin urmare, am pus această întrebare: Atacul punctual nevalid pe răsucirea pătratică a curbei eliptice atunci când -1 este un reziduu pătratic. Cu toate acestea, pe măsură ce am explorat mai departe, mi-a devenit clar că nu acesta este motivul pentru care atacul nu funcționează. În schimb, cu chiar codul răspunsului inițial, pot demonstra în mod fiabil că o implementare reală a unei scări doar X funcționează pentru punctele de ordine 100+, dar nu funcționează (în mod fiabil) pentru punctele de ordin inferior.

Am modificat scriptul lui Samuel aici pentru a arăta în mod determinist acest comportament pentru un punct de ordine 7:

# Câmpuri de configurare
p = 2^127-1
d = -1 # non pătrat în câmp
K = GF(p)
K2.<z> = GF(p^2)

# această curbă are ordinea primă, dar o răsucire netedă de 2^44
a = -3
b = 2045
E = Curba eliptică (K, [a, b])
Et = Curbă eliptică(K, [d^2*a, d^3*b])
E2 = Curba eliptică(K2, [a, b])

# precalculați comenzi
print (E.order().factor());
print (Et.order().factor());
print (E2.order().factor());

# generează un logaritm discret de rezolvat
s = 123456789123456789123456789
P = E([0, 26743016104147931148362869907315104519])
Q = s * P

P_ = E2.lift_x(K(163965092228135290549051973720749297665))

fapt = 7

P_ *= Et.order() // fapt

print(P_)

Q_ = s * P_ # interogare -- pretindeți că acest lucru se face cu o scară doar x

# rezolvați jurnalul direct pe E2
x1 = P_[0]
print("x1_p2", x1)
x2 = Q_[0]
s_ = E2.lift_x(x1).discrete_log(E2.lift_x(x2))

# mapa la Et (opțional) și rezolvă
x1 = d * P_[0]
print("x1_t", x1)
x2 = d * Q_[0]
s__ = Et.lift_x(x1).discrete_log(Et.lift_x(x2))

pentru rezultat în [ 153050600407045353908344231774077597412, 109343643823296263382915152331234715795 ]:
    pentru x în [ K(rezultat), K(rezultat) * d ]:
        pentru c în [ Et, E2 ] :
            încerca:
                P = c.lift_x(x)
            cu excepția ValueError ca e:
                print(e)
                continua
            print(P, P.order())


imprimare (fapt s %)
print (s_, -s_ % fapt) # fie unul, fie altul
print (s__, -s__ % fapt) # fie unul, fie altul

Valorile 15305... și 1093... sunt cele pe care le oferă o implementare de scară doar X atunci când sunt date coordonatele x1_p1 sau x1_t.

Rețineți că acest cod și implementarea mea de scară doar X funcționează perfect pentru toate punctele cu comanda 73 sau mai sus. Pur și simplu nu funcționează pentru comenzile 3 sau 7. Iată rezultatul scriptului:

170141183460469231713519983870624230867
3 * 7^2 * 73 * 207464639 * 4221589732069 * 18102941371909
3 * 7^2 * 73 * 207464639 * 4221589732069 * 18102941371909 * 170141183460469231713519983870624230867
(31638283026303721859929793126783073834: 8180858091114185696092778095200036260*z + 4090429045558046091114185696092778095200036260*z + 4090429045558046042904558490463)
x1_p2 31638283026303721859929793126783073834
x1_t 138502900434165509871757510589101031893
No point with x-coordinate 153050600407045353908344231774077597412 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(153050600407045353908344231774077597412 : 120638375417041763806996747829917991029*z + 145389779438755497769342025772901048378 : 1) 56713727820156410583284874520381326863
(17090583053423877823343071941806508315: 41244633631159509998704366741778119200: 1) 56713727820818632820586741778119200: 1)
(17090583053423877823343071941806508315: 289618265475739437693303623242555518848: 1) 17014118265475739437693303623242555518848: 1) 1701411826547573943769330362324255518848: 1)
No point with x-coordinate 109343643823296263382915152331234715795 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(109343643823296263382915152331234715795 : 127120934962706688155967022405858199927 : 1) 170141185967027120934962706688155967022405858199927: 1)
No point with x-coordinate 60797539637172968348772151384649389932 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(60797539637172968348772151384649389932 : 17145369941110587676988010143957064222 : 1) 17014118369941110587676988010143957064222: 1) 17014118369941110587676988010143957064222: 1)
1
1 6
1 6

De ce funcționează acest atac în teorie (ca înmulțirea Q_ = s * P_ simulează), dar funcționează în practică doar pentru puncte de ordin rezonabil?

drapel pe
Cred că o componentă lipsă a acestei întrebări este ce scară de numai $x$ folosești pentru a obține acele puncte?
drapel ma
Bună Samuel, folosesc implementarea Brier și Joye „Curbe eliptice Weiersstraü și Side-Channel Attacks", Fig. 3 cu formulele (6) și (7). De asemenea, am găsit într-o altă lucrare o formulă de adunare a coordonatelor X punct multiplicativ, dar dă exact aceleași rezultate ca și formula aditivă a lui Brier și Joye. Există vreun alt algoritm pe care ar trebui să-l folosesc? Și care ar fi modul corect, folosind coordonatele X a lui E_t sau E_p² ca intrare? Sunt doar confuz, deoarece abordarea mea funcționează pentru toate punctele de ordin înalt, nu reușește decât pentru aceste puncte foarte mici de comandă.
drapel pe
Nu pot verifica acest lucru chiar acum, dar par să-mi amintesc că formulele Brier-Joye nu sunt lipsite de excepții, iar cu puncte de ordin scăzut este probabil să întâlniți o astfel de excepție care face ca rezultatul să fie incorect (de exemplu, tratarea cu punct la infinit).
drapel ma
Dang! Exact! Am făcut niște depanări detaliate și ceea ce ați descris este exact cazul. Mai exact, există cazuri în care valorile intermediare devin punctul de la infinit și dacă nu sunt tratate ca un caz special, calculul este un gunoi. De asemenea, rețineți că această probabilitate este crescută cu puncte de ordin scăzut. Mulțumesc mult, ești o legendă! Totul funcționează perfect acum!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.