# Talk:The SHA-3 Zoo

I'm thinking about introducing another column to the list of submissions to provide a rough, overall classification of the candidates (e.g. classical Merkle-Damgaard vs. HAIFA vs. sponge vs. tree-based vs. streaming vs. ...), motivated by private messages I've got comparing the current SHA-3 Zoo with my old hash lounge.

However, finding the most appropriate category for some submissions may be a tough task; paradigms may be so distorted as to be nearly unrecognizable. Still, other candidates exhibit a much more transparent structure, and I think this information may be useful (e.g. comparing submissions that fall on distinct categories may not be as fair as comparing functions that share a high-level structure).

Would such a modification be welcome to the SHA-3 Zoo contributors?

Paulo.

I think this would be a lot of effort for a relatively minor added value; as you observe, many candidates are likely to use "uncategorizable" modes of operations. How one would classify CubeHash? It has similarities with a sponge constructions, but is not a sponge in general. Also, both MD6 and ESSENCE have a tree construction, but with different arities, parameters, etc. Finding the best tradeoff precision/readability seems difficult...

JP

Well, I don't see it as too much effort -- for *me* at any rate; I'm not asking that somebody else do the hard work ☺. Rather, I think it's part of trying to understand how each submission works, and it could also suggest lines of attack (particularly where the actual functions deviate from previously analyzed constructions). Besides, in cases where the authors disagree of a tentative category it might shed new light on those authors' original intent.

Paulo.

Addendum: as far as I could tell, the overall structure of the currently known proposals **seems** to be the following (disclaimer: I may be completely mistaken in many cases):

Hash Function Name | Status | External Cryptanalysis | Tentative Classification |
---|---|---|---|

Abacus | submitted | none | ? [?] |

ARIRANG | submitted | none | ? [?] |

AURORA | submitted | none | ? [?] |

BLAKE | submitted | none | HAIFA/? [narrow pipe] |

Blender | submitted | none | ? [?] |

Blue Midnight Wish | submitted | yes | sponge? [wide pipe] |

submitted | ☠ | streaming | |

Cheetah | submitted | none | ? [?] |

CHI | submitted | none | Merkle-Damgård/Davies-Meyer [wide pipe] |

CRUNCH | submitted | none | Merkle-Damgård/concatenate-permute-truncate [narrow pipe] |

CubeHash | submitted | yes | sponge [wide pipe] |

submitted | ☠ | Merkle-Damgård/Miyaguchi-Preneel [narrow pipe] | |

Dynamic SHA | submitted | none | ? [?] |

Dynamic SHA2 | submitted | none | ? [?] |

ECHO | submitted | none | ? [?] |

ECOH | submitted | none | ? [?] |

Edon-R | submitted | yes | streaming |

submitted | ☠ | streaming | |

ESSENCE | submitted | none | Merkle tree [narrow pipe] |

FSB | submitted | none | Merkle-Damgård/concatenate-permute-truncate [wide pipe] |

Fugue | submitted | none | sponge? [wide pipe] |

Grøstl | submitted | yes | sponge? Merkle-Damgård/Davies-Meyer? [wide pipe] |

Hamsi | submitted | none | ? [?] |

submitted | ☠ | streaming? | |

JH | submitted | none | sponge [wide pipe] |

Keccak | submitted | none | sponge [wide pipe] |

Khichidi-1 | submitted | none | ? [?] |

LANE | submitted | none | HAIFA/concatenate-permute-truncate or Damgård interleaving [narrow pipe] |

Lesamnta | submitted | none | ? [?] |

Luffa | submitted | none | ? [?] |

LUX | submitted | none | ? [?] |

Maraca | submitted | none | sponge? [wide pipe] |

submitted | ☠ | streaming | |

MD6 | submitted | yes | bounded-height Merkle tree [wide pipe] |

MeshHash | submitted | none | ? [?] |

NaSHA | submitted | none | sponge? [narrow pipe] |

SANDstorm | submitted | none | ? [?] |

submitted | ☠ | cellular automaton | |

Ponic | submitted | yes | streaming |

Sarmal | submitted | yes | HAIFA/Davies-Meyer [narrow pipe] |

submitted | ☠ | Merkle-Damgård/Davies-Meyer [wide pipe] | |

Shabal | submitted | none | ? [?] |

