Wie kann man die Öffentlichkeit von der TX-Signatur (r, s) wiederherstellen und die Signatur überprüfen?

Meine erste Frage ist, wie man die Signatur nur mit r, s und elliptischen Kurvenparametern und einer Adresse verifiziert (die aus öffentlichem Schlüssel gehasht ist, also öffentlichen Schlüssel nicht von der Adresse abrufen kann)?

Die nächste Frage ist, warum Ethereum (ich glaube auch Bitcoin) einen gehashten öffentlichen Schlüssel als Adresse verwendet, anstatt den öffentlichen Schlüssel direkt als Adresse zu verwenden?

Antworten (3)

Vielleicht kann Ihnen diese Antwort weiterhelfen - https://ethereum.stackexchange.com/a/33346/16729

Das Sicherheitsmodell von Ethereum stützt sich auf Elliptische-Kurven-Kryptografie (ECC), um Transaktionen zu signieren und zu validieren. In ECC werden öffentliche und private Schlüssel zum Signieren und Verifizieren verwendet. Es hat kein Konzept von Adressen. Beim Signieren und Verifizieren von Transaktionen benötigen Sie keine Adressen. Das ursprüngliche Bitcoin-Papier erwähnt überhaupt keine Adressen. Sie erscheinen später, um sie leichter zu merken (komprimierter öffentlicher Schlüssel sind 32 Bytes im Vergleich zu 20 Bytes für die Adresse). Jetzt können Sie den öffentlichen Schlüssel vollständig vor der Benutzerinteraktion verbergen und haben nur noch den privaten Schlüssel und die Adressen. Aber intern verwendet Ethereum sie weiterhin, um Transaktionen zu validieren.

Aber intern werden sie weiterhin verwendet, um Tx zu validieren ... Ich verstehe es immer noch nicht. Da sich der Keystore-Ordner (in dem der verschlüsselte private Schlüssel und der öffentliche Schlüssel als Datei gespeichert sind) nur in meinem Knoten befindet, nicht in jedem Knoten. Aber woher kennen andere Knoten meinen öffentlichen Schlüssel, um meine Transaktion zu validieren?
Es gibt eine Herausforderung, wo es um Adressen und Konten geht. Ich kann den Thread noch nicht lesen, da ich den Challenger noch nicht beendet habe und keine Spoiler lesen möchte. Aber ich denke, es kann dir helfen. Hier ist das Reddit: reddit.com/r/capturetheether
und hier ist die Herausforderung: capturetheether.com/challenges/accounts/public-key
Und ich habe gerade das hier gefunden: ethereum.stackexchange.com/questions/13778/…
@Kronos Ethereum verwendet eine mathematische Eigenschaft, um den öffentlichen Schlüssel aus einer signierten Transaktion wiederherzustellen, und leitet dann die Adresse durch Anwenden der Hash-Funktion keccak256 ab (suchen Sie nach den mathematischen Details für die Wiederherstellung des öffentlichen Schlüssels von ECDSA).
  1. In Sachen Sicherheit:

Der öffentliche Schlüssel in allen Kryptografieschemata ist mit dem privaten Schlüssel verwandt . Die einzige sichere Maßnahme , die einen Benutzer daran hindert, Ihren privaten Schlüssel aus Ihrem öffentlichen Schlüssel zu berechnen, ist die Annahme, dass der diskrete Logarithmus "unmöglich zu lösen" ist.

Wir alle wissen, dass sich die Quantenkryptographie jeden Tag mehr nähert, und das Problem, das dies mit sich bringt, ist, dass das Lösen diskreter Logarithmen "einfach" ist, wenn Sie einen Quanten-PC / eine Quanten-CPU betreiben . Mit dem Pk ist es also möglich, den Sk (Private Key) zu erhalten.

Um dem vorzubeugen, wenn Sie nur Zugriff auf den Hash der Pk haben, wissen Sie es nicht, also selbst mit Quantenkrypto (soweit es jetzt scheint, dass Quanten Hash-Funktionen nicht so einfach übergeben können ), sind Sie sicher.

