# Whirlpool (Algorithmus)

Whirlpool ist eine kryptographische Hashfunktion, die von Vincent Rijmen und Paulo S. L. M. Barreto entworfen wurde. Sie wurde nach der Whirlpool-Galaxie im Sternbild der Jagdhunde benannt.
Whirlpool funktioniert mit Dateien bis zu 2$^{256}$ Bit Größe und gibt einen Hash-Wert von 512 Bit aus. Bislang sind keine Schwächen des Algorithmus bekannt, was allerdings relativiert werden muss, da er bislang wenig untersucht wurde.
Die Autoren haben erklärt, dass Whirlpool nicht patentiert ist und es nie sein wird. Whirlpool darf kostenlos zu jedem Zweck verwendet werden. Die Referenz-Implementierung ist gemeinfrei.
Whirlpool gehört zu den vom Projekt NESSIE empfohlenen kryptografischen Algorithmen und wurde von der ISO mit ISO/IEC 10118-3:2004 standardisiert.

## Funktionen

Whirlpool wurde nach der Square-Blockchiffre entwickelt und kann zu dieser Familie der Blockchiffre-Funktionen gezählt werden.
Whirlpool ist eine Miyaguchi–Preneel-Konstruktion, welche auf dem substanziell modifizierten Advanced Encryption Standard basiert.
Whirlpool nimmt eine Nachricht von jeder Länge kleiner als 2$^{256}$-Bits und gibt eine Antwort mit 512-Bit zurück.
Die Entwickler setzten fest:
„Whirlpool ist nicht patentiert (und wird auch nie). Die Chiffre kann kostenlos für alles verwendet werden“

### Versionen

Die originale Chiffre wurde unter dem Namen Whirlpool-0 veröffentlicht. Die erste Revision von Whirlpool hieß Whirlpool-T und die neuste Version Whirlpool in den folgenden Testvektoren.
* In der ersten Revision im Jahre 2001 wurde die S-Box von einer zufällig generierten mit guten kryptographischen zu einer mit besseren kryptographischen Eigenschaften geändert, wobei auch die Implementierung in die Hardware vereinfacht wurde.
* In der zweiten Revision im Jahre 2003 wurde ein Fehler in der Diffusionsmatrix, welcher die Sicherheit des Algorithmus verringerte, behoben, indem die rotierenden 8x8 Matrixkonstanten von (1, 1, 3, 1, 5, 8, 9, 5) zu (1, 1, 4, 1, 8, 5, 2, 9) geändert wurden.

## Struktur

Die Whirlpool Hashfunktion ist eine Merkle–Damgård-Konstruktion, welche auf der AES-ähnlichen Blockchiffre W in Miyaguchi–Preneel-Art basiert.
Die Blockchiffre W besteht aus einer statischen 8x8 Matrix $S$ aus Bytes von total 512-Bits.
Der Verschlüsselungsvorgang beinhaltet die Erneuerung des Zustands von vier Rundenfunktionen über 10 Runden. Die vier Rundenfunktionen sind SubBytes (SB), ShiftColumns (SC), MixRows (MR) und AddRoundKey (AK). Während jeder Runde wird ein neuer Zustand generiert als: $S=AK\circ MR\circ SC\circ SB(S)$.

### SubBytes

Die SubBytes-Operation verwendet eine nichtlineare Permutation unabhängig zu jedem Byte des Zustandes. Die 8-Bit S-Box besteht aus drei kleineren 4-Bit S-Boxen.

### ShiftColumns

Die ShiftColumns-Operation verschiebt zyklisch jeden Byte in eine neue Zeile des Zustands. Die Zeile j verschiebt seine Bytes nach j Positionen nach unten.

### MixRows

Die MixRows-Operation ist eine Multiplikation von jeder Reihe durch eine 8x8 Matrix über $GF({2^{8}})$. Die Matrix wird so gewählt, dass die Zweignummer 9 ist, was dem Maximum entspricht.

### AddRoundKey

Die AddRoundKey-Operation verwendet bitweise XOR um einen Schlüssel hinzuzufügen berechnet durch die Key-Schedule des jetzigen Zustands. Die Key-Schedule ist identisch zur Verschlüsselung selbst, außer das die AddRoundKey-Funktion durch die AddRoundConstant-Funktion ersetzt wird, welche eine vorbestimmte Konstante in jeder Runde hinzufügt.

## Implementation

Die Entwickler stellen eine Referenzimplementation des Whirlpool-Algorithmus zur Verfügung, welche eine Version in C und in Java beinhalten. Diese Referenzimplementationen wurden öffentlich freigegeben.

## Verwendung

Zwei der größten Pioniere von kryptographischen Programmen, FreeOTFE und TrueCrypt implementierten Whirlpool schon 2005.
VeraCrypt (Ein Abkömmling von TrueCrypt) unterstützt Whirlpool (die neuste Version) als Hash-Algorithmus.