Many sources refer to the use of the "SHA3" cryptographic hash function within Ethereum, but the Ethereum project began before the SHA3 standard was finalised, and there was some confusion/controversy around the final parameters selected for the standard. Which function specifically did Ethereum actually end up with? Is it the same as the actual SHA3 standard, or one of the variants within the standard? Or is it a parameterisation of Keccak that doesn't match any of the variants?
2 Answers
Ethereum uses KECCAK-256. It should be noted that it does not follow the FIPS-202 based standard (a.k.a SHA-3), which was finalized in August 2015.
According to this, NIST changed the padding to SHA3-256(M) = KECCAK [512] (M || 01, 256).
This was different from the padding proposed by the Keccak team in The Keccak SHA-3 submission version 3 (final, winning version). The difference is the additional '01' bits appended to the message. People are now calling the "submitted version 3" SHA-3 Keccak hashing "Keccak" and the finalized NIST SHA-3 standard "SHA-3".
Using this online generator and the Solidity Online Compiler, I tested the difference between Keccak-256 and SHA3-256. I hashed the word testing using Ethereum and the 2 SHA3 hashing algorithms:
Ethereum SHA3 function in Solidity = 5f16f4c7f149ac4f9510d9cf8cf384038ad348b3bcdc01915f95de12df9d1b02
Keccak-256 = 5f16f4c7f149ac4f9510d9cf8cf384038ad348b3bcdc01915f95de12df9d1b02
SHA3-256 (NIST Standard) = 7f5979fb78f082e8b1c676635db8795c4ac6faba03525fb708cb5fd68fd40c5e
-
7For clarity's sake I think we should call it "Keccak-256" rather than anything that explicitly says "SHA3" in it. Jan 24, 2016 at 9:22
-
2
-
2Oh, and excellent answer by the way. Everyone reading this, please upvote this answer. It is an ideal example of the kind of answers we'd like to have on this site!! Jan 24, 2016 at 9:53
-
5Solidity 0.4.3 has introduced
keccak256
, an alias which can safely be used as a replacement forsha3
.– eth ♦Nov 11, 2016 at 11:12 -
1@MattSayar [kɛtʃak], like “ketchak”, as seen here: quora.com/Cryptography-How-should-you-pronounce-Keccak– FRAGAOct 5, 2017 at 5:51
To make it clearer that Ethereum uses KECCAK-256 instead of the NIST standardized SHA-3 hash function, Solidity 0.4.3 has introduced keccak256
. (It is an alias to sha3
, meaning that keccak256
produces identical results to sha3
, but with the intent to avoid confusion, especially for developers new to Ethereum.) It's recommended that new code use keccak256
instead of sha3
.