Weitere Informationen zur Resistenz von Hash-Funktionen gegen Quantenkrypto finden Sie hier.

  1. In Bezug auf die Gasausgaben.

Die Länge eines öffentlichen Schlüssels ist so viel größer als sein Hash, der immer eine 256-Bit-Variable ist . Wenn Sie also alle Transaktionen zählen, die an einem Tag durchgeführt werden, sparen Sie viel Gas bei Transaktionen, da die öffentlichen Schlüssel die Miner und die Knoten dazu bringen, viel mehr Daten zu verarbeiten/zu speichern, weil sie so viel größer sind als ihre Hashes.

Ich kann die Erklärung erweitern, wenn Sie sie brauchen, aber im Wesentlichen ist es das.

BEARBEITEN WIE Sie in den Kommentaren fragen, haben Sie hier ein Thema, in dem erklärt wird, wie Sie die Pk aus ihrem Hash abrufen.

Holen Sie sich den öffentlichen Schlüssel eines beliebigen Ethereum-Kontos

Ich hoffe es hilft.

Ich frage nicht, wie man den privaten Schlüssel vom öffentlichen Schlüssel abruft. Ich frage, wie man die Signatur ohne öffentlichen Schlüssel verifiziert? Weil der Miner nur seine Adresse kennt, nicht den öffentlichen Schlüssel. Die Adresse wird jedoch durch Hash abgeschnitten, sodass es nicht möglich ist, den öffentlichen Schlüssel von einer Adresse abzurufen.
@Kronos Sie haben Recht, Sie können keinen öffentlichen Schlüssel von einer Adresse erhalten. Aber Sie können den öffentlichen Schlüssel von einer Transaktion erhalten, die von dieser Adresse gesendet wird. In der Praxis ist es also nur möglich, den öffentlichen Schlüssel einer Adresse zu erhalten, wenn diese Adresse mindestens 1 Transaktion gesendet hat.
Wissen Sie, wie Sie den öffentlichen Schlüssel von einem TX erhalten? Weil ich auch den Transaktionswert mit überprüft habe eth.getTransaction, aber ich sehe keinen Hinweis, um eine Öffentlichkeit daraus abzurufen.
@JesseBusman hat recht, Sie rufen es aus den tx-Details ab, sehen sie sich in den Protokollen oder auf Etherscan an. Eine Sache, die hinzugefügt werden muss, ist, dass, wie Ihre Frage formuliert ist, der Kommentar, den Sie hinterlassen haben, keinen Sinn hat. Sie haben gefragt, warum die Pk gehasht sind, und dies war die Antwort auf diese Frage.
@CPereez19 Wofür stehen Pk und Sk in deiner Erklärung? Da sowohl "öffentlicher Schlüssel" als auch "privater Schlüssel" mit "PK" oder "pk" abgekürzt würden, ist es für mich nicht so unterschiedlich.
crypto.stackexchange.com/questions/18105/… das könnte die Antwort auf meine Frage sein.
@TorstenS Da "Private Key" auch als pk abgekürzt wird, können Sie nicht zwischen den beiden unterscheiden. Aus diesem Grund werden private Schlüssel als „geheime Schlüssel“, abgekürzt Sk, bezeichnet
@CPereez19 von Etherscan, es gibt nur Adressen, Block-Hash und TX-Hash, Ankündigung, das ist alles. Kann immer noch nicht verstehen, wie man die Öffentlichkeit von TX bekommt.
@Kronos, das ist, wonach Sie suchen: github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md Und immer noch denkend, dass ich Sie richtig beantwortet habe, war Ihre Frage nicht heiß, um die Pk abzurufen es ist hasch..
@ CPereez19 Ein abgeschnittener Hash trägt nicht zur Sicherheit bei, Sie haben 2 ^ 160 Adressen für etwa 2 ^ 256 private Schlüssel, was bedeutet, dass Sie 2 ^ 96 private Schlüssel haben, die dieselbe Adresse teilen.
@Ismael Ich spreche von der Resistenz von Hash-Funktionen gegen Quantenkrypto im Vergleich zu tatsächlichen Kryptosystemen wie El-Gamal, Diffie Helman, ECDSA, DSA, RSA usw. Hier haben Sie eine Referenz: crypto.stackexchange.com/questions/59375/…
@ CPereez19 Vielleicht ist es für Bitcoin sinnvoll, dass Adressen nur eine Verwendung haben, aber für Ethereum ist es nicht sehr nützlich, denn wenn Sie jemals eine Transaktion signiert haben, kann jeder den öffentlichen Schlüssel berechnen.
Ich erkläre es nicht gut, wie ich sehe. Heutzutage können Sie, wenn Sie den öffentlichen Schlüssel haben, fast nichts tun (es gibt nur wenige komplexe Angriffe zur Rückverfolgbarkeit, aber es ist nicht der Schweinehund, sie zu erklären). Aber abgesehen von der Speichereinsparung (Hash ist kürzer als Pk) mit Quantenkrypto können Sie den Sk leicht aus dem Pk bekommen. Mit dem H(Pk) können Sie die Transaktion sicher durchführen, und wie Sie sagten, ist Ihre öffentliche Adresse jetzt für jeden sichtbar, sodass Sie den Ether auf ein anderes Konto verschieben und ihn bis zur nächsten Transaktion sicher haben können. Aus diesem Grund wird empfohlen, ein Konto nicht erneut zu verwenden.
@ CPereez19 Sie sagen, dass der diskrete Logarithmus für ECC auf Quantencomputern gelöst wird, also erhalten Sie mit Pk leicht Sk. Und mit H(Pk) und einer signierten Transaktion können Sie ECDSA-Wiederherstellung anwenden und Pk trivial erhalten. Die Anwendung von H() trägt also zur Sicherheit bei, aber nur, wenn Sie Adressen, dh Bitcoin, nicht wiederverwenden. Wenn Sie Adressen wie in Ethereum wiederverwenden, trägt dies nicht zur Sicherheit bei.

