Aller au contenu principal

5.2.3 Decoding (Décodage)

5.2.3 Decoding (Décodage)

Le décodage d'un point, donné comme une chaîne de 57 octets, est un peu plus compliqué.

  1. D'abord, interpréter la chaîne comme un entier en représentation little-endian. Le bit 455 de ce nombre est le bit de poids faible de la coordonnée x ; noter cette valeur x_0. La coordonnée y est récupérée 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+1)/4). On peut le faire avec l'astuce suivante, pour n'utiliser qu'une seule exponentiation modulaire à la fois pour l'inversion de v et la racine carrée :

                         (p+1)/4    3            (p-3)/4
x = (u/v) = u v (u^5 v^3) (mod p)
  1. Si v * x^2 = u, la coordonnée x récupérée est x. Sinon, aucune racine carrée n'existe 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).