Advanced Encryption Standard/Arbeitsweise

Aus Foxwiki

Arbeitsweise

Rijndael ist eine als Substitutions-Permutations-Netzwerk entworfene Blockchiffre.
  • Bei Rijndael können Blocklänge und Schlüssellänge unabhängig voneinander die Werte 128, 160, 192, 224 oder 256 Bits erhalten, während bei AES die Blockgröße auf 128 Bit festgelegt ist und die Schlüsselgröße 128, 192 oder 256 Bit betragen kann.
Rijndael ist eine iterierte Blockchiffre
  • d. h. der Block wird in mehreren aufeinanderfolgenden Runden verschlüsselt, die bis auf die verwendeten Rundenschlüssel gleich sind.
  • Für jede Runde wird ein anderer Rundenschlüssel aus dem Originalschlüssel berechnet (Schlüsselexpansion).
  • Die Anzahl der Runden variiert und ist vom Maximum der Blockgröße und der Schlüssellänge abhängig (beim AES also nur von der Schlüssellänge):
Anzahl der Runden bei Rijndael
max(b, k) 128 160 192 224 256
Rundenzahl R 10 11 12 13 14

Der Datenblock, der ver- oder entschlüsselt werden soll, wird zunächst in eine zweidimensionale Tabelle geschrieben, deren Zellen ein Byte groß sind und die vier Zeilen und je nach Blockgröße 4 bis 8 Spalten hat.

Ablauf

  • Schlüsselexpansion
  • AddRoundKey(Rundenschlüssel[0])
  • Kryptografiesrunden r = 1 bis R-1:
    • SubBytes()
    • ShiftRows()
    • MixColumns()
    • AddRoundKey(Rundenschlüssel[r])
  • Schlussrunde:
    • SubBytes()
    • ShiftRows()
    • AddRoundKey(Rundenschlüssel[R])

S-Box

Rijndael verwendet eine S-Box, um bei der Operation SubBytes() jedes Byte des Datenblocks durch ein anderes zu ersetzen, und sie wird auch bei der Schlüsselexpansion eingesetzt.

Die S-Box von Rijndael ist nach Kriterien konstruiert, die die Anfälligkeit für die Methoden der linearen und der differentiellen Kryptoanalyse sowie für algebraische Attacken minimieren sollen.

  • Sie besteht aus 256 Bytes, die erzeugt werden, indem jedes Byte außer der Null, aufgefasst als Vertreter des endlichen Körpers , durch sein multiplikatives Inverses ersetzt wird, worauf noch eine affine Transformation erfolgt.[1] Es ist
.

Dabei steht für das multiplikative Inverse von in , oder für 0, falls . bezeichnet die Linksrotation des Bytes um Bitpositionen und das bitweise XOR.

Die Werte der S-Box und der zum Entschlüsseln benötigten inversen S-Box können entweder für jedes substituierte Byte erneut (dynamisch) berechnet werden, um Speicher zu sparen, oder vorberechnet und in einem Array gespeichert werden.

Schlüsselexpansion

Prinzip der Schlüsselexpansion bei AES

Zunächst müssen aus dem Schlüssel Teilschlüssel (auch Rundenschlüssel genannt) erzeugt werden, die jeweils die gleiche Größe wie ein Datenblock haben.

  • Somit muss der Benutzerschlüssel auf die Länge expandiert werden, wobei die Blockgröße in Bit angibt.
  • Der Schlüssel wird in eine zweidimensionale Tabelle mit vier Zeilen und Zellen der Größe 1 Byte abgebildet.
  • Fasst man jede Spalte als 32-bit-Wort auf, ergibt das ein eindimensionales Array mit Elementen.

Sei die Länge des Benutzerschlüssels in Wörtern.

  • Dieser wird zunächst in die ersten Wörter des Arrays eingetragen.
  • Dann werden in einer Iteration die weiteren Wörter jeweils durch bitweises XOR von und berechnet.
  • Für jedes -te Wort wird zuvor rotiert, byteweise substituiert und mit einer von abhängigen Konstanten verknüpft.
  • Falls ist, wird dazwischen alle Wörter noch eine weitere Substitution ausgeführt.

Für :

bezeichnet die Substitution jedes Bytes in durch die gleiche S-Box, die auch beim Verschlüsseln eines Datenblocks eingesetzt wird. ist die Rotation von um 8 Bitpositionen nach links.

  • Die Konstanten werden gebildet, indem , berechnet im Körper , in das höchste Byte von eingetragen wird, während die übrigen Bytes 0 sind.

AddRoundKey

Bitweise XOR-Verknüpfung zwischen dem Block und dem aktuellen Rundenschlüssel

Vor der ersten und nach jeder Kryptografiesrunde wird der Datenblock mit einem der Rundenschlüssel XOR-verknüpft.

  • Dies ist die einzige Funktion in AES, in die der Benutzerschlüssel eingeht.

SubBytes

Im ersten Schritt jeder Runde wird jedes Byte im Block durch den Eintrag der S-Box ersetzt.

ShiftRows

Zeilen werden um eine bestimmte Anzahl von Spalten nach links verschoben

Wie oben erwähnt, liegt ein Block in Form einer zweidimensionalen Tabelle mit vier Zeilen vor.

  • In diesem zweiten Schritt jeder Runde werden die Zeilen um eine bestimmte Anzahl von Spalten nach links verschoben. Überlaufende Zellen werden von rechts fortgesetzt.
  • Die Anzahl der Verschiebungen ist zeilen- und blocklängenabhängig:
r b=128 b=160 b=192 b=224 b=256
Zeile 1 0 0 0 0 0
Zeile 2 1 1 1 1 1
Zeile 3 2 2 2 2 3
Zeile 4 3 3 3 4 4

Je nach Blocklänge b und Zeile in der Datentabelle wird die Zeile um 1 bis 4 Spalten verschoben.
Für den AES sind nur die fett markierten Werte relevant.

MixColumns

Die Spalten werden vermischt

Als dritte Operation jeder Runde außer der Schlussrunde werden die Daten innerhalb der Spalten vermischt.

  • Zur Berechnung eines Bytes der neuen Spalte wird jedes Byte der alten mit einer Konstanten (1, 2 oder 3) multipliziert.
  • Dies geschieht modulo des irreduziblen Polynoms im Galois-Körper .
  • Dann werden die Ergebnisse XOR-verknüpft:

In Matrixschreibweise:

Nach den Rechengesetzen in diesem Galois-Körper gilt für die Multiplikation:

Dabei bezeichnet die normale Multiplikation von a mit 2 und die bitweise XOR-Verknüpfung.

Entschlüsselung

Bei der Entschlüsselung von Daten wird genau rückwärts vorgegangen.

  • Die Daten werden zunächst wieder in zweidimensionale Tabellen gelesen und die Rundenschlüssel generiert.
  • Allerdings wird nun mit der Schlussrunde angefangen und alle Funktionen in jeder Runde in der umgekehrten Reihenfolge aufgerufen.
  • Durch die vielen XOR-Verknüpfungen unterscheiden sich die meisten Funktionen zum Entschlüsseln nicht von denen zum Verschlüsseln.
  • Jedoch muss eine andere S-Box genutzt werden (die sich aus der originalen S-Box berechnen lässt) und die Zeilenverschiebungen erfolgen in die andere Richtung.