Message d’erreur
Invalid EC key. Point is not on the curve specified.
Reproduit avec cryptography 50.0. EllipticCurvePublicKey.from_encoded_point() signale le même échec de façon plus laconique, sous la forme « Invalid EC key. ». D’autres piles le formulent autrement (la pile d’erreurs d’OpenSSL 1.1 indique « point is not on curve », Node rejette la JWK avec « Invalid JWK EC key »), mais les mathématiques derrière tous ces messages sont identiques.
Python cryptography — ValueError from EllipticCurvePublicNumbers.public_key()
Ce que cela signifie
Le couple (x, y) que vous avez fourni ne satisfait pas l’équation y² = x³ + ax + b (mod p) de la courbe que vous avez indiquée. Les bibliothèques le vérifient à l’import, car accepter des points hors de la courbe rend possibles des attaques par courbe invalide, qui peuvent révéler des clés privées : ce rejet est donc un garde-fou, pas du pinaillage. Le contrôle se résume à une évaluation peu coûteuse de l’équation de la courbe, et toute bibliothèque sérieuse l’effectue : un point hors de la courbe sera rejeté quelque part, et mieux vaut que ce soit ici, avec une erreur explicite, que plus loin en aval.
Pourquoi cela se produit
Des coordonnées associées à la mauvaise courbe
fréquenteUn point secp256k1 (Bitcoin/Ethereum) déclaré comme SECP256R1/P-256, ou l’inverse. Les deux courbes utilisent des coordonnées de 32 octets, donc rien d’autre ne repère l’inversion ; l’équation de la courbe, si.
Octets de coordonnée corrompus ou tronqués
fréquenteUn zéro initial supprimé (coordonnée de 31 octets), un hexadécimal décodé avec une erreur de décalage d’une unité, une confusion entre base64 et base64url, ou un seul bit inversé : toute modification de x ou de y fait presque sûrement sortir le point de la courbe.
Mauvais ordre des octets
occasionnelleLes coordonnées sont en big-endian dans tous les encodages standard. Des octets inversés en little-endian (fréquent lors d’échanges avec du matériel ou avec du code écrit à la main) décrivent un point complètement différent, hors de la courbe.
Comment corriger l’erreur
- 1.
Construire la clé à partir du point encodé, avec la bonne courbe
from_encoded_point valide la longueur et la structure en une seule étape ; essayez l’autre courbe candidate si votre source est ambiguë.
python from cryptography.hazmat.primitives.asymmetric import ec point = b"\x04" + x_bytes + y_bytes # uncompressed, 65 bytes for P-256 key = ec.EllipticCurvePublicKey.from_encoded_point(ec.SECP256R1(), point) # if that raises, test: ec.SECP256K1() — the other 256-bit suspect - 2.
Vérifier les éléments bruts
Vérifiez que les longueurs sont bien de 32 octets et que les valeurs sont plausibles avant de construire la clé ; rétablissez par un remplissage à gauche les zéros supprimés.
python print(len(x_bytes), len(y_bytes)) # must be 32, 32 for P-256 x_bytes = x_bytes.rjust(32, b"\x00") # repair stripped leading zeros y_bytes = y_bytes.rjust(32, b"\x00")