Threefish
# Threefish

Threefish ist eine Blockverschlüsselung, die als Teil der kryptographischen Hashfunktion Skein, welche an dem NIST-Auswahlverfahren (englisch NIST hash function competition) zu SHA-3 teilnahm, entwickelt wurde. Threefish verwendet keine S-Boxen oder andere Lookup-Tabellen, um zeitliche Seitenkanalattacken (Rechenzeitangriffe) zu erschweren. Die notwendige Nichtlinearität wird durch die Abwechslung von Additionen und bitweisen XOR-Verknüpfungen realisiert.

Ein Teil des Entwicklungsteams arbeitete bereits beim Entwurf der Blockverschlüsselungen Twofish und Blowfish zusammen, die allerdings eine andere Struktur aufweisen.

## Funktionsweise

Ein Datenblock besteht aus 4, 8 oder 16 Wörtern von je 64 Bit. In jeder Runde werden Paare von zwei Wörtern aus je einer von zwei Blockhälften durch die MIX-Funktion modifiziert, und anschließend werden die Wörter innerhalb jeder Blockhälfte permutiert, so dass jedes Wort in der nächsten Runde für die MIX-Operation mit einem anderen gepaart wird. Die MIX-Funktion besteht aus den elementaren Operationen Addition modulo $2^{64}$, Bitrotation und XOR-Verknüpfung:

    $B\leftarrow B+A;\;\;A\leftarrow A\lll R_{i,j};\;\;A\leftarrow A\oplus B$

Die Rotationsweite $R_{i,j}$ hängt von der Runde und vom Wortpaar ab und folgt einem Muster, das sich alle acht Runden wiederholt. Die Wortpermutation ist in jeder Runde gleich. Nach immer vier Runden, und auch vor der ersten Runde, wird zu jedem Blockwort ein Rundenschlüssel-Wort addiert.

Threefish ist eine sogenannte tweakable Blockverschlüsselung, was bedeutet, dass über einen zusätzlichen Steuereingang die Art der Permutationen in gewissem Umfang verändert werden kann. Der tweak hat dabei eine ähnliche Funktion wie ein Initialisierungsvektor oder ein Nonce, kann öffentlich sein und schneller gewechselt werden als der Schlüssel. Dies erlaubt im Betrieb für zeitkritische Anwendungen wie Festplattenverschlüsselungen zyklische Veränderungen der Verschlüsselung, ohne zu Lasten des Datendurchsatzes, wie bei der vergleichsweise zeitaufwändigen Änderung des Primärschlüssels, zu gehen.

Die Schlüsselgröße ist gleich der Blockgröße. Zur Schlüsseleinteilung wird zuerst ein zusätzliches Schlüsselwort berechnet, indem alle Schlüsselwörter und eine Konstante miteinander XOR-verknüpft werden. Jeder Rundenschlüssel besteht aus 4, 8 bzw. 16 der Schlüsselwörter, die von einem zum nächsten Rundenschlüssel durchrotiert werden, d. h. für jeden Rundenschlüssel wird ein anderes Wort weggelassen. Zum letzten Wort des Rundenschlüssels wird die Rundennummer addiert. Zum zweit- und drittletzten Rundenschlüsselwort wird je ein tweak-Wort addiert; diese werden ebenfalls durchrotiert, so dass in jeder Runde zwei andere tweak-Wörter angewandt werden.

