Aller au contenu principal

5.1.3 Decoding

5.1.3 Decoding (Décodage)

Décoder un point, donné comme une chaîne de 32 octets, est un peu plus compliqué.

  1. D'abord, interpréter la chaîne comme un entier en représentation little-endian. Le bit 255 de ce nombre est le bit le moins significatif de la coordonnée x ; noter cette valeur x_0. La coordonnée y se récupère simplement en effaçant ce bit. Si la valeur résultante est >= p, le décodage échoue.

  2. Pour récupérer la coordonnée x, l'équation de la courbe implique x^2 = (y^2 - 1) / (d y^2 + 1) (mod p). Le dénominateur est toujours non nul modulo p. Soit u = y^2 - 1 et v = d y^2 + 1. Pour calculer la racine carrée de (u/v), la première étape est de calculer la racine candidate x = (u/v)^((p+3)/8). On peut le faire avec l'astuce suivante, en une seule exponentiation modulaire pour l'inversion de v et la racine carrée :

                 (p+3)/8      3        (p-5)/8
x = (u/v) = u v (u v^7) (mod p)
  1. Encore une fois, il y a trois cas :

    1. Si v x^2 = u (mod p), x est une racine carrée.

    2. Si v x^2 = -u (mod p), poser x <-- x * 2^((p-1)/4), ce qui est une racine carrée.

    3. Sinon, aucune racine carrée n'existe modulo p, et le décodage échoue.

  2. Enfin, utiliser le bit x_0 pour choisir la bonne racine carrée. Si x = 0 et x_0 = 1, le décodage échoue. Sinon, si x_0 != x mod 2, poser x <-- p - x. Retourner le point décodé (x,y).