SHAMATA | submitted | none | sponge [wide pipe] |

SHAvite-3 | submitted | none | ? [?] |

SIMD | submitted | none | ? [?] |

Skein | submitted | none | Merkle-Damgård/UBI? Merkle tree? [narrow pipe] |

Spectral Hash | submitted | yes | Merkle-Damgård/prism? [narrow pipe] |

SWIFFTX | submitted | none | HAIFA/concatenate-permute-truncate [wide pipe] |

Tangle | submitted | none | ? [?] |

TIB3 | submitted | none | ? [?] |

Twister | submitted | none | ? [?] |

Vortex | submitted | yes | Merkle-Damgård/Vortex-block? [wide pipe] |

submitted | ☠ | sponge [wide pipe] | |

Waterfall | submitted | none | streaming |

I'm in favour of adding more infos to this page. Seems like a good first shot. But surely we have to put a disclaimer to this category saying something like "this column can never we entirely correct as we would need almost 64 categories...".

Regarding your current categorization. Why not distinguish designs that are based on a small number of permutations from designs based on a huge number of permutations (e.g. block-cipher based). This seems a crucial difference to me. On the other hand, do we really want to distinguish HAIFA from Merkle-Damgaard? The former is an extension of the later. Also, what is your way to distinguish between sponge and streaming?

-Christian

Oh, I'm definitely thinking about adding a disclaimer. Regarding HAIFA vs. MD, I wrote HAIFA when the authors explicitly state so in the documentation. I tend to call "sponge" a construction that inserts a message in "blocks" (related to the abstract design) in a "simple" way (e.g. via some block-oriented group operation), and "stream" a construction oriented toward "words" (related to popular target platforms) mixed into the state through a "complicated" operation (I admit this is rather informal to say the least); also, I again adhere to the authors' statement when they claim a design is streaming. As for permutations vs. block ciphers, I've been thinking about this... but perhaps it's better to discuss the subject privately before, so I can check my own understanding of a few concepts. And of course I'm entirely open to revising a classification if there is evidence of a mistaken prior assessment.

Paulo.

We can follow Orr and say that "everything is HAIFA" ;)

