Grøstl
Grøstl is a cryptographic hash function submitted to the NIST hash function competition by Praveen Gauravaram, , Krystian Matusiewicz, Florian Mendel, Christian Rechberger, Martin Schläffer, and Søren S. Thomsen. Grøstl was chosen as one of the five finalists of the competition. It uses the same S-box as AES in a custom construction. The authors claim speeds of up to 21.4 cycles per byte on an .
According to the submission document, the name “Grøstl” is a multilingual play-on-words, referring to an Austrian dish that is very similar to .
Like other hash functions in the MD5/SHA family, Grøstl divides the input into blocks and iteratively computes h<sub>i</sub> = f(h<sub>i−1</sub>, m<sub>i</sub>). However, Grøstl maintains a hash state at least twice the size of the final output (512 or 1024 bits), which is only truncated at the end of hash computation.
The compression function f is based on a pair of 256- or 512-bit permutation functions P and Q, and is defined as:
- f(h, m) = P(h ⊕ m) ⊕ Q(m) ⊕ h
The permutation functions P and Q are heavily based on the (AES) block cipher, but operate on 8×8 or 8×16 arrays of bytes, rather than 4×4. Like AES, each round consists of four operations:
- AddRoundKey (the Grøstl round keys are fixed, but differ between P and Q)
- SubBytes (this uses the Rijndael S-box, allowing sharing with AES implementations)
- ShiftBytes (expanded compared to AES, this also differs between P and Q, and 512- and 1024-bit versions)
- MixColumns (using an 8×8 matrix rather than Rijndael’s 4×4)
Unlike Rijndael, all rounds are identical and there is no final AddRoundKey operation. 10 rounds are recommended for the 512-bit permutation, and 14 rounds for the 1024-bit version.
The final double-width hash receives a final output transformation of
- Ω(h) = h ⊕ P(h)
and is then truncated to the desired width. This is equivalent to applying a final iteration of the compression function using an all-zero message block m, followed by a (cryptographically insignificant) exclusive-or with the fixed constant Q(0).
Examples of Grøstl hashes
Hash values of empty string.
<span style="color: green;">Grøstl-224("")</span> 0x f2e180fb5947be964cd584e22e496242c6a329c577fc4ce8c36d34c3 <span style="color: green;">Grøstl-256("")</span> 0x 1a52d11d550039be16107f9c58db9ebcc417f16f736adb2502567119f0083467 <span style="color: green;">Grøstl-384("")</span> 0x ac353c1095ace21439251007862d6c62f829ddbe6de4f78e68d310a9205a736d8b11d99bffe448f57a1cfa2934f044a5 <span style="color: green;">Grøstl-512("")</span> 0x 6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8
Even a small change in the message will (with overwhelming probability) result in a mostly different hash, due to the . For example, adding a period to the end of the sentence:
<span style="color: green;">Grøstl-256("")</span> 0x 8c7ad62eb26a21297bc39c2d7293b4bd4d3399fa8afab29e970471739e28b301 <span style="color: green;">Grøstl-256(".")</span> 0x f48290b1bcacee406a0429b993adb8fb3d065f4b09cbcdb464a631d4a0080aaf