Aller au contenu
ecdsa.com
Python cryptographycryptography (Python)

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

Comment corriger l’erreur

  1. 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. 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")

Erreurs associées

Parcourir toute la base de données des erreurs de signature