More seriously: more info would of course be valuable, but accurate information seems in this case difficult (and maybe impossible) to provide. All the functions are based on a compression function (whatever the designers say to sound original), then the variations are: how the iteration is performed? (linear or tree), how large is the state?, how many rounds are recommended and how many are broken? (it would be interesting to give this ratio, but often there's more than the "round" parameter, see eg CubeHash), are there additional inputs? (salt, key, counter, etc.).

The iteration mode seems to be linear in most of the submissions, so providing this info may not be that useful. However it could be interesting and easy to add a column "state bitsize". If we want to say how many rounds are broken, we'll reduce to the same problem as we have with the "external cryptanalysis" column with "what is broken".

JP

I just wish to say that the terminology about *sponge* sometimes seems to spread across things that are not sponge functions according to the definition in our paper Sponge Functions. I have not checked all the entries marked "sponge" in the table above, but I have some doubts about whether these hash functions actually use the sponge construction. For instance, I checked JH and it does not seem they use the sponge construction. Instead, they use MD and a compression function (built on top of a permutation). Also, RadioGatún seems to be sometimes described as a sponge function, when it is not, see [1].

Gilles

Hi, I agree with those saying that a categorization can never be exact. A possibility is to collect a list of headlines such as "Merkle-Damgård", "Sponge", "Block cipher-based", "Permutation-based" etc., and state an indication as to which degree each hash function can be said to fall into each category. As an example, we say that Grøstl is permutation-based, but as Paulo showed, it can also be seen as being block cipher-based, so on a scale from, e.g., 0-4, Grøstl may be permutation-based to a degree of 3, and block cipher-based to a degree of 1 (just an example!). It is "almost" an MD construction, but not quite, so we may say it is MD to a degree of 2 or 3. The question is whether such a categorization will be more fair, more useful, etc., than a true/false categorization.

However, my personal opinion is that we should avoid completely to categorize hash functions (except in 100% objective ways such as internal state size, message block size, status in the competition etc. - some of which you may also argue are not 100% objective). I also think we should not deem hash functions as being "broken" or "damaged", we should just link to all published results, and let people make up their own minds. I am assuming we did not build the SHA-3 Zoo in an attempt to have an influence on NIST's decisions.

/Søren

## new tables

This is a draft for the new tables to show the analysis and complexities of each hash function. The first table is shown at the main page, the entries of the second table are only shown at the Wiki page of each hash function.

Martin

The main idea of the SHA-3 Zoo is to give a good overview of cryptanalytic results. We try to avoid additional judgement whether a submission is broken. The answer to this question is left to NIST. However, we categorize the cryptanalytic results by their impact from very theoretic to practical attacks. A detailed description is given in Cryptanalysis Categories.

At this time, 55 out of 64 submissions to the SHA-3 competition are publicly known and available. 51 submissions have advanced to the first round. So far, 3 out of 51 first round candidates have been officially conceded broken or withdrawn by the designers.

The following table should give a first impression on the remaining SHA-3 candidates. It shows only the best known attack, more detailed results are collected at the individual hash function pages.

Recent updates of the SHA-3 Zoo

Hash Name | Principal Submitter | Best Attack on Main NIST Requirements | Best Attack on other Hash Requirements |
---|---|---|---|

Abacus | Neil Sholer | 2nd-preimage | |

ARIRANG | Jongin Lim | ||

AURORA | Masahiro Fujita (Sony) | ||

BLAKE | Jean-Philippe Aumasson | ||

Blender | Dr. Colin Bradbury | preimage | |

Blue Midnight Wish | Svein Johan Knapskog | ||

Cheetah | Dmitry Khovratovich | length-extension | |

CHI | Phillip Hawkes | ||

CRUNCH | Jacques Patarin | ||

CubeHash | D. J. Bernstein | preimage | |

DCH | David A. Wilson | collision | |

Dynamic SHA | Xu Zijie | length-extension | |

Dynamic SHA2 | Xu Zijie | length-extension | |

ECHO | Henri Gilbert | ||

ECOH | Daniel R. L. Brown | ||

Edon-R | Danilo Gligoroski | preimage | |

EnRUPT | Sean O’Neil | collision | |

ESSENCE | Jason Worth Martin | ||

FSB | Matthieu Finiasz | ||

Fugue | Charanjit S. Jutla | ||

Grøstl | Lars Ramkilde Knudsen | ||

Hamsi | Ozgul Kucuk | ||

JH | Hongjun Wu | preimage | |

Keccak | Joan Daemen | ||

Khichidi-1 | M Vidyasagar | collision | |

LANE | Sebastiann Indesteege | ||

Lesamnta | Hirotaka Yoshida | ||

Luffa | Dai Watanabe | ||

LUX | Ivica Nikolic | ||

MCSSHA-3 | Mikhail Maslennikov | collision | |

MD6 | Ronald L. Rivest | ||

MeshHash | Björn Fay | 2nd preimage | |

NaSHA | Smile Markovski | collision | |

SANDstorm | Rich Schroeppel | ||

Sarmal | Kerem VARICI | preimage | |

Sgàil | Peter Maxwell | collision | |

Shabal | Jean-Francois Misarsky | ||

SHAMATA | Orhun Kara | ||

SHAvite-3 | Orr Dunkelman | ||

SIMD | Gaetan Leurent | ||

Skein | Bruce Schneier | ||

Spectral Hash | Cetin Kaya Koc | ||

StreamHash | Michal Trojnara | collision | |

SWIFFTX | Daniele Micciancio | ||

Tangle | Rafael Alvarez | collision | |

TIB3 | Daniel Penazzi | ||

Twister | Michael Gorski | collision | |

Vortex | Michael Kounavis | preimage |

The following hash functions have been submitted to the NIST competition but did not advance to the first round or have been conceded broken by the designers:

Hash Name | Principal Submitter | Status | Best Attack on Main NIST Requirements |
---|---|---|---|

Boole | Greg Rose | conceded broken | collision |

HASH 2X | submitted | 2nd-preimage | |

Maraca | submitted | ||

NKS2D | submitted | collision | |

Ponic | submitted | 2nd-preimage | |

WaMM | John Washburn | conceded broken | collision |

Waterfall | Bob Hattersley | conceded broken | collision |

The following entries are shown at the individual hash function pages only:

Hash Function Name | Type of Analysis | Hash Function Part | Hash Size (n) | Parameters/Variants | Compression Function Calls | Memory Requirements | Reference |

Abacus | 2nd preimage | hash | 2^{344} |
- | Wilson | ||

Abacus | collision | hash | 2^{172} |
- | Wilson | ||

Abacus | 2nd preimage | hash | 2^{172} |
- | Nikolić,Khovratovich | ||

Blender | preimage | hash | all | n*2^{n/2} |
- | Mendel | |

Blender | near-collision | hash | all | example | - | Klima | |

Blender | semi-free start collision | hash | all | example | - | Xu | |

Blender | preimage | hash | all | n*2^{(n+w)/2} |
- | Newbold | |

Blue Midnight Wish | near-collision | compression | all | example | - | Thomsen | |

Boole | preimage | hash | all | 2^{9n/16} |
- | Nikolić | |

Boole | collision | hash | 224,256 | example, 2^{34} |
- | Mendel,Nad,Schläffer | |

Boole | collision | hash | 384,512 | 2^{66} |
- | Mendel,Nad,Schläffer | |

Cheetah | length-extension | hash | all | - | - | Gligoroski | |

CubeHash | observations | all | Aumasson,Meier,Naya-Plasencia,Peyrin | ||||

CubeHash | preimage | all | 2^{513-4b} |
? | Aumasson,Meier,Naya-Plasencia,Peyrin | ||

CubeHash | multi-collision | all | 2^{513-4b} |
? | Aumasson,Meier,Naya-Plasencia,Peyrin | ||

CubeHash | preimage | hash | 512 | 2^{511} |
2^{508} |
Khovratovich,Nikolić,Weinmann | |

CubeHash | preimage | hash | 512 | r/4 | 2^{496} |
- | Khovratovich,Nikolić,Weinmann |

CubeHash | preimage | hash | 512 | r/8 | 2^{480} |
- | Khovratovich,Nikolić,Weinmann |

CubeHash | collision | hash | 512 | 2/120 | example | - | Aumasson |

DCH | collision | hash | all | 521 | - | Mendel,Lamberger | |

DCH | preimage | hash | all | 521 | - | Mendel,Lamberger | |

DCH | collision | hash | all | 2^{45} |
2^{45} |
Khovratovich,Nikolić | |

DCH | preimage | hash | all | 2^{45} |
2^{45} |
Khovratovich,Nikolić | |

DCH | 2nd preimage | hash | 512 | 2^{450} |
? | Rechberger | |

Dynamic SHA | length-extension | hash | all | - | - | Klima | |

Dynamic SHA2 | length-extension | hash | all | - | - | Klima | |

Edon-R | collision | compression | - | - | Khovratovich,Nikolić,Weinmann | ||

Edon-R | 2nd preimage | compression | - | - | Khovratovich,Nikolić,Weinmann | ||

Edon-R | preimage | compression | - | - | Khovratovich,Nikolić,Weinmann | ||

Edon-R | preimage | hash | 2^{2n/3} |
2^{2n/3} |
Khovratovich,Nikolić,Weinmann | ||

Edon-R | multi-collision (2^{K}) |
hash | 256,512 | K*2^{n/2} |
2^{n/2} |
Klima | |

Edon-R | multi-preimage | hash | 256,512 | ? | ? | Klima | |

EnRUPT | preimage | hash | 512 | 2^{480} |
2^{480} |
Khovratovich,Nikolić | |

EnRUPT | collision | hash | 256 | example, 2^{47} |
- | Indesteege | |

Grøstl | observation | block cipher | all | Barreto | |||

Hash 2X | 2nd preimage | hash | example | - | Aumasson | ||

JH | pseudo-collision | compression | all | - | - | Bagheri | |

JH | pseudo-2nd preimage | compression | all | - | - | Bagheri | |

JH | preimage | hash | all | 2^{510.3} |
2^{510.3} |
Mendel,Thomsen | |

KhiChidi-1 | collision | hash | 256 | example | - | Mouha | |

LUX | collision | reduced hash | 224 | 3 blank rounds | - | - | Wu,Feng,Wu |

LUX | near-collision | reduced hash | 256 | 3 blank rounds | - | - | Wu,Feng,Wu |

LUX | free-start collision | compression | ? | - | - | Wu,Feng,Wu | |

LUX | free-start preimage | compression | ? | 2^{80} |
- | Wu,Feng,Wu | |

LUX | slide-attack | hash | all | salt size: 31 mod 32 | - | - | Peyrin |

Maraca | internal collision | internal state | 512 | 2^{237} |
2^{230.5} |
Canteaut,Naya-Plasencia | |

MCSSHA-3 | collision | hash | all | 2^{3n/8} |
? | Aumasson,Naya-Plasencia | |

MCSSHA-3 | 2nd preimage | hash | all | 2^{3n/4} |
? | Aumasson,Naya-Plasencia | |

MD6 | non-randomness | reduced compression | 18 rounds | ? | ? | Aumasson,Meier | |

MD6 | key-recovery | reduced compression | 15 rounds | ? | ? | Dinur,Shamir | |

MeshHash | 2nd preimage | hash | 256 | 2^{192} |
- | Thomsen | |

MeshHash | 2nd preimage | hash | 512 | 2^{320} |
- | Thomsen | |

NaSHA | free-start collision | compression | all | 2^{32} |
? | Nikolić,Khovratovich | |

NaSHA | free-start preimage | compression | 224,256 | ~2^{128} |
? | Nikolić,Khovratovich | |

NaSHA | free-start preimage | compression | 384,512 | ~2^{256} |
? | Nikolić,Khovratovich | |

NaSHA | free-start collision | compression | all | - | - | Ji,Liangyu,Xu | |

NaSHA | collision | hash | 512 | 2^{192} |
? | Ji,Liangyu,Xu | |

NKS2D | collision | hash | 224 | example | - | De Cannière | |

NKS2D | collision | hash | 512 | example | - | Enright | |

Ponic | 2nd preimage | hash | 512 | 2^{265} |
2^{256} |
Naya-Plasencia | |

Sarmal | preimage | hash | 512 | max(2^{512-s},2^{256+s}) |
2^{s} |
Nikolić | |

Sarmal | collision with salt | hash | 224,256,384 | 2^{n/3} |
2^{n/3} |
Mendel,Schläffer | |

Sgàil | collision | hash | example | - | Maxwell | ||

SHAMATA | observation | block cipher | Fleischmann,Gorski | ||||

SHAMATA | observation | block cipher | Atalay,Kara,Karakoc | ||||

SpectralHash | near-collision | hash | 224,512 | reference impl. | example | - | Enright |

SpectralHash | truncated collision | hash | 512 | reference impl. | example | - | Enright |

SpectralHash | collision | hash | reference impl. | example | - | Bjørstad | |

StreamHash | collision | hash | all | n/2*2^{n/4} |
? | Khovratovich,Nikolić | |

StreamHash | preimage | hash | all | n/2*2^{n/2} |
? | Khovratovich,Nikolić | |

StreamHash | collision | hash | 256 | example | - | Bjørstad | |

Tangle | observation | Esmaeili | |||||

Tangle | collision | hash | all | example, 2^{13} - 2^{28} |
- | Thomsen | |

Twister | pseudo-collision | compression | all | 2^{26.5} |
2^{28} |
Mendel,Rechberger,Schläffer | |

Twister | collision | hash | 512 | 2^{252} |
- | Mendel,Rechberger,Schläffer | |

Twister | 2nd preimage | hash | 512 | 2^{448} |
2^{64} |
Mendel,Rechberger,Schläffer | |

Vortex | pseudo collision | compression | all | 2^{n/4} |
- | Knudsen,Mendel,Rechberger,Thomsen | |

Vortex | preimage | hash | all | 2^{3n/4} |
2^{n/4} |
Knudsen,Mendel,Rechberger,Thomsen | |

Vortex | collision | hash | 256 | 2^{122.5} |
2^{122.5} |
Knudsen,Mendel,Rechberger,Thomsen | |

Vortex | observation | all | Aumasson,Dunkelman | ||||

Vortex | correlation analysis | hash | all | - | - | Ferguson | |

WaMM | collision | hash | all | example | - | Wilson | |

Waterfall | collision | hash | all | 2^{70} |
- | Fluhrer |

A description of this table is given here.

This looks fine to me. The only editorial aspect I'm a bit unsure of is the inclusion of rejected submissions on the same table; they are only reducing the S/N ratio, since they don't contribute anything to the ongoing SHA-3 process (and hence are not likely to received any further attention at least until the competition is over). I suggest moving them to an appendix table.

Paulo.