[curves] Edwards: recovering x from y
ron at flownet.com
Fri Oct 23 08:45:01 PDT 2015
On Oct 23, 2015, at 5:57 AM, Nathaniel McCallum <npmccallum at redhat.com> wrote:
> Is there a generic way to do this?
Yes. It’s just elementary algebra. An Edwards curve has the form:
y^2 + x^2 = 1 + d(x^2)(y^2)
Just solve for x. The answer turns out to be:
x = sqrt((y^2 -1) / (d(y^2) - 1))
> The official Ed25519 code (in python) has a function for this but it
> depends on some constants and I can't infer what they are doing. In
> particular, I'd like to recover x from y with Ed448.
The Ed25519 code is slightly different because Ed25519 is a twisted Edwards curve, i.e.
y^2 +a(x^2) = 1 + d(x^2)(y^2)
For Ed25519, a = -1 so you end up with d(y^2)+1 instead of d(y^2)-1 in the denominator. The rest of the black magic in the Ed25519 xrecover routine is the modular square root computation. I think that code makes some optimizations based on the value of the field modulus (i.e. 2^255-19) so you can’t use that code directly for Ed448 (but I could be wrong about that).
You can always check your result by plugging X and Y into the original curve equation and see if the two sides are equal.
More information about the Curves