Ich habe herausgefunden, wie ich den öffentlichen Schlüssel aus tx (Signatur, r und s) und seiner Adresse wiederherstellen kann.

Zunächst wird hier die Signatur generiert, der öffentliche BSchlüssel ist , und der private Schlüssel ist d, wobei B = dA. (Multiplikation auf elliptischer Kurve). Es ist WIRKLICH schwer (oder einfach, weil wir P=NP nicht wissen oder nicht), also können wir nicht dvon Bund abrufen A.

Geben Sie hier die Bildbeschreibung ein

Und die Öffentlichkeit kann wie folgt wiederhergestellt werden, und die Anzahl der Kandidaten für öffentliche Schlüssel ist zwei, weil wir nur die x-Koordinate von kennen R. So ist es einfach, einen öffentlichen Schlüssel zu finden, der aus der Adresse echt ist.

Geben Sie hier die Bildbeschreibung ein

Beweis ist wie folgt,

Geben Sie hier die Bildbeschreibung ein

bitte korrigiert mich, wenn etwas nicht stimmt. Es scheint, dass es in https://github.com/cryptocoinjs/secp256k1-node eine nützliche Funktion gibt , .recover(Buffer message, Buffer signature, Number recovery [, Boolean compressed = true])um den öffentlichen Schlüssel wiederherzustellen.

Das ist ECDSA basierend auf der secp256k1-Kurve. Sie können die Informationen nur abrufen, wenn Sie den Cyclyc-Gruppengeneratorzeitraum kennen. Anders ist es heutzutage unmöglich, es zu bekommen. Dies ist dasselbe wie bei RSA zu sagen, dass Sie die Nachricht nur erhalten können, wenn Sie die Sk kennen. weil der diskrete Logarithmus so schwer zu lösen ist. Sagen Sie Ihnen auch, dass Pk und Sk Punkte der elliptischen Kurve sind. Von hier aus werden Paarungen und andere Hauptkomponenten von ZkSnarks geboren. Hier haben Sie gute Vorträge, um darüber zu lernen.
@ CPereez19 Das ist richtig, ich muss wissen, welche Kurve verwendet wird (alle Parameter, die ich kennen muss), um den öffentlichen Schlüssel wiederherzustellen.