Zum Inhalt springen
ecdsa.com
Python cryptographyPython cryptography

Fehlermeldung

Invalid EC key. Point is not on the curve specified.

Reproduziert mit cryptography 50.0. EllipticCurvePublicKey.from_encoded_point() meldet denselben Fehler knapper, als „Invalid EC key.“. Andere Stacks formulieren es anders – der Fehler-Stack von OpenSSL 1.1 meldet „point is not on curve“, Node lehnt den JWK mit „Invalid JWK EC key“ ab –, doch die Mathematik dahinter ist bei allen dieselbe.

Python cryptography — ValueError from EllipticCurvePublicNumbers.public_key()

Was der Fehler bedeutet

Das angegebene Paar (x, y) erfüllt die Kurvengleichung y² = x³ + ax + b (mod p) der genannten Kurve nicht. Bibliotheken prüfen das beim Import, weil das Akzeptieren von Punkten außerhalb der Kurve Invalid-Curve-Angriffe ermöglicht, über die private Schlüssel abfließen können – die Ablehnung ist also eine Sicherheitsprüfung, keine Pedanterie. Die Prüfung ist eine einzige, billige Auswertung der Kurvengleichung, und jede ernstzunehmende Bibliothek führt sie durch: Ein Punkt außerhalb der Kurve wird irgendwo abgelehnt, und besser hier, mit einer deutlichen Fehlermeldung, als erst weiter hinten in der Verarbeitung.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schlüssel aus dem kodierten Punkt bauen, mit der richtigen Kurve

    from_encoded_point prüft Länge und Struktur in einem Schritt; probiere die andere infrage kommende Kurve, wenn deine Quelle nicht eindeutig ist.

    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.

    Rohdaten prüfen

    Prüfe vor dem Zusammenbauen, ob die Längen 32 Byte betragen und die Werte plausibel sind; fülle entfernte Nullen links wieder auf (Left-Padding).

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen