Auf cryptography greift der meiste Python-Code – PyJWT, Authlib, paramiko, certbot, die SDKs von AWS und Google – für echte Kryptografie zurück. Die Schicht hazmat macht Schlüssel und Signaturen direkt zugänglich; die Wheels bringen ein eigenes OpenSSL mit, sodass sich das Verhalten nach der Paketversion richtet und nicht nach dem Betriebssystem (50.0.2 liefert OpenSSL 4.0.3 mit).
ECDSA-Signaturen kommen als ASN.1-DER heraus, und verify() erwartet DER. WebCrypto, JWS und die meisten Hardware-Tokens verwenden die 64 Byte lange rohe Form r‖s, die verify() mit derselben Ausnahme InvalidSignature ablehnt wie eine gefälschte Signatur. decode_dss_signature und encode_dss_signature konvertieren zwischen DER und dem Paar ganzer Zahlen; das Padding auf feste Breite fügst du selbst hinzu, genau wie es das Beispiel zeigt, oder du prüfst von Hand mit dem Konverter DER ⇄ Raw.
Die Nonce ist zufällig, sofern du nicht RFC 6979 anforderst: ec.ECDSA(hashes.SHA256(), deterministic_signing=True) reproduzierte den P-256-Testvektor des RFC exakt – einschließlich seines High-S-Werts, denn nichts im Paket normalisiert s, und die Prüfung akzeptiert beide Hälften. Bei Signaturen, die an einen Low-S-Verifizierer wie libsecp256k1 oder @noble/curves gehen, musst du s zuerst durch n − s ersetzen. sign() und verify() hashen die Daten selbst; übergib Prehashed(hashes.SHA256()), wenn du bereits einen Digest hast, sonst hashst du doppelt.
Die Kurvenabdeckung ist breit – P-224 bis P-521, secp256k1 und die Brainpool-r1-Kurven –, dazu kommen in 50.0.2 Ed25519, Ed448, ML-KEM-768/1024 und ML-DSA-44/65/87. Schlüssel lassen sich aus PEM und DER (SPKI, PKCS#8, verschlüsseltes PKCS#8, SEC1), OpenSSH und bloßen SEC1-Punkten laden; einen JWK-Leser gibt es nicht, JWKs laufen daher über PyJWT, Authlib oder jwcrypto oder über den JWK-Konverter.
Die meisten Fehler, nach denen gesucht wird, entstehen beim Laden von Schlüsseln, nicht beim Signieren: ein öffentlicher Schlüssel, der an load_pem_private_key übergeben wird, ein verschlüsselter Schlüssel ohne Passwort oder ein Punkt, der nicht auf der benannten Kurve liegt. Der Signatur-Verifizierer und das Interop-Cheatsheet für Bibliotheken helfen, wenn eine Signatur aus einem anderen Stack die Prüfung einfach nicht bestehen will.