Wie kann ich `sha256^1000000000(X) = Y` für einen Prüfer beweisen, der nicht so viele Berechnungen durchführen kann?

Nehmen wir zum Beispiel an, ich möchte einen Ethereum-Vertrag schreiben, der 1 ETH für jeden zahlt, der mir die richtige Antwort auf gibt sha256^1000000000("good boy"). Dieser Rechenaufwand wäre viel höher als das Gaslimit von Ethereum, also brauche ich eine Möglichkeit, dies zu beweisen, sha256^1000000000("good boy") = Yohne so viel Rechenleistung auf der Seite des Verifizierers zu benötigen.

Wie kann das gemacht werden?

(Das ist eine schwächere Version meiner früheren Frage, die keine guten Antworten erhalten hat. Hoffentlich ist dieses Problem einfacher?)

Sie können einen iterierten Hash nicht schneller verifizieren. Sie können das Ergebnis offline vorberechnen und den Hash des erwarteten Ergebnisses speichern ( sha256(“str”)^.1000001). Wir könnten vielleicht eine bessere Methode empfehlen, wenn Sie uns das eigentliche Problem nennen, das Sie lösen möchten. Wenn dies ein Proof-of-Work-Szenario ist, verwenden Sie eine asymmetrische Methode wie zum Beispiel das PoW, das von Bitcoin verwendet wird (geben Sie mir eine Nonce, die zusammen mit meiner Herausforderung einen Hash generiert, der kleiner als eine definierte Schwierigkeit ist).
@eckes Nicht viel anders als das, was ich geantwortet habe , oder?
@e-sushi ja, aber um einen Prüfer öffentlich zu speichern (Verträge sind ausführbar), müssen Sie ein Ergebnis nach den erwarteten Iterationen (größerer Exponent) verwenden. Nicht vorher. Sonst könnten sie dort anfangen.
@eckes Ähm, was? Dieses öffentliche Überprüfungsergebnis, von dem Sie annehmen, dass es sich um eine Ethereum-Sache handeln könnte – was hier nicht zum Thema gehört und eher etwas für Ethereum.SE wäre. Da wir bei Crypto.SE sind, bin ich davon ausgegangen, dass der Prüfer das SHA-256-Ergebnis (Verifizierung) nicht „offen“ speichert. Dies wurde weder in der Frage beschrieben, noch gefragt. Ich bin also logischerweise davon ausgegangen, dass der Verifizierer das Verifizierungsergebnis geheim hält, bis ein berechnender Absender tatsächlich das richtige, passende Hash-Ergebnis sendet. Was Sie beschreiben, führt zu einem anderen Sicherheitsproblem, das nichts mit dem millionen- oder milliardenfachen Hashing einer Zeichenfolge zu tun hat.
Der Op bittet um einen Ethereum-Vertrag, um dies zu tun. Und die sind öffentlich.
@eckes In diesem Fall migriere ich es auf die passende Seite – Ethereum.SE

Antworten (2)

Das wird aus dem einfachen Grund, dass SHA-256 ein kryptografisch sicherer Hash ist und keine Möglichkeit bietet, dies zu tun, ohne die eigentlichen Berechnungen durchzuführen, nahezu unmöglich sein.

Außerdem gibt es keine bekannten Schwachstellen in SHA-256, die es uns ermöglichen würden, damit umzugehen. Wenn ja, wäre SHA-256 kaputt und definitiv nicht mehr kryptografisch sicher.

Die einzige Lösung wäre, Vorkenntnisse über einen verifizierten Teil der Berechnung zu haben; zum Beispiel $\text{SHA256}^{987654321} = X$, also hast du $X$ als Ausgangspunkt, der nicht erwartet, dass eine Wagenladung von Berechnungen dein $Y$ erhält, was länger dauern wird, als wir beide leben.

Doch selbst wenn jemand bereits Millionen von SHA-256-Runden auf der Zeichenfolge „guter Junge“ berechnet hat, müssen Sie immer noch irgendwie überprüfen, ob diese Vorberechnung tatsächlich korrekt und nicht fehlerhaft ist … was am Ende dasselbe Problem ist wie Sie. Ich muss wohl komplett neu rechnen.

Denken Sie kurz darüber nach – Ihr Szenario kommt einer Rechenkomplexität nahe, die mit der Komplexität verglichen werden könnte, die einige Kryptowährungs-Blockchains wie Bitcoin absichert, die andere, aber gleichermaßen zeit- und ressourcenaufwändige Berechnungen in ihrem „Proof Of Work“ verwenden.

Daher wäre mein Vorschlag, einfach die Komplexität von $$\text{SHA256("good boy")}^{1000000000}$$ auf etwas brauchbareres und erreichbareres $$\text{SHA256("good boy") zu reduzieren }^{1000000}$$

Ein Verifizierer, der nicht so viele Berechnungen durchführen kann, wird immer noch ein oder zwei Tage daran kauen, aber Sie können die Messlatte entsprechend Ihren spezifischen Anforderungen senken oder erhöhen.

