Unterschied zwischen keccak256 und sha3

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?

Ich habe mit Testfällen bestätigt, dass dies der grundlegende Unterschied zwischen den beiden Algorithmen ist. Ich habe auch mit Solidity getestet.

Antworten (2)

aus einer Antwort auf Was sind die Hauptunterschiede zwischen dem Entwurf des SHA-3-Standards und der Vorlage von Keccak? :

  1. 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.
  2. 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.
  3. 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