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?
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.
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.
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.
eth.getTransaction
, aber ich sehe keinen Hinweis, um eine Öffentlichkeit daraus abzurufen.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 B
Schlü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 d
von B
und abrufen A
.
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.
Beweis ist wie folgt,
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.
Kronos
Luis Soares
Luis Soares
Luis Soares
Ismael