Replic un atac punctual nevalid asupra ECC folosind curbe Weierstrass scurte. Pentru aceasta am scris o implementare "proastă" care nu validează punctele care sunt pe curbă înainte de a intra în multiplicarea scalară. Pentru schița atacului, împrumut foarte mult din descrierea excelentă a lui Samuel Neves pe care a oferit-o aici: Înțelegerea Twist Security în ceea ce privește curbele Weierstrass scurte
Pot replica asta fără nicio problemă când $d = -1$ este un nereziduu pătratic în $\mathbb{F}_p$, apoi totul funcționează imediat. Cu toate acestea, când $p$ este astfel încât $-1$ este un reziduu pătratic și, prin urmare, trebuie să aleg o valoare diferită pentru $d$, totul se destramă.
Pentru simplitate, la prima rulare nu folosesc curbe în $\mathbb{F}_{p^2}$ pentru că pentru mici $p$ enumerarea exhaustivă pentru a găsi puncte de ordin scăzut nu este o problemă.
De exemplu, să spunem că curba mea este definită peste $\mathbb{F}_{101}$; Aici, $-1$ este un reziduu patratic mod $p$, de cand $10 \cdot 10 = -1 \mod 101$. Curba mea este dată de
$E: y^2 = x^3 + 13x + 29$
Si cu $d = 2$, un mod pătratic fără reziduuri 101,
$E^d: y^2 = x^3 + 52x + 30$
Ordinul de $E^d$ este $111 = 3 \cdot 37$. Am ales două puncte $E^d$ care au ordinele 3 și respectiv 37:
$P_1 = (28, 62)$
$P_2 = (8, 7)$
Când rulez aceste valori prin multiplicarea mea scalară fără validare de puncte (pentru cheia privată $d = 58$, am urmatoarea iesire:
$S_1 = (94, 53)$
$S_2 = (32, 14)$
Nici $S_1$ nici $S_2$ este un punct pe răsucirea pătratică $E^d$. Pot ridica oricare dintre coordonatele X $E^d$, dar atunci ordinea punctelor este greșită.
Iată codul meu exemplu:
Fp = GF(101)
D = Fp(2)
print(D, „este pătrat?”, D.is_square())
(a, b) = (13, 29)
E = Curba eliptică(Fp, [a, b])
Et = Curba eliptică(Fp, [ a*D^2, b*D^3 ])
print("Et.order()", factor(Et.order()))
puncte_atac = [
Et(28, 62),
Et(8, 7),
]
imprimare(E)
print(Et)
pentru P în puncte_de_atac:
print(P, P.order())
# cheie privată d = 58
mul_results = [
Et(94, 53),
Et(32, 14),
]
#print(Et.lift_x(94).order())
#print(Et.lift_x(32).order())
Care iese:
2 este pătrat? Fals
Et.order() 3 * 37
Curba eliptică definită de y^2 = x^3 + 13*x + 29 peste Câmp finit de dimensiunea 101
Curba eliptică definită de y^2 = x^3 + 52*x + 30 peste Câmp finit de dimensiunea 101
(28:62:1) 3
(8 : 7 : 1) 37
TypeError: Coordonatele [94, 53, 1] nu definesc un punct pe curba eliptică definit de y^2 = x^3 + 52*x + 30 peste Câmp finit de dimensiunea 101
Cum pot efectua acest atac pentru o răsucire pătratică unde $d \neq -1$?