Wie werden komprimierte PubKeys generiert?

Lesen Sie einfach dies: https://bitcoin.stackexchange.com/a/1715/

Was ist der Prozess, um komprimierte Pub-Schlüssel über ECDSA zu generieren?

interessiert, die Antworten zu hören - ich dachte, der Privkey und der Pubkey wären nur über ECDSA verknüpft. Beide sind einfach Hex-Zahlen ... (von Punkten auf der Kurve tralala). Und mit dem privkey base58encoded geht es zum WIF privkey. Vor dem Codieren ein zusätzliches Hex "01" hinzugefügt, ich habe einen WIF-c (komprimierten) Privkey, von dem ich komprimierten Pubkey ableite. Warten auf die Antworten...

Antworten (2)

Es gibt keinen speziellen Algorithmus zum Generieren komprimierter Pubkeys aus privaten Schlüsseln. Tatsächlich werden alle internen Berechnungen, die Punkte betreffen, unter Verwendung sowohl der x als y auch der Koordinaten der beteiligten Punkte durchgeführt. Es gibt keine andere Möglichkeit, Punkte zu bearbeiten, als die (x,y)Koordinaten zu verwenden. Eine komprimierte Darstellung des Punktes ist bei der Datenübertragung und -speicherung nützlich, da nur 33 Bytes im Gegensatz zu 65 Bytes benötigt werden, um den Punkt zu übermitteln. Es ist sehr einfach, compressed -> uncompressedbei Bedarf punktbezogene Operationen auszuführen, und noch einfacher, die uncompressed -> compressedDarstellung zu verlassen. Um Ihre Frage zu beantworten, würden Sie den öffentlichen Schlüssel generieren, wie Sie es normalerweise mit einem unkomprimierten Pubkey tun würden, und wenn Sie fertig sind, suchen Sie nach Gleichmäßigkeit oder Ungeradheit vonykordinieren. Wenn es gerade ist, codieren Sie nur die xKoordinate mit einem Präfix 0x02-Byte, und wenn es ungerade ist, ist das Präfix 0x03. Um von compressed -> uncompressed(eigentlich nur die ursprüngliche yKoordinate zu finden) zurückzukehren, würden Sie einfach die Gleichung der Kurve lösen:

y^2 = x^3 + a*x + b

Speziell für secp256k1 ist die in Bitcoin verwendete Kurve anull, was diese Berechnung vereinfacht, und es gibt eine Abkürzung: aufgrund einer Eigenschaft des Parameters der Kurve p, wo wir in der Lage sind, die Koordinate von einer Koordinate einfach durch Berechnung p ≡ 3 mod 4abzuleiten :yx

q = (p+1) * invmod(4)  mod p
y = powmod(y^2,q)      mod p

Und da haben wir die ursprüngliche yKoordinate zurück.

"Es braucht 33 Bytes im Gegensatz zu 65 Bytes, um den Punkt zu übermitteln" - enthält es die Präfixe für die Punktberechnungen?
Das Präfix wird nur von der Software verwendet, die den Punkt als Daten liest und schreibt. Es zeigt der Software an, welche Art von Schlüssel gelesen wird, und wenn es sich um einen komprimierten Schlüssel handelt, welche der beiden möglichen yKoordinaten sie beim Dekomprimieren des Punkts wählen sollte.

mit ein bisschen hilfe von arubi kam ich dazu, dieses bild zu zeichnen. Der blaue Teil ist die ECDSA-Logik. WIF-Schlüssel und Privatschlüssel werden über base58check-en-/decoding verknüpft. Je nachdem, wie Sie den Privkey bereitstellen (komprimiert oder unkomprimiert), entscheidet die Software, wie der Pubkey und die Bitcoin-Adresse erstellt werden. Offensichtlich unterscheidet sich die Bitcoin-Adresse für komprimierte/unkomprimierte Schlüssel. Bei unkomprimierten Schlüsseln haben Sie den 512-Bit-Pub-Schlüssel mit den x/y-Komponenten, während der komprimierte Pub-Schlüssel nur als x-Komponente dargestellt werden kann. Die Software fügt das Präfix 04 für unkomprimiert oder 02 (wenn y gerade ist) oder 03 (wenn y ungerade ist) hinzu und verwendet es als Eingabe für sha256/ripemd160, um den Pubkey-Hash zu erstellen. Beim letzten Schritt gibt es wieder eine base58check-Kodierung, bei der eine Prüfsumme beteiligt ist.

privkey - ECDSA - Bitcoin-Adresse

Beispiel (Testnetz):

privkey Hex:   18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
privkey WIF:   91msh178DnLBqFhbuYqazuUwWpKBkRQvgj8bggdWMp81nVp9PfM
privkey WIF-c: cNR4jZU2sR5goytD4wXT4aeKcbqGSekbxLxY69v8aryxTU1SMnJZ

pubkey hex unkomprimiert (04 + x + y):

04 50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B2352 2CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

pubkey hex komprimiert (02 + x, y=gerade):

02 50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B2352

entsprechende Bitcoin-Adressen:

  (pubkey uncompressed): mfcSEPR8EkJrpX91YkTJ9iscdAzppJrG9j
  (pubkey compressed):   n3svudhm7bt6j3nTT9uu1A57Cs9pKK3iXW
Schönes Diagramm! Der Vollständigkeit halber gibt es außer komprimiert und unkomprimiert einen anderen gültigen öffentlichen Schlüsseltyp, der als „Hybrid“ bezeichnet wird. Es codiert sowohl die Koordinaten als auch xund yseine Länge beträgt 1 + 64 Bytes (wie ein unkomprimierter Pubkey), aber das Präfix-Byte könnte entweder 0x07oder sein 0x06.
Grundsätzlich weist die Gerade oder Ungerade des Präfixbytes auf die Gerade oder Ungerade der yim Schlüssel codierten Koordinate hin. Ich glaube nicht, dass im Mainnet jemals ein Hybridschlüssel verwendet wurde, aber es ist dennoch ein gültiger Pubkey und kann in einem Skript erscheinen. Es gibt keine WIF-Codierung eines hybriden privaten Schlüssels, aber jeder könnte ein p2pkh-Skript mit einem solchen Schlüssel signieren und einlösen, und wir würden es nicht wissen, bis es zur Ausgabe weitergeleitet wird. Wenn Sie ihn in Ihr Diagramm integrieren, wäre der Pubkey eine Eingabe für den dritten Schritt.
Ich habe noch nie von diesen Hybridschlüsseln gehört und frage mich nur, was der Privatschlüssel in Hex-Darstellung ist. Irgendwelche Links, die Sie kennen? Natürlich möchte ich es auf testnet/regtest versuchen. Übrigens: Ein ähnliches Diagramm war in Ken Shirriffs berühmtem „ righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html “. Es war nur gegen den Uhrzeigersinn - und für mich kontraintuitiv :-). Ich habe es abgeflacht und die komprimierte Logik hinzugefügt.
Der private Schlüssel als Zahl im Hexadezimalformat ist genauso. Soweit ich weiß, gibt es keine Schnittstelle zu einer Brieftasche, die mit Hybridschlüsseln umgehen kann, sodass Sie die Rohtransaktion selbst erstellen müssen. Es sollte genauso sein wie die Ausgabe jedes anderen Skripts, das ein Prüfzeichen enthält. Außerdem weiß ich nicht, ob selbst die testnet\regtest-Richtlinie der Knoten eine solche Ausgabe zulässt. Möglicherweise müssen Sie die Richtlinie auf Ihrem eigenen Knoten anpassen und selbst abbauen.