Ich habe die keccak256-Implementierung und sha3-256 überprüft, die dem FIPS-Standard folgen. Die Schwammfunktion braucht eine Weile, um sich einzustellen, aber ich habe einen Unterschied in der Implementierung festgestellt:
Mir ist aufgefallen, dass web3.js die Crypto-js-Implementierung von sha3 verwendet: https://github.com/brix/crypto-js/blob/develop/src/sha3.js Daraus entnehme ich die var LFSR = 0x01;
die in sha3-256 auf 0x06 gesetzt ist. Liege ich mit dieser Beobachtung richtig?
Welche weiteren Unterschiede gibt es?
aus einer Antwort auf Was sind die Hauptunterschiede zwischen dem Entwurf des SHA-3-Standards und der Vorlage von Keccak? :
- Nein, haben sie nicht, die Interna und Sicherheitsstufen wurden gegenüber dem Entwurf der Keccak-Einreichung nicht geändert, nur die Auffüllregel hat sich geändert.
- Die Padding-Änderung ist der einzige Unterschied, dies ermöglicht zukünftigen Baum-Hashing-Modi sowie den aktuellen SHAKE-Ausgaben, unterschiedliche Digests bei gleichen Sicherheitsparametern und Nachrichteneingaben zu generieren. Es werden bis zu 4 zusätzliche Bits hinzugefügt, wodurch die vollständige Auffüllung innerhalb einer Byte-Grenze bleibt, wodurch Implementierungen mit nur Oktett-Eingabe in der Lage sind, von Keccak auf SHA-3 umzuschalten, wobei nur eine einzige Codezeile geändert wird.
- Die Padding-Änderung hat keine negativen Auswirkungen auf die Sicherheit von SHA-3.
Keccak und Sha-3 sind nicht dasselbe. 2007 initiierte das US National Institute of Standard and Technology (NIST) einen Wettbewerb über SHA-3. 2012 gewann das Keccak-Team den Wettbewerb. Von da an implementierten Entwickler viele „sha3“-Lösungen auf Basis von Keccak. Im Jahr 2014 modifizierte NIST jedoch die Keccak-Lösung und veröffentlichte FIPS 202, und dieser aktualisierte Vorschlag wird im August 2015 zum offiziellen SHA-3-Standard. Viele „alte“ Programme verwenden immer noch Keccak und führen kein Upgrade auf den offiziellen SHA-3-Standard durch.
„alter“ Code auf Basis von Keccak generiert nicht den gleichen Hashwert wie SHA-3. Wenn Sie also eine „sha3“-Bibliothek verwenden, sollten Sie sich darüber im Klaren sein, dass die Bibliothek auf Keccak oder auf Standard-SHA-3 basiert. Eine einfache Lösung ist ein Test auf leere Eingaben:
SHA-3-Standardausgabe ist:
a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
Viele alte Keccak-256-Ausgänge sind:
c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
von hier
Die Schlüsselidee hinter SHA-3 basiert auf nicht verschlüsselten Permutationen, im Gegensatz zu anderen typischen Hash-Funktionskonstruktionen, die verschlüsselte Permutationen verwendeten. Keccak verwendet auch nicht die Merkle-Damgard-Transformation, die üblicherweise verwendet wird, um Eingabenachrichten beliebiger Länge in Hash-Funktionen zu verarbeiten. Bei Keccak wird ein neuerer Ansatz verwendet, der als Schwamm- und Squeeze-Konstruktion bezeichnet wird. Es ist ein zufälliges Permutationsmodell. Verschiedene Varianten von SHA-3 wurden standardisiert, wie SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128 und SHAKE256
Wenn Sie das jemals verwendet haben:
web3.utils.soliditySha3()
Der Name ist zwar Sha3, aber tatsächlich von keccak256 implementiert
Benutzer2163865
eth