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
Koordinaten mit der falschen Kurve kombiniert
häufigEin secp256k1-Punkt (Bitcoin/Ethereum), als SECP256R1/P-256 deklariert – oder umgekehrt. Beide Kurven verwenden 32-Byte-Koordinaten, deshalb fällt die Verwechslung sonst nirgends auf; die Kurvengleichung bemerkt sie.
Beschädigte oder abgeschnittene Koordinatenbytes
häufigEine entfernte führende Null (31-Byte-Koordinate), Hex mit einem Off-by-one-Fehler dekodiert, base64 mit base64url verwechselt oder ein einzelnes gekipptes Bit – so gut wie jede Änderung an x oder y führt von der Kurve weg.
Falsche Bytereihenfolge
gelegentlichKoordinaten sind in jeder Standardkodierung Big-Endian. In Little-Endian umgedrehte Bytes (häufig bei der Anbindung von Hardware oder in selbst geschriebenem Code) beschreiben einen völlig anderen Punkt – einen außerhalb der Kurve.
So behebst du den Fehler
- 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.
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")