OpenSSL und Secp256k1 unterscheiden sich in der Implementierung von ECDSA-Signaturen?

OpenSSL (ab sslMac OS X Version 10.11.6) und Secp256k1 (aus dem Bitcoin-Core- Repository) scheinen sich in ihren Implementierungen von ECDSA zu unterscheiden. Ich habe Probleme mit diesen Unterschieden und möchte sicherstellen, dass sie tatsächlich existieren, und wenn ja, wie ich die Unterschiede in Einklang bringen kann.

Wenn ich beispielsweise OpenSSL verwende, können die wiederherstellbaren Signaturen, die ich erhalte, mit einem beliebigen Byte enden. Aus dieser Zeile in Secp256k1 geht jedoch hervor, dass das 65te Byte (dh das letzte Byte) zwischen 0und 4einschließlich liegen muss.

Wenn dies der Fall ist, warum lässt OpenSSL dann zu, dass das letzte Byte, das anscheinend als bezeichnet rec_idwird, irgendeinen Wert hat?

Antworten (1)

Der Code, auf den Sie sich in libsecp256k1 beziehen, ist nicht für ECDSA.

Es implementiert die benutzerdefinierten kompakten Signaturen, die Bitcoin Core zum Signieren und Verifizieren von Nachrichten verwendet.

Der normale ECDSA-Code in libsecp256k1 sollte in der Akzeptanz mit dem in OpenSSL identisch sein (abgesehen von der Tatsache, dass er standardmäßig nur Low-s-Signaturen akzeptiert und erzeugt, um das Formbarkeitspotenzial zu verringern).

Wo soll ich suchen? Muss secp256k1_schnorr.hich den Header wirklich verwenden?
Nein, das ist für Schnorr-Signaturen (ein weiterer experimenteller Signaturtyp). Sie müssen secp256k1_ecdsa_parse_der verwenden, um eine Signatur zu laden, und secp256k1_ecdsa_verify, um sie zu überprüfen. Die "wiederherstellbaren" Dinge dienen zum Signieren von Nachrichten.
Danke für die Hilfe! Eine letzte Frage - warum sind die Signaturen, die aus secp256k1 kommen, 64 Bytes statt 65? Und wie würde ich das 65. Byte generieren?
Lesen Sie die Dokumentation in den .h-Dateien.
Ich habe nachgesehen und kann außer einem niedrigeren S-Format (64 Byte) und einem serialisierten Format (70 Byte) nichts finden. Es scheint nichts mit 65 Bytes zu geben.
Die wiederherstellbare Signatur, wie sie beim Signieren von Nachrichten verwendet wird, beträgt 65 Byte. Siehe secp256k1_ecdsa_recoverable_signature_serialize_compact, um diese zu erstellen. Verwenden Sie für die normalen Signaturen von Bitcoin secp256k1_ecdsa_signature_der.