Eine vom Bitcoin-Qt-Client erstellte Signatur kann immer in ein 65-Byte-Array dekodiert (base64) werden. Dieses Array scheint (laut https://github.com/bitcoin/bitcoin/blob/master/src/key.cpp#L217 ) ein Header-Byte, einen 32-Byte-R-Teil und einen 32-Byte-S-Teil zu enthalten .
Ich habe einige (R,S)-Paare aus einigen ECDSA-Signaturen extrahiert, die im DER-Format codiert sind. Ich habe festgestellt, dass R und S nicht unbedingt 32 Byte groß sind. Sie können manchmal 33 Bytes lang sein. Kann mir jemand sagen, warum die vom Qt-Client erstellte Signatur immer 65 Byte groß ist oder ob es in Ordnung ist, sowohl R als auch S immer in ein 32-Byte-Array zu konvertieren? Vielen Dank.
Es werden zwei unterschiedliche Kodierungen verwendet.
Alles im Bitcoin-Protokoll, einschließlich Transaktionssignaturen und Alarmsignaturen , verwendet die DER-Codierung . Dies führt zu 71-Byte-Signaturen (im Durchschnitt), da mehrere Header-Bytes vorhanden sind und die R- und S-Werte eine variable Länge haben.
Für Nachrichtensignaturen wird eine benutzerdefinierte Codierung verwendet, die kompakter (und neuer) ist und die Wiederherstellung öffentlicher Schlüssel unterstützt (bei einer Nachricht und einer Signatur finden Sie heraus, welcher öffentliche Schlüssel sie erstellt hätte). Der Code, auf den Sie sich in der Frage beziehen, dient zum Erstellen solcher Signaturen.
Eine korrekte DER-codierte Signatur hat folgende Form:
0x30
: ein Header-Byte, das eine zusammengesetzte Struktur anzeigt.0x02
: ein Header-Byte, das eine Ganzzahl angibt.0x02
: ein Header-Byte, das eine Ganzzahl angibt.Wo Anfangsbytes 0x00
für R und S nicht erlaubt sind, außer wenn ihr erstes Byte sonst oben wäre 0x7F
(in diesem Fall ist ein einzelnes 0x00
davor erforderlich). Beachten Sie auch, dass innerhalb von Transaktionssignaturen ein zusätzliches Hashtyp-Byte auf die eigentlichen Signaturdaten folgt.
Ning
Morsecoder
Pieter Wuille
Morsecoder
Jus12
Cisco MMU
Pieter Wuille
Cisco MMU