Eines sollte klar sein: Mit einem kryptografisch sicheren Hash kann man nicht schneller verifizieren, als diesen komplett zu berechnen; genauso wie der rechnende Sender das Ergebnis, das Sie später verifizieren möchten, vollständig berechnen muss. Mehr Rechenressourcen führen logischerweise zu einer schnelleren Berechnung ... was ein Problem sein kann oder auch nicht, wenn Ihr Verifizierer nicht über dieselben Rechenressourcen wie die andere Partei verfügt. Darauf sollten Sie achten und achten, je nachdem, wie und/oder wo Sie Ihre Idee einsetzen/umsetzen möchten.

Wie ist das wahr? Es geht nicht darum, diese Funktion schnell zu berechnen, sondern um zu überprüfen, ob die Berechnung korrekt durchgeführt wurde, und zwar in kürzerer Zeit als für ihre Auswertung erforderlich. Und wir wissen, dass es mit kryptografischen Methoden machbar ist, Beweise dafür zu generieren, dass eine sehr lange Berechnung zu einem bestimmten Ergebnis führt, sodass die Überprüfung des Beweises viel weniger Zeit in Anspruch nimmt als die Durchführung der Berechnung. Das nennt man Delegation der Berechnung, und ein SNARGs würde den Zweck perfekt erfüllen – wir haben sogar Implementierungen zur Verfügung.
@GeoffroyCouteau LOL, wirklich? Ok, ich bin offen für Korrekturen. Teilen Sie mir dann einfach das SHA-256-Ergebnis mit sha256^1000000000("good boy"), damit Sie überprüfen und beweisen können, dass es nicht das ist, was ich behaupte: 2e115facdd6e12fdb2938b6a0d6662efa2cd92dac6a3c5c94c8784c52a1dd0b5(das ist genau das Problem, nach dem OP fragt, seit er die Frage bei Crypto.SE fallen gelassen hat). Wenn Sie überprüfen und beweisen können, dass mein Hash-Ergebnis nicht korrekt ist, werde ich meine Antwort gerne löschen. Zu Ihrer Bequemlichkeit gilt dieses Angebot, solange ich lebe. Viel Glück! ;)
@GeoffroyCouteau Siehe, ich stimme zu, dass es andere Lösungen für das Problem gibt, aber die Frage wurde speziell nach der Überprüfung einer Milliarde SHA-256-Berechnungen für eine Zeichenfolge gestellt. Meine Antwort beschränkt sich also darauf, genau darüber zu sprechen. Einer der Gründe, warum ich die Fragen und Antworten hierher verschoben habe, ist, dass klar wurde, dass der Fragesteller etwas anderes als seine/ihre SHA-256-Idee braucht. Wie Sie feststellen werden, vermeiden Ihr Kommentar und Ihre Antwort, insgesamt über SHA-256 zu sprechen und unverblümt auf eine andere Lösung zu verweisen, ohne zu erklären, warum die beschriebene „Verifizierung einer Milliarde SHA-256-Runden“ in solchen Szenarien nicht machbar ist.
Ich bin auch offen für Korrekturen und habe möglicherweise die Frage von OP missverstanden :) Ich habe den folgenden Satz interpretiert: "Ich brauche einen Weg, um sha256 ^ 1000000000 ("guter Junge") = Y zu beweisen, ohne dass so viel Rechenleistung auf dem Prüfer erforderlich ist Seite" als folgende Frage: Der Beweiser, der den iterierten Hash berechnet, braucht einen Weg, um einen begleitenden Beweis zu erbringen, dass er es richtig gemacht hat, damit der Beweis schneller verifiziert werden kann, als den Hash vollständig zu berechnen. Nach meinem Verständnis des Szenarios wird es machbar, weil der Prüfer bereit ist, dem Prüfer bei dem Prozess zu helfen.
Aber natürlich, wenn der Beweiser Ihnen einfach das Ergebnis gibt und Sie auffordert, es zu überprüfen, können Sie nichts Besseres tun, als die gesamte Berechnung durchzuführen. Das Verifizieren einer Milliarde sha256-Berechnung auf einer Zeichenfolge (oder tatsächlich jede andere Art von gut definierter schwerer Berechnung) in kurzer Zeit ist durchaus machbar, wenn der Prüfer bereit ist zu helfen, er kann dies sogar nicht interaktiv tun, indem er einen Kurzschluss erzeugt begleitenden Beweis, aber es ist in der Tat ohne seine Hilfe nicht durchführbar.

Siehe meine Antwort auf Ihre andere Frage bei Cryptography.SE : Die einfachste Lösung wäre die Verwendung eines intelligenten Vertrags, der den Überprüfungsalgorithmus eines SNARG-Systems für die gewünschte Aussage durchführt. Die Überprüfungszeit kann im Wesentlichen unabhängig von der Größe der Berechnung gemacht werden, und mehrere Implementierungen von SNARGs sind verfügbar. Das Hauptproblem hier ist für den Beweiser, der nicht nur das Rätsel lösen, sondern auch einen Beweis dafür erbringen müsste, dass er es gelöst hat, was einige Zeit dauern kann - aber Sie versuchen, es ihm schwer zu machen, es zu lösen es sowieso, also ist es wahrscheinlich kein Problem.