-
-
Save mcieno/f0c6334af28f60d244fa054f5a1c22d2 to your computer and use it in GitHub Desktop.
# Setup curve | |
p = 17 | |
a, b = 1, -1 | |
E = EllipticCurve(GF(p), [a, b]) | |
G = E.gen(0) | |
# Target secret key | |
d = 8 | |
# Public point | |
P = d * G | |
del d | |
# Find the embedding degree | |
# p**k - 1 === 0 (mod order) | |
order = E.order() | |
k = 1 | |
while (p**k - 1) % order: | |
k += 1 | |
assert k <= 6 | |
K.<a> = GF(p**k) | |
EK = E.base_extend(K) | |
PK = EK(P) | |
GK = EK(G) | |
d = 0 | |
while P != d * G: | |
QK = EK.random_point() | |
if QK.order() != E.order(): | |
continue | |
AA = PK.tate_pairing(QK, E.order(), k) | |
GG = GK.tate_pairing(QK, E.order(), k) | |
d = AA.log(GG) | |
print(F"{d=}") |
By the way, your code doesn t works on binary curves (even on isogeny 3).
It complains at line 23 that the parameter to GF
isn t a prime power.
Feel free to suggest improvements :)
While I know how to compute bilinear pairings and I understand the aim, I’ve absolutely no idea about what :
EK = E.base_extend(K)
does (I’m meaning the function). Looks like you’ll have to find a SageMath alternative to do this.
By the way, did you test your code to see if it works on easy samples ?
Was tested on
p = 3009944491747103173592552029257669572283120430367
a, b = 1, 0
E = EllipticCurve(GF(p), [a, b])
G = E(2900641855339024752663919275085178630626065454884, 1803317565451817334919844936679231131166218238368)
P = E(10654737690719804518827220655939579230832010880, 1272308004685912947962139770717466018620937245516)
which was a VolgaCTF 2020 Qualifier challenge.
@mcieno : and what about the case where the elliptic curve is binary curve ? In my case, I’ve
so obviously, as a result of the underlying finite field being a prime power, I can’t do something like point = E(integer,integer)
@ytrezq
Citing SafeCurves:
Hence,$k = 12$ is not considered "too large" in general, it's just very inefficient to do arithmetics on $F_{q^{12}}$ later.$k = 12$ and a "sextic twist" into $F_{q^{2}}$ .
For example, BLS12-381 is a pairing-friendly curve with
For fun, computing the base extension with$k = 1337$ for secp256k1 took me just a few seconds: