ecdsa implementiert ECDSA und EdDSA in reinem Python, ohne OpenSSL darunter. Dadurch lässt es sich überall leicht installieren und eignet sich gut für Testvektoren und die Lehre; außerdem ist es noch immer eine Abhängigkeit älterer JOSE-Stacks wie python-jose. Laut den Maintainern ist die Bibliothek nicht dafür ausgelegt, Seitenkanalangriffen zu widerstehen, deshalb gehört das Signieren in Produktivsystemen in pyca/cryptography oder coincurve.
Drei Standardeinstellungen verursachen fast jeden Interoperabilitätsfehler. Der Hash ist standardmäßig SHA-1: Ein Objekt SigningKey, das ohne hashfunc erzeugt wurde, signiert SHA-1-Digests, was die Prüfung bestätigte – mit pyca/cryptography geprüft, bestand die Standardsignatur mit SHA-1 und scheiterte mit SHA-256. Die Signatur ist rohes r‖s (64 Byte bei P-256), nicht DER. Und VerifyingKey.to_string() liefert das bloße 64 Byte lange x‖y ohne Präfix 0x04, das OpenSSL, Go und WebCrypto nicht als Punkt lesen.
Beim Signieren wird eine zufällige Nonce verwendet, sofern du nicht sign_deterministic() aufrufst; diese Methode reproduzierte den P-256-Testvektor aus RFC 6979. s bleibt so, wie es berechnet wurde – in etwa der Hälfte der Fälle hoch –, sofern du keinen der Encoder *_canonize wählst, und die Prüfung akzeptiert beide Hälften. Jede Wahl der Kodierung wird pro Aufruf über sigencode= und sigdecode= getroffen, daher müssen signierende und prüfende Seite dasselbe Paar angeben; eine DER-Signatur, die an den standardmäßigen Decoder für rohe Signaturen übergeben wird, löst BadSignatureError: Malformed formatting of signature aus.
Die Kurvenunterstützung ist die breiteste unter den Python-Bibliotheken – P-224 bis P-521, secp256k1 und Brainpool –, dazu kommen Ed25519 und Ed448. Schlüssel werden als SPKI-PEM oder -DER, SEC1-Punkte und rohe Skalare eingelesen; to_pem() schreibt SEC1 EC PRIVATE KEY, sofern du nicht format="pkcs8" übergibst.
Das Beispiel korrigiert alle drei Standardeinstellungen auf einmal: SHA-256, eine deterministische Nonce und eine kanonische Low-S-DER-Signatur. Um eine damit erzeugte Signatur gegen eine andere Bibliothek zu prüfen, sind der Konverter DER ⇄ Raw und die Testvektoren der schnellste Weg.