defund

@defund

Joined on Oct 24, 2018

  • This challenge is about the CSIDH key exchange protocol. I referenced the original paper as well as Craig Costello's tutorial on supersingular isogeny key exchange. We're given a "buggy" CSIDH implementation which does not actually work --- in fact, the computation is not even deterministic. On a remote server, Alice generates a private key and performs up to 500 key exchanges with us. Comparing against Algorithm 2 in the CSIDH paper, I found that the implemention does not check whether $[k] P$ is the point at infinity. Recall that $[k] P$ is intended to be of order $\ell$, so that we obtain an $\ell$-isogeny. But this is impossible if $\ell$ does not divide the order of the randomly generated point, which occurs with probability $1/\ell$. When this happens, the order of $[k] P$ is $1$ and we obtain the identity map. This is essentially a no-op, but the exponent is still decremented as if we performed an $\ell$-isogeny! The upshot is that Alice will often fail to apply the full class-group action given by her private key. Let $E_A = [\cdots \mathfrak{l}_i^{e_i} \cdots] E_0$ be Alice's public curve. Due to the faults, Alice instead computes $[\cdots \mathfrak{l}_i^{e_i - k_i} \cdots] E_0$, where $e_i, k_i$ have the same sign and $|k_i| \leq |e_i|$. To sample curves near $E_A$, we can submit a public key $[\mathfrak{b}] E_0$ and apply $\mathfrak{b}^{-1}$ to the response (make sure to patch the implementation). Let's visualize a graph with curves as vertices and prime ideals as edges. Since faults don't occur that often, the sample curves are close to $E_A$ and hence one another. Finding paths between them can be done with a meet in the middle algorithm. The idea is to perform a depth-2 search from each sample and cache all visited curves. The collisions will identify all paths of length at most 4. In practice, I was able to consistently unify all 500 samples into a connected component.
     Like  Bookmark
  • Help!!! Our Crypto guy left in a furious rage and deleted our company private key and part of our signatures! We use that key to sign all of our important documents and such. This should be enough information for you to figure it out: Curve: NIST256P HASH: SHA256 Generator X: 48439561293906451759052585252797914202762949526041747995844080717082404635286 Generator Y: 36134250956749795798585127919587881956611106672985015071877198253568414405109 Group Order: 115792089210356248762697446949407573529996955224135760342422259061068512044369 Point X: 62642270921362628024101430148161419180734994811675578761489832783807341294140 Point Y: 620508080568073990375228521563014425211330352832293590138091382461067773777
     Like  Bookmark