8. Advanced Encryption Standard
Transcrição
8. Advanced Encryption Standard
HBS Kryptologie 8. Advanced Encryption Standard von Maximilian Fischer Im Jahre 1997 rief das amerikanische National Institute of Standards and Technology, kurz NIST, einen Wettbewerb für einen neuen offenen Verschlüsselungsstandard ins Leben: Advanced Encryption Standard, kurz AES, sollte der offizielle Nachfolger des von 1976 stammenden und inzwischen veralteten und unsicher gewordenen DES (Data Encryption Standard) werden. Der Algorithmus sollte ein symmetrischer 128bit-Blockalgorithmus sein (die Daten werden in Blöcken zu je 128bit = 16Byte mit dem gleichen Schlüssel ver- und entschlüsselt) und die Schlüssellänge sollte 128, 192 und 256bit betragen. Auch sollte der Algorithmus nicht nur höchste Sicherheit, sondern auch sehr gute Performance sowohl bei Software- als auch bei Hardwareimplementierungen gewährleisten. Bis zur Abgabefrist im Sommer 1998 wurden 15 Vorschläge eingesandt. Nun begann die erste Runde; da der Wettbewerb öffentlich war, konnte jeder der Lust hatte, die Kandidaten auf Herz und Nieren prüfen. Viele bekannte Kryptologieexperten machten sich sogleich daran die Algorithmen zu analysieren. Es dauerte nicht lange und schon wurden erste Schwächen gefunden und manche Verfahren erbarmungslos geknackt (dazu gehörte auch der von der Telekom eingereichte MAGENTA-Algorithmus). Die erste Runde endete 1999 mit der Bekanntgabe der fünf besten Kandidaten für die Endausscheidung: • • • • • MARS – IBM RC6 – RSA Laboratories (Ronald L. Rivest et al.) Rijndael – Joan Daemen, Vincent Rijmen Serpent – Ross Anderson, Eli Biham, Lars Knudsen Twofish – Bruce Schneier et al. Während der zweiten Runde wurde noch einmal viel getestet und analysiert. Die Entscheidung war nicht einfach, da alle Algorithmen sich als sicher erwiesen,– damit gewann die Performance als Kriterium an Bedeutung. Am 2. Oktober 2000 war schließlich der Entscheidungstag gekommen. Die NIST erklärte eine leicht modifizierte Variante des Rijndael, jetzt AES genannt, als Sieger des Wettbewerbs. Die Jury begründete ihre Entscheidung damit, dass Rijndael verhältnismäßig sicher, leicht implementierbar und schnell in Hard- und Softwareimplementierung sei. Sicherlich entsprach es nicht der üblichen Sicherheitspolitik in den USA, dass man auf einen ausländischen Algorithmus zurückgreift, jedoch überzeugt Rijndael insbesondere durch seine Einfachheit (die Referenz-Implementierung umfasst weniger als 500 Zeilen C-Code) und Performance. Der Algorithmus ist frei verfügbar und darf ohne Lizenzgebühren eingesetzt und implementiert werden. In den USA ist AES für staatliche Dokumente mit höchster Geheimhaltungsstufe zugelassen. 174 HBS Kryptologie Funktionsweise: AES ist ein symmetrischer Algorithmus, der, im Gegensatz zu einem asymmetrischen Algorithmus wie z.B. RSA, den gleichen Schlüssel zum Ver- und Entschlüsseln benutzt. Desweiteren arbeitet AES als sogenannter Blockalgorithmus. Das heißt, dass die Daten zu Blöcken zusammengefasst werden. Bei AES ist die Blockgröße auf 128bit (16Byte) festgelegt, während die Blockgröße bei seinem Vorgänger Rijndael variabel ist. Bei einer Blockgröße von 16Byte hat ein Block, wenn man diesen als 2dim ensionales Feld auffasst, eine Abmessung von 4*4. Jede Zelle entspricht dann einem Byte. Ein Block sieht also folgendermaßen aus: Wie arbeitet nun AES? Das Grundprinzip sieht wie folgt aus: Ein Datenblock, State genannt, wird abhängig vom Schlüsselblock, Cipher genannt, verschlüsselt. Die Verschlüsselung wird, das ist das Besondere an AES, nicht nur einmal durchgeführt, sondern, je nach Schlüssellänge, 10 mal (128bit), 12 mal (192bit) oder 14 mal (256bit). Der Block durchläuft jetzt bei jeder Einzel-Verschlüsselung, round (Runde) genannt, mehrere Abschnitte: • • • • Subbytes ShiftRows MixColumn AddRoundKey Die letzte Runde (final round) unterscheidet sich von der vorhergehenden dadurch, dass MixColumn ausgelassen wird. Zusätzlich gibt es noch eine Art 0te Runde, initial round genannt. In ihr wird nur die Funktion AddRoundKey ausgeführt. Die Funktion AddRoundKey ist etwas Besonderes. Sie ist die einzige Funktion in AES, die vom Benutzerschlüssel abhängig ist. Sie führt zwischen dem State (Datenblock) und dem Cipher (Chiffrenblock) eine XOR-Verknüpfung durch. XOR ist ein Begriff aus der Logik. Es bedeutet soviel wie „Entweder A oder B (aber nicht beide)“. Praktisch entspricht dies der Addition zweier Bits modulo 2 - ist die Summe eine gerade Zahl ergibt sich 0, ist sie ungerade 1. Dazu ein Schaubild: 175 HBS Kryptologie 1. Bit 2.Bit 0 0 1 1 0 1 0 1 Ausgabebit 0 1 1 0 Das Ergebnis ist also wahr, wenn genau ein Input wahr ist. Die XOR-Verknüpfung ist dabei assoziativ und kommutativ, d.h. die Reihenfolge der Ausführung ist egal. Eine weitere Eigenschaft der XOR-Verknüpfung ist, dass die zweimalige Anwendung der Operation wieder zum Anfangswert führt, d.h. sie ist selbstinvers. Deshalb wird sie auch gerne in der Kryptographie (dadurch kann beim Verschlüsseln die gleiche Funktion verwendet werden wie beim Entschlüsseln) und auch beim RAID-System eingesetzt. Hier ein Beispiel zur Selbstinversität: xor = 01010110 10010001 11000111 und ein zweites mal… xor = 11000111 10010001 01010110 Eine weitere Besonderheit bei AES ist der Umstand, dass für jede Runde ein anderer Cipher benutzt wird, der aus dem vorhergehenden generiert wird. Die initial round (0te Runde, zählt eigentlich nicht zu den normalen 10/12/14 Runden) verwendet den ursprünglichen cipher, jede weitere Runde wird ein neuer verwendet, der aus dem vorherigen generiert wird. Diese cipher nennt man auch Rundenschlüssel. Der Rundenschlüssel ist genau 16Byte groß, damit er mit dem state in Beziehung gesetzt werden kann. Später gehen wir darauf eingehen, wie genau diese neuen cipher generiert werden. Wir merken uns vorerst, dass für jede Runde ein neuer cipher generiert wird. Der expandierte Schlüssel muss in R + 1 Teilschlüssel (Rundenschlüssel) zerlegt werden können. Die Rundenschlüssel müssen die gleiche Länge wie die Blöcke erhalten (16Byte). Somit muss der Benutzerschlüssel auf die Länge b * (R + 1) expandiert werden, wobei b die Blockgröße angibt. Bei AES128 gibt es 10 Rundenschlüssel. Ein gegebenen Start-Schlüssel (Benutzerschlüssel) für AES128 ist 128bit (16Byte) lang und wird auf 16*(10+1) = 176Byte verlängert. Somit haben wir 11 Rundenschlüssel, wobei der erste Schlüssel nicht für eine Hauptrunde verwendet wird: die 10 Rundenschlüssel (bei der letzten Runden wird MixColumn ausgelasen) und eine Anfangsrunde (initial round). 176 HBS Kryptologie Die anderen Typen von AES (AES192 und AES256) haben andere Rundenzahlen und somit andere Benutzerschlüssellängen, wie man auch am Namen erkennen kann. AES192 hat 12 Runden und der Benutzerschlüssel ist 192bit (24Byte) lang. Daraus ergibt sich nach b * (R + 1) ein 16*(12+1) = 208Byte langer erweiterter Schlüssel. AES256 schließlich hat 14 Runden und der Start-Schlüssel ist 256bit (32Byte) lang. Daraus ergibt sich ein 16*(14+1) = 240Byte langer expandierter Schlüssel. Noch ein Hinweis: Man kann nicht davon ausgehen, dass der Benutzerschlüssel multipliziert mit der Anzahl der Runden gleich die Länge des expandierten Schlüssels ist. Dies ist nur bei AES128 der Fall (16*(10+1) = 176), da dort die Blockgröße gleich der Schlüsselgröße ist; aber bei AES192 (24*(12+1) = 312) und AES256 (32*(14+1) = 480) stimmt dies nicht. Tatsächlich wird der Schlüssel bei AES128 volle 11mal erweitert, bei AES192 nur ~8,66-mal und bei AES256 sogar nur 7,5-mal. Das heißt AES256 ist am sichersten, da dort der eigentliche Benutzeranteil des Schlüssels größer ist. Beobachtungen; • Der expandierte Schlüssel muss in R + 1 Teilschlüssel aufgeteilt werden können. Die Rundenschlüssel müssen die gleiche Länge wie die Blöcke erhalten. Somit muss der Benutzerschlüssel auf die Länge b * (R + 1) expandiert werden, wobei b die Blockgröße angibt. • Der Benutzerschlüssel wird mit dem State-Block bitweise XOR verknüpft, bevor mit den Hauptrunden begonnen wird. • Die FinalRound ist dieselbe Runde, wie die normalen Runden, nur mit der Ausnahme, dass die Operation MixColumn fehlt. • Während jeder Runde, wird ein anderer Teil des expandierten Schlüssels für die Operationen verwendet. Als Grafik dargestellt sieht das folgendermaßen aus: 177 HBS Kryptologie Die einzelnen Funktionen AddRoundKey Der State wird mit dem Cipher per XOR verknüpft. Beispiel: Wenn a(0,0) = 6E (hexadezimal) und k(0,0) = A3 dann ist b(0,0) = CD: xor = 01101110 10100011 11001101 = CD (6E) (A3) So wird jede weitere Zelle mit der entsprechenden Zelle des cipher verknüpft: a(0,0) xor k(0,0) = b(0,0) a(0,1) xor k(0,1) = b(0,1) a(0,2) xor k(0,2) = b(0,2) a(0,3) xor k(0,3) = b(0,3) 178 HBS Kryptologie a(1,0) a(1,1) a(1,2) ….. xor xor xor k(1,0) k(1,1) k(1,2) = = = b(1,0) b(1,1) b(1,2) Dieser Vorgang nochmals als Grafik: SubBytes Bei der Funktion SubBytes wird jedes Byte durch ein anderes Byte, das fest vorgegeben ist, ersetzt. Somit werden die Daten monoalphabetisch verschlüsselt. Dies dient dazu die Beziehung zwischen Klar- und Geheimtext zu verwischen. Die Verschlüsselung geschieht mit einer sogenannten Substitutionsbox, auch S-Box genannt. Das Ersetzen geschieht gemäß folgender Tabelle am Beispiel der hexadezimalen Zahl 19 (welche der 25 im Dezimalsystem entspricht): Der erste Teil der zweistellig notierten Zahl (1) wird horizontal auf der Tabelle ausgewählt, der zweite Teil (9) vertikal. Daraus ergibt sich dann die Substitution: aus 19 wird D4. Noch ein paar Beispiele: 179 HBS Kryptologie D3 -> 66 7E -> F3 00 -> 63 FF -> 16 CC -> 4B 21 -> FD 0F -> 76 F0 -> 8C Zu der Tabelle sei erwähnt, dass dieser Vorgang in der praktische Umsetzung (programmieren) auch vereinfacht werden kann. Es besteht die Möglichkeit einen Array mit 256 Elementen anzulegen und dabei die neuen Werte nach Wertigkeit ihrer alten Substitutionspartner festzulegen, was vor allem den Zugriff erleichtert (Es gibt auch die Möglichkeit die Werte on-the-fly zu erzeugen). Beispiel: 00 hat den Wert 0. Sein Substitutionspartner steht deshalb an erster Stelle des Arrays mit Zugriff über den Index 0. 19 hat einen Dezimal-Wert von 25. Deshalb steht der Substitutionspartner von 19, D4, an 26ter Stelle (Ein Array fängt bei Null an) mit Zugriff über den Index 25. Dazu noch ein paar Beispiele: • D3 hat einen Wert von 211. Sein Subsitutionspartner steht deshalb an der 212ten Stelle im Array. Das ist also 66. • 7E hat einen Wert von 126. Ihr Subsitutionspartner steht deshalb an der 127ten Stelle im Array. Das ist also F3. • 00 hat einen Wert von 0. Sein Subsitutionspartner steht deshalb an der 1ten Stelle im Array. Das ist also 63. (Diese Arrayreihenfolge erscheint zwar für einen Menschen undurchsichtiger, ein Computer kann damit jedoch besser arbeiten) Ein solcher Substitutions-Array könnte in der Implementierung dann etwa so aussehen: 180 HBS Kryptologie Folgend ein Block vor und nach der Operation SubBytes: ShiftRows Die Funktion ShiftRows ist relativ einfach zu verstehen. Wie der Name schon andeutet, werden die Zeilen verschoben. Während die erste Zeile nicht verschoben wird, wird die Zweite um 1, die Dritte um 2 und die Vierte um 3 nach links verschoben. Überlaufende Zellen werden von rechts fortgesetzt. Dazu ein Beispiel: 181 HBS Kryptologie MixColumn MixColumn ist nicht ganz so einfach. Sie beruht auf komplexen mathematischen Kalkulationen im Galois-Feld GF(2^8). Auf diese werden wir hier jedoch nicht genauer eingehen, was nicht zuletzt daran liegt, dass Berechnungen im Galois-Feld relativ komplex sind und daher üblicherweise erst im Mathematikstudium an der Uni durchgenommen werden. Folgend wollen wir also nur das Grundprinzip erläutern. Dieses sieht wie folgt aus: Jede Zelle einer Spalte wird mit einer PolynomKonstanten multipliziert, wobei von der aktuelle Zeile ausgehend die Konstanten 02, 03, 01 und 01 lauten. Anschließend werden die Ergebnisse jeder Spalte per XOR verknüpft und in der entsprechenden Zelle des neuen Blocks gespeichert. Zu diesem relativ komplexen Sachverhalt ein Beispiel: (Quelle: Screenshot von [6]) Wir beginnen mit der ersten Zelle (0,0) des neuen Blocks, welche, wie oben zu sehen, dann die Hexadezimalzahl 61 enthalten soll. Diese wird nun aus der ersten Spalte des alten Blocks berechnet: Je nachdem, welche Zelle wir in dem neuen Block füllen wollen, lautet die Polynom-Konstantenfolge anders: Sie beginnt mit der aktuelle zu füllenden Spalte und lautet für diese 02. Danach geht es abwärts weiter mit 03, 01 und 01. Zu unserem Bild: Wir sind dabei die erste Zelle zu füllen, also heißt die Konstante für die erste Zeile 02. Demnach wird 24 mit 02 multipliziert. Dies ist jedoch keine normale Multiplikation, sondern eine Polynom-Multiplikation im endlichen Galoisfeld, auf die wir hier nicht näher eingehen (für Interesierte gibt es den Quellcode später beim Implementieren). Aus der Polynom-Multiplikation von 24 und 02 ergibt sich 48 (01001000). Danach werden 60 und 03, was A0 (10100000) ergibt, 00 und 01, was 00 (00000000) ergibt und 89 und 01, was 89 (10001001) 182 HBS Kryptologie ergibt, im GF multipliziert. Diese vier Ergebnisse (48, A0, 00, 89) werden per XOR verknüpft. Diese Verknüpfung ergibt dann 61 (01100001). Das Ganze geht dann für diese Zeile so weiter: (Quelle: Screenshot von [6]) Wenn wir nun in die nächste Zeile wechseln, ändert sich die Zuordnung der Polynom-Konstanten: Die erste Zeile hat nun 01, die Zweite 02, die Dritte 03 und die Vierte 01. Man könnte es so ausdrücken, dass mit jedem Zeilenwechsel die Polynom-Konstanten eins nach unten rutschen oder auch so, dass sie sich, ausgehend von der aktuelle Zeile, nach unten hin anordnen. Die nächste Zeile sieht dann also so aus (siehe Farbveränderung im linken Block): (Quelle: Screenshot von [6]) 183 HBS Kryptologie Key Schedule Der Key-Schedule dient dazu, aus dem Anwenderpasswort zuerst den Benutzerschlüssel und anschließend den für die Verschlüsselung benötigten erweiterten Schlüssel zu generieren, der dann in die Rundenschlüssel aufgeteilt wird. Um aus dem Passwort den Benutzerschlüssel zu generieren, wird meistens ein sogenannter Hash verwendet, allerdings ist dies von den AES-Spezifikationen nicht vorgeschrieben, so dass es einem freisteht, auf welche Art man aus dem Kennwort den Benutzerschlüssel generiert. Ein Hash ist gewissermaßen ein Fingerabdruck des Passwortes. So werden zum Beispiel Hashs auch beim Einloggen z.B. in ein Forum im Internet benutzt. Bei der Anmeldung wird der Hash des Passwortes in einer Datenbank gespeichert. Beim erneuten Einloggen wird wiederrum ein Hash des neu eingegebenen Passwortes generiert; wenn beide Hashs übereinstimmen, war das Passwort dasselbe. Die Verwendung von Hashs dient einerseits der zusätzlichen Sicherheit, weil somit Rückschlüsse auf das Originalkennwort schwerer sind und andererseits der Einfachheit, denn Hash-Werte haben eine konstante Länge z.B. 128bit, 192bit, 256bit, 320bit, 512bit. So muss der Anwenderschlüssel nicht erst in der Länge verändert werden. (Allerdings Als erstes wird aus dem Benutzerkennwort ein Hash mit der gewünschten Länge, also 128bit/192bit/256bit, erzeugt, welcher dann den Benutzerschlüssel darstellt: Beispiel bei AES128: Passwort: abcdefg Hash: 693869bb17142a7a6b0407af81ee3410 Und im Blockformat: Aus diesem Start-Cipher werden jetzt die 10/12/14 Rundenschlüssel berechnet. Dieser Schritt wird KeyExpansion genannt. Die Funktion ExpandKey generiert jeweils aus dem vorherigen Cipherblock den neuen. Dies sieht folgendermaßen aus: 184 HBS Kryptologie Nun zu den Details: Um aus einem Cipher den darauffolgenden zu generieren, werden folgende Operationen angewendet: • • • • RotWord SubBytes Rcon XOR-Verküpfungen (4mal) Die einzelnen Funktionen sind recht trivial: RotWord Die Funktion RotWord (für RotateWord) verschiebt die Spalte einfach um eins nach oben. So wird aus dem… …das hier: SubBytes 185 HBS Kryptologie Die Funktion SubBytes kennen wir schon (siehe oben). Ein Wert wird durch sein Äquivalent in der S-Box ersetzt. Xor-Verküpfungen Diese kennen wir ebenfalls. XOR (exklusives Oder) entspricht einem entweder A oder B, aber nicht beide. Rcon Rcon ist eine interessante Neuerung. Rcon ist die stetige Potenz von x, also 02, zu einem benutzerspezifischen Wert. Die von Rcon zurückgegebene Spalte, Rcon[i], beinhaltet Werte die durch [xi-1, 00, 00, 00] gegeben sind, mit xi-1 als Anzahl der Exponenten von x (x als hexadezimaler Wert 02) im endlichen Galois-Feld(256). Alle Operationen bedienen sich der Arithmetik im Galois-Feld. Es erfolgt wiederum eine Modulo Reduktion mit dem unreduzierbaren Polynom m(x) = x8 + x4 + x3 + x + 1. Zum Beispiel ist Rcon(1) = 1, das Rcon(2) = 2, das Rcon(3) = 4 und das Rcon(9) die hexadezimale Nummer 1b. Es gilt Rcon(i) = x(254+i). Im Prinzip reichen für 128-Bit Blöcke 10 Rcons aus, da der Rijndael bei dieser Blockgröße nicht mehr Rcons verwendet. Die Rcon Werte können, wie die S-Box-Werte, als statische Tabelle vorliegen, die mit i=1 beginnt oder „on-the-fly“, also zur Laufzeit berechnet werden, wobei die on-the-fly Berechnung vor allem bei Situationen eingesetzt wird, wo Speicherplatz gespart werden muss. Ein vollständiger Array mit den vorausberechneten Werten könnte in der Implementierung dann so aussehen: 186 HBS Kryptologie Gesamter Ablauf des Key-Schedule Im Einzelnen gestaltete sich der gesamte Ablauf nun wie folgt: Je nach dem Typ von AES (AES128, AES192, AES256) gibt es horizontal 4/6/8 Spalten. Angefangen wird mit der ersten Spalte des neuen Blocks, die etwas aufwändiger berechnet wird als die darauffolgenden. Dazu wird die letzte Spalte des alten Blocks (aktuelle Spalte - 1 (Man denkt sich den erweiterten Cipher als horizontale Spaltenreihe)) mit der Funktion Rotword verändert. Danach wird jeder Wert der Spalte durch seinen entsprechenden Substitutionspartner ersetzt (SubBytes, siehe oben). Jetzt werden diese erzeugte Spalte und eine vorherige Spalte (aktuelle Spalte - 4) per XOR verknüpft. Die neu entstandene Spalte wird wiederum per XOR mit der Spalte verknüpft, die von der Funktion Rcon geliefert wird. Die daraus resultierende Spalte ist nun die erste Spalte des neuen Blocks. Die Berechnung der letzten Spalten des neuen Blocks geschieht einfacher. Sie resultieren aus einer XORVerknüpfung der vorherigen Spalte des neuen Blocks (aktuelle Spalte - 1) und einer vorherigen Spalte (aktuelle Spalte – 4). Bei AES256 gibt es noch die Besonderheit, dass die mittlere Spalte eines Blocks (4 Spalte) per S-Box substituiert wird. Grafisch dargestellt sieht dies so aus (AES128): Die Orange Spalte ist eine vorherige Spalte (Wi-1) nach der RotWord- und SubBytesTransformation. Grau ist die neue Spalte des ersten Blocks. 187 HBS Kryptologie Folgend sieht man die Berechnung der weiteren Spalten durch eine einfache XOR-Verknüpfung der vorherigen Spalte des aktuellen Blocks (Wi-1) und der entsprechenden Spalte des alten Blocks (Wi-4): Nach Abschluss des Schlüsselerweiterns (Key-Expansion) sieht der erweiterte Cipher folgendermaßen aus: ← An der Seite erkennt man den vollständig erweiterten Schlüssel bei AES128: beginnend mit dem blauen Startcipher und danach die 10 weiteren Rundenschlüssel. 188 HBS Kryptologie Zusammenfassung: AES ist eine Blockchiffre, das heißt die Daten werden blockweise verschlüsselt. Bei AES ist die Blockgröße mit 128-bit festgelegt, die Schlüssellänge kann 128, 192 oder 256 Bit betragen. Jeder Block wird zunächst in eine zweidimensionale Tabelle mit vier Zeilen und vier Spalten geschrieben, deren Zellen ein Byte groß sind. Jeder Block wird nun nacheinander bestimmten Transformationen unterzogen: SubBytes (Substitution per S-Box), ShiftRow (Zeilen verschieben), MixColumn (Operationen im GF(28)) und AddKeyRound (XOR mit Rundenschlüssel). Aber anstatt jeden Block einmal mit dem Schlüssel zu verschlüsseln, wendet AES verschiedene Teile des erweiterten Originalschlüssels nacheinander auf den Klartext-Block an. Die Anzahl dieser Runden variiert und ist von der Schlüssellänge abhängig, bei AES128 beträgt sie 10 Runden, bei AES192 beträgt sie 12 Runden und bei AES256 beträgt sie 14 Runden. Entschlüsselung: Bisher haben wir immer nur vom Verschlüsseln gesprochen. Doch wie kommt man an die verschlüsselten Daten wieder heran? Im Prinzip wird der ganze Algorithmus rückwärts durchlaufen, es gibt jedoch ein paar kleine Unterschiede: Es muss eine andere Substitutionsbox (S-Box) benutzt werden, die sich aus Original-S-Box berechnen lässt und ebenfalls als konstanter Array schon fest im Programm integriert werden kann. Eine andere Kleinigkeit ist, dass die Verschiebung der Zeilen der Funktion ShiftRow (im nachfolgenden InvShiftRow für InvertShiftRow) in die andere Richtung erfolgt. Die Berechnung der Rundenschlüssel (KeyExpansion, Key Schedule) ist beim Ver- und Entschlüsseln genau gleich. Es wird einfach beim letzten Teilschlüssel angefangen. Hierzu die Entschlüsselung noch mal als Grafik (Vorsicht! Von unten nach oben lesen!): 189 HBS Kryptologie Hier die andere S-Box zum Entschlüsseln als Beispielimplementation: 190 HBS Kryptologie Soweit so gut. Nun geht es nach der grauen Theorie an den spaßigen Teil: Das Schreiben eines eigenen Programmes, das per AES ver-/entschlüsselt! Den AES-Algorithmus programmieren Ich bevorzuge hier die Bottom-up-Methode, da man die einzelnen Funktionen besser testen kann: Zuerst werden die einzelnen Funktionen und Klassen implementiert, um dann nach und nach zum fertigen Algorithmus zusammengesetzt zu werden. 1. Die Verschlüsselung Die Verschlüsselung ist der Hauptbestandteil des Algorithmus. Sie generiert aus dem Input und dem expandierten Schlüssel den verschlüsselten Output. Sie arbeitet Blockweise, das heißt sie bekommt einen 4*4 großen Array, wobei die Blockgröße folglich 16Byte ist. Fangen wird also mit den vier Grundbestandteilen an: 1.1. AddRoundKey: Was braucht AddRoundKey? Natürlich erst einmal den Datenblock und dann den erweiterten Schlüssel. Da AddRoundKey etwas zurückgeben soll, nämlich den verschlüsselten Block, implementieren wir sie als Funktion: TBlock ist dabei ein statischer, zweidimensionaler Array mit der Abmessung 4*4, also unser so oft erwähnter Block. Er ist dabei wie folgend definiert: i gibt die Zeilennummer an, j die Spaltennummer. Das einzige, eventuell auf den ersten Blick Merkwürdige, dürfte hier sein, dass cipherblock ebenfalls vom Typ TBlock ist, obwohl wir immer von dem erweiterten Schlüssel geredet haben. Wie wir jedoch weiter oben erfahren haben, ist der 191 HBS Kryptologie expandierte Schlüssel nichts weiter als die 10+1Rundenschlüssel, welche ihrerseits eben auch nur Arrays der Größe 4*4, also vom Typ TBlock sind (Daher ist der expandierte Schlüssel auch als Array of TBlock implementiert, wie wir später sehen werden). 1.2. SubBytes: Subbytes benötigt eine Substitutionstabelle, wie oben schon beschrieben: Raffinierterweise sind die Werte im Array so angeordnet, dass, wenn man einfach den Ausgangswert als Index übergibt, den entsprechenden substituierten Wert erhält (siehe weiter oben). Dies vereinfacht die Implementierung auf ein Minimum: Übergeben wird wieder ein einzelner Block, welcher dann substituiert zurückgegeben wird. 1.3. ShiftRows: 192 HBS Kryptologie ShiftRows ist nun wirklich sehr einfach: Die Zeilen werden nach links geschoben, wie man ab dem zweiten Block abwärts erkennen kann. 1.4. MixColumn: Diese Funktion hat es wirklich in sich und ist sicherlich die komplizierteste in AES. Dies liegt nicht zuletzt daran, dass Berechnungen im Galoisfeld GF(2^8) durchgeführt werden, welches, wie bereits erwähnt, üblicherweise erst im Mathematikstudium an der Uni durchgenommen werden. Der Hauptteil ist noch relativ einfach: 193 HBS Kryptologie Die einzelnen Zellen einer Zeile werden mit entsprechenden Polynomen durch die Funktion gf_mul im Galois-Feld GF(2^8) multipliziert und dann per XOR verknüpft. Die Funktion gf_mul ist dabei ungleich komplizierter: 194 HBS Kryptologie ************************ Nun haben wir die vier Grundfunktionen und können uns daran machen, uns daraus eine Funktion zu basteln, die uns aus einem Eingabeblock und dem expandierten Schlüssel einen verschlüsselten Block generiert: Es beginnt mit einer Anfangsrunde (initial round), wobei nur AddRoundKey angewandt wird. Danach folgen die 10 Hauptrunden, welche die vier Grundfunktionen mit jeweils dem der Runde entsprechenden Teilschlüssel aufrufen (Ausnahme ist die Schlussrunde, bei der die Funktion MixColumn ausgelassen wird). Der fertige Block wird dann als Rückgabewert zurückgegeben. 2. Die Entschlüsselung Die Entschlüsselung ist ein weiterer Hauptbestandteil des Algorithmus. Sie unterscheidet sich nicht besonders von der Verschlüsselung, außer dass eine andere S-Box benutzt wird, sowie bei Mixcolumn andere Polynome. Der Großteil ist zu Verschlüsselung äquivalent und läuft eigentlich nur rückwärts: 2.1. AddRoundKey: AddRoundkey stellt einen Sonderfall da: Da XOR-Operationen selbstinvers sind, d.h nach doppelter Anwendung entsteht wieder der Ausgangswert, kann die Funktion genau so bleiben wie sie ist, wir brauchen keinen Pendant. 195 HBS Kryptologie 2.2. InvSubBytes: InvSubbytes benötigt eine andere Substitutionstabelle als SubBytes: Der Unterschied der Funktion InvSubBytes zur Funktion SubBytes ist minimal: nur die Substitutionstabelle ändert sich: 2.3. InvShiftRows: InvShiftRows ändert sich nur dahingehend, dass die Verschiebung in die andere Richtung hin erfolgt: 196 HBS Kryptologie 2.4. MixColumn: Die komplizierte MixColumn-Funktion ändert sich nur im Hauptteil, wobei andere Polynome verwendet werden: 197 HBS Kryptologie Das Pendant zu der Funktion encryptblock, decryptblock läuft im Vergleich zu encryptblock genau rückwärts: (High(x) liefert den Index des höchsten Elements des dynamischen Arrays) 3. Die Schlüsselexpansion (Key Schedule) Hierbei werden aus dem Startschlüssel, welcher als einfach TBlock gesehen werden kann, die 10/12/14 weiteren Rundenschlüssel erzeugt, so dass schließlich 198 HBS Kryptologie 10+1/12+1/13+1 Schlüssel vorliegen. Diese können in einem Array gespeichert werden, welcher als Array von TBlock definiert werden kann: TCipherTable enthält die 10+1/12+1/14+1 Rundenschlüssel vom Typ TBlock, auf die wieder per ciphertable[x] zugegriffen werden kann. Kommen wir zu den einzelnen Funktionen: Diese lassen sich in zwei Teile aufteilen: • den Kern (core), welcher nur für die erste Spalte des neuen Blocks zum Einsatz kommt • die XOR-Verknüpfung der Spalten W-1 und W-4 zu der neuen Spalte (siehe oben) 3.1. RowWord: Die Funktion RotWord verschiebt die Zellen innerhalb einer Spalte einfach um eins nach unten: 3.2. SubWord/SubBytes: SubWord macht im Prinzip genau das wie SubBytes, nur auf Spaltenebene: 199 HBS Kryptologie 3.3. Rcon: Rcon liefert für einen bestimmten Wert (der der aktuellen Runde entspricht) eine Spalte des Aufbaus {x, 0, 0, 0}, wobei x der von Rcon erzeugte Wert ist. RconTable ist wieder ein vordefinierter Array (ähnlich SubBytes): Die Implementation von Rcon sieht dann so aus: Diese drei Einzelfunktionen, die den Kern bilden, können auch zu einer Funktion zusammengefasst werden, die anschließend etwas vereinfacht wird. Die Funktion core bekommt für rcon die Runden und die Spalte übergeben, welche wieder zurückgegeben wird (var-Parameter übergibt das Original, nicht wie sonst eine Kopie des Speicherbereichs). Hier also die core-Funktion: 200 HBS Kryptologie Die Verknüpfung der Spalten per XOR können wir sodann in die Hauptfunktion einbauen: 201 HBS Kryptologie 202 HBS Kryptologie Die obige Hauptfunktion (expandkey) erhält den Benutzerschlüssel (als array of byte), die Länge, auf welche expandiert werden soll (in Byte) und die Länge des Schlüssel (in Byte). Zuerst werden einige Werte initialisiert. Dann wird die Länge des Rückgabewerts, der als dynamischer Array definiert ist, festgelegt. Als nächstes wird der Benutzerschlüssel per for-Schleife schon einmal in den expandierten Schlüssel kopiert und die aktuelle Position wird aktualisiert. Dann beginnt die eigentliche Schlüsselerweiterung: Zuerst wird die letzte Spalte des vorherigen Blocks in den temporären Zwischenspeicher t kopiert. Falls wir uns jetzt am Anfang eines neuen Blocks befinden, wird der core aufgerufen (RotWord, SubBytes, Rcon). Bei AES256 gibt es die Besonderheit, dass zusätzlich noch die mittlere Spalte per S-Box substituiert wird. Dann werden diese Spalte und die Spalte 4 davor (W-4) per XOR verknüpft. Das resultierende Ergebnis ist die nächste Spalte des aktuellen Blocks. Dieser ganze Vorgang wird solange wiederholt, bis die gewünschte Schlüssellänge erreicht ist. Nun sollten wir noch eine Funktion erstellen, die uns aus einem eingegeben Schlüssel als String und der Angabe des AES-Modus den erweiterten Schlüssel generiert. Aus dem Passwort wird ein 128bit/192bit/256bit Hash erzeugt. Hierbei ist der sogenannte Haval-Algorithmus vorteilhaft, da man bei ihm die gewünschte Länge des Hash‘s angeben kann. Andere Hash-Algorithmen wie MD5 haben dagegen eine einzige, konstante Länge. Hier nun die endgültige Hauptfunktion für die Schlüsselexpansion: 203 HBS Kryptologie Zuerst werden anhand des AES-Typs die entsprechenden Parameter festgelegt. Dann werden die Längen des Benutzerschlüssels, des erweiterten Schlüssels als Bytearray und des erweiterten Schlüssels als Array of TBlock festgelegt. Dann wird von dem Passwort ein Hash (Benutzerschlüssel) erzeugt und von einem Hex-String in einen Array of Byte umgewandelt. Nun wird der Schlüssel expandiert und danach in einen Array off TBlock umgewandelt, welcher dann verwendet wird. 204 HBS Kryptologie Damit wäre der AES-Algorithmus fertig gestellt, zumindest soweit wie er offiziell festgelegt ist (außer der Art des Umwandelns des Passwortes). Für den Rest, also wie die Daten bzw. die Datei in die für den Blockalgorithmus benötigten 16-Byte (128bit) Blöcke zerlegt wird, gibt es keine offiziellen Richtlinien, jedoch wird meistens nach folgendem Prinzip vorgegangen: Die Datei wird solange in 16 Byte-Blöcken eingelesen und verarbeitet, bis die Restgröße <= 16 ist. Da der Blockalgorithmus aber nur mit 16Byte Blöcken arbeiten kann, muss die Datei meistens erweitert, also mit Fülldaten aufgefüllt („gepaddet“) werden. Damit jedoch dadurch die ursprüngliche Datei beim Entschlüsseln nicht zerstört wird, wird immer mit einem eindeutigen Muster aufgefüllt. Für den Fall, dass die Restgröße 16 ist, also die Dateigröße durch 16 ganz teilbar ist (Size mod 16 = 0), wird ein ganzer neuer Block erzeugt. Dieser beginnt mit einer Eins und enthält ansonsten nur Nullen. Für den wahrscheinlicheren Fall, dass die Restgröße < 16 ist, wird der Rest, begonnen mit einer 1, mit Nullen aufgefüllt, bis die Größe stimmt, was die Datei dann natürlich entsprechend größer werden lässt. Wenn die Restgröße = 15 ist, hat dies ungünstigerweise zur Folge, dass nun eine 1 aufgefüllt wird und der Block damit voll ist. Damit das Ende trotzdem identifiziert werden kann, wird ein ganzer weiterer Block mit Nullen erzeugt, so dass die Ausgabedatei dann 16 Byte größer ist als der Input. Dies ist die maximale Größenänderung, die jedoch nur für die Fälle Restgröße = 16 und Restgröße = 15 eintritt. Ein paar Beispiele: Das Ende der Datei ist genau 16 Byte groß: …abeög5b3sl9äv73n (16Z) dann folgt daraus: …abeög5b3sl9äv73n1000000000000000 (32Z) Bei einem 15Byte großen Ende: …abeög5b3sl9äv73 (15Z) Dann: …abeög5b3sl9äv7310000000000000000 (32Z) Bei 14Byte: …abeög5b3sl9äv7 (14Z) dann: …abeög5b3sl9äv710 (16Z) 205 HBS Kryptologie Und abschließend noch z.B. 5Byte: …abeög (5Z) Dann: …abeög10000000000 (16Z) Nun gibt es bei Blockchiffren verschiedene Betriebsarten. Die zwei Standard-Modi sind: • ECB (Electronic Code Book Mode) • CBC (Cipher Block Chaining Mode) ECB ist der einfachste aber auch unsicherste Modus. Die Klartextblöcke werden nacheinander und unabhängig voneinander verschlüsselt. Dies ist nicht ganz risikolos, denn dadurch werden Klartextmuster nicht verwischt. Gleiche Klartextblöcke ergeben (bei gleichen Schlüssel) auch immer den gleichen Geheimtextblock. Dadurch kann man, hinreichend vielen Geheimtextblöcken und partiellen Annahmen über den Klartext, Rückschlüsse auf den geheimen Schlüssel ziehen. Dazu eine Grafik: CBC ist dagegen sicherer, aber auch aufwändiger, vor allem deswegen, weil ein Initialisierungsvektor benötigt wird, der meistens aus Zufallszahlen besteht und der neben dem geheimen Schlüssel mit übertragen werden muss. Allerdings kann der Initialisierungsvektor auch öffentlich sein, es ist keinen zusätzlichen Schutz, ihn geheim zu halten. Der Vorteil ist, dass selbst genau die gleichen Daten zu unterschiedlichen Outputs führen, wenn sich die Initialisierungsvektoren 206 HBS Kryptologie unterscheiden. CBC funktioniert folgendermaßen: Vor dem Verschlüsseln eines Klartextblocks wird dieser zuvor mit dem im letzten Schritt erzeugten Geheimtextblock per XOR verknüpft. Dazu ist bei der ersten Verschlüsselung allerdings ein IV notwendig. Den Vorgang nochmals als Grafik: bzw. bei der Entschlüsselung: 207 HBS Kryptologie Bemerkungen zum Beispielprogramm Das Beispielprogramm, das sich in den Begleitdateien befindet, ist aufgeteilt in Algorithmus und Frontend. So ist der Quellcode des Algorithmus auf einfache Weise wiederzuverwenden. Für eine bessere Performance ist der Algorithmus noch in einen Thread gekapselt. Das Frontend bietet alle Möglichkeiten von AES an: • Die Wahl des Modi: AES128, AES192, AES256 • Ver- oder Entschlüsseln Zusätzlich wird zwischen einem Datei- und Textmodus unterschieden, wobei der Textmodus allerdings intern auf dem Dateimodus aufsetzt. Aufgrund der Tatsache, dass bei der Verschlüsselung #0 (ASCII NULL-Zeichen) entstehen können, kann der verschlüsselte Text beim Textmodus nicht in einem zweiten Memo angezeigt werden. Dies liegt daran, dass die VCL von Delphi noch nicht Unicode fähig ist und daher noch normale Strings verwendet werden, welche #0 als Endzeichen interpretieren. Deshalb wird der Umweg über den Windows-Editor gegangen. Der Algorithmus benutzt das ECB-Verfahren, es sollte jedoch kein allzu großes Problem sei, ihn um eine Wahlmöglichkeit und andere Verfahren zu erweitern. Zu bemerken ist noch, dass der Algorithmus eher auf Verständlichkeit als auf Schnelligkeit getrimmt ist. So müsste man die Daten nicht als zweidimensionalen Array verwalteten, was für den Computer schwieriger, für uns aber leichter zu verstehen ist. Zurzeit hat er einen Datendurchsatz von etwa 1 MB/s (AES128) bis 0,7 MB/s (AES256) beim Verschlüsseln und etwa 0,66 MB/s (AES128) bis 0,4 MB/s (AES256) beim Entschlüsseln. Die Geschwindigkeit könnte jedoch vor allem durch sogenannte forward and reverse tables (Vorwärts- und Rückwärts-Tabellen) spürbar erhöht werden (auf etwa 8MB/s), auf welche jedoch hier im Script aus Übersichtlichkeitsgründen verzichtet wurde. In den Begleitdateien findet sich eine optimierte Variante, die diese Tabellen benutzt, und sowohl in Hin- als auch in Rückrichtung einen Datendurchsatz von etwa 4,5-6MB/s erreicht. Begleitdateien • • AES_Beispiel_Programm (leichter, da zweidimensionale Arrays benutzt werden) AES_Beispiel_Programm_Optimiert (viel schneller, z.T. verständlicher) 208 HBS Kryptologie Anhang Test-Vektoren V.1 AES-128 (Encrypt) Plaintext: Key: … Output: 00112233445566778899aabbccddeeff 000102030405060708090a0b0c0d0e0f 69c4e0d86a7b0430d8cdb78070b4c55a (Decrypt) Input: Key: … Plaintext: 69c4e0d86a7b0430d8cdb78070b4c55a 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff V.2 AES-192 (Encrypt) Plaintext: Key: … Output: 00112233445566778899aabbccddeeff 000102030405060708090a0b0c0d0e0f1011121314151617 dda97ca4864cdfe06eaf70a0ec0d7191 (Decrypt) Input: Key: … Plaintext: dda97ca4864cdfe06eaf70a0ec0d7191 000102030405060708090a0b0c0d0e0f1011121314151617 00112233445566778899aabbccddeeff 209 HBS Kryptologie V.3 AES-256 (Encrypt) Plaintext: Key: … Output: 00112233445566778899aabbccddeeff 000102030405060708090a0b0c0d0e0f101112131415 161718191a1b1c1d1e1f 8ea2b7ca516745bfeafc49904b496089 (Decrypt) Input: Key: … Plaintext: 8ea2b7ca516745bfeafc49904b496089 000102030405060708090a0b0c0d0e0f101112131415 161718191a1b1c1d1e1f 00112233445566778899aabbccddeeff 210 HBS Kryptologie Vollständige Test-Vektoren-Übersicht: Legende: input: iinput: start: istart: s_box: is_box: s_row: is_row: k_sch: ik_sch: ik_add: output: Cipher input inverse cipher input State am Anfang von rounde[r] State am Anfang von rounde[r] State nach SubBytes() State nach InvSubBytes() State nach ShiftRows() State nach InvShiftRows() Rundenschlüssel für runde[r] Rundenschlüssel für round[r] State nach AddRoundKey Cipher output C.1 AES-128 PLAINTEXT: 00112233445566778899aabbccddeeff KEY: 000102030405060708090a0b0c0d0e0f CIPHER (ENCRYPT): round[ 0].input 00112233445566778899aabbccddeeff round[ 0].k_sch 000102030405060708090a0b0c0d0e0f round[ 1].start 00102030405060708090a0b0c0d0e0f0 round[ 1].s_box 63cab7040953d051cd60e0e7ba70e18c round[ 1].s_row 6353e08c0960e104cd70b751bacad0e7 round[ 1].m_col 5f72641557f5bc92f7be3b291db9f91a round[ 1].k_sch d6aa74fdd2af72fadaa678f1d6ab76fe round[ 2].start 89d810e8855ace682d1843d8cb128fe4 round[ 2].s_box a761ca9b97be8b45d8ad1a611fc97369 round[ 2].s_row a7be1a6997ad739bd8c9ca451f618b61 round[ 2].m_col ff87968431d86a51645151fa773ad009 round[ 2].k_sch b692cf0b643dbdf1be9bc5006830b3fe round[ 3].start 4915598f55e5d7a0daca94fa1f0a63f7 round[ 3].s_box 3b59cb73fcd90ee05774222dc067fb68 round[ 3].s_row 3bd92268fc74fb735767cbe0c0590e2d round[ 3].m_col 4c9c1e66f771f0762c3f868e534df256 round[ 3].k_sch b6ff744ed2c2c9bf6c590cbf0469bf41 round[ 4].start fa636a2825b339c940668a3157244d17 round[ 4].s_box 2dfb02343f6d12dd09337ec75b36e3f0 round[ 4].s_row 2d6d7ef03f33e334093602dd5bfb12c7 round[ 4].m_col 6385b79ffc538df997be478e7547d691 round[ 4].k_sch 47f7f7bc95353e03f96c32bcfd058dfd round[ 5].start 247240236966b3fa6ed2753288425b6c round[ 5].s_box 36400926f9336d2d9fb59d23c42c3950 round[ 5].s_row 36339d50f9b539269f2c092dc4406d23 round[ 5].m_col f4bcd45432e554d075f1d6c51dd03b3c 211 HBS Kryptologie round[ 5].k_sch round[ 6].start round[ 6].s_box round[ 6].s_row round[ 6].m_col round[ 6].k_sch round[ 7].start round[ 7].s_box round[ 7].s_row round[ 7].m_col round[ 7].k_sch round[ 8].start round[ 8].s_box round[ 8].s_row round[ 8].m_col round[ 8].k_sch round[ 9].start round[ 9].s_box round[ 9].s_row round[ 9].m_col round[ 9].k_sch round[10].start round[10].s_box round[10].s_row round[10].k_sch round[10].output 3caaa3e8a99f9deb50f3af57adf622aa c81677bc9b7ac93b25027992b0261996 e847f56514dadde23f77b64fe7f7d490 e8dab6901477d4653ff7f5e2e747dd4f 9816ee7400f87f556b2c049c8e5ad036 5e390f7df7a69296a7553dc10aa31f6b c62fe109f75eedc3cc79395d84f9cf5d b415f8016858552e4bb6124c5f998a4c b458124c68b68a014b99f82e5f15554c c57e1c159a9bd286f05f4be098c63439 14f9701ae35fe28c440adf4d4ea9c026 d1876c0f79c4300ab45594add66ff41f 3e175076b61c04678dfc2295f6a8bfc0 3e1c22c0b6fcbf768da85067f6170495 baa03de7a1f9b56ed5512cba5f414d23 47438735a41c65b9e016baf4aebf7ad2 fde3bad205e5d0d73547964ef1fe37f1 5411f4b56bd9700e96a0902fa1bb9aa1 54d990a16ba09ab596bbf40ea111702f e9f74eec023020f61bf2ccf2353c21c7 549932d1f08557681093ed9cbe2c974e bd6e7c3df2b5779e0b61216e8b10b689 7a9f102789d5f50b2beffd9f3dca4ea7 7ad5fda789ef4e272bca100b3d9ff59f 13111d7fe3944a17f307a78b4d2b30c5 69c4e0d86a7b0430d8cdb78070b4c55a INVERSE CIPHER (DECRYPT): round[ 0].iinput 69c4e0d86a7b0430d8cdb78070b4c55a round[ 0].ik_sch 13111d7fe3944a17f307a78b4d2b30c5 round[ 1].istart 7ad5fda789ef4e272bca100b3d9ff59f round[ 1].is_row 7a9f102789d5f50b2beffd9f3dca4ea7 round[ 1].is_box bd6e7c3df2b5779e0b61216e8b10b689 round[ 1].ik_sch 549932d1f08557681093ed9cbe2c974e round[ 1].ik_add e9f74eec023020f61bf2ccf2353c21c7 round[ 2].istart 54d990a16ba09ab596bbf40ea111702f round[ 2].is_row 5411f4b56bd9700e96a0902fa1bb9aa1 round[ 2].is_box fde3bad205e5d0d73547964ef1fe37f1 round[ 2].ik_sch 47438735a41c65b9e016baf4aebf7ad2 round[ 2].ik_add baa03de7a1f9b56ed5512cba5f414d23 round[ 3].istart 3e1c22c0b6fcbf768da85067f6170495 round[ 3].is_row 3e175076b61c04678dfc2295f6a8bfc0 round[ 3].is_box d1876c0f79c4300ab45594add66ff41f round[ 3].ik_sch 14f9701ae35fe28c440adf4d4ea9c026 round[ 3].ik_add c57e1c159a9bd286f05f4be098c63439 round[ 4].istart b458124c68b68a014b99f82e5f15554c round[ 4].is_row b415f8016858552e4bb6124c5f998a4c round[ 4].is_box c62fe109f75eedc3cc79395d84f9cf5d round[ 4].ik_sch 5e390f7df7a69296a7553dc10aa31f6b round[ 4].ik_add 9816ee7400f87f556b2c049c8e5ad036 round[ 5].istart e8dab6901477d4653ff7f5e2e747dd4f 212 HBS Kryptologie round[ 5].is_row round[ 5].is_box round[ 5].ik_sch round[ 5].ik_add round[ 6].istart round[ 6].is_row round[ 6].is_box round[ 6].ik_sch round[ 6].ik_add round[ 7].istart round[ 7].is_row round[ 7].is_box round[ 7].ik_sch round[ 7].ik_add round[ 8].istart round[ 8].is_row round[ 8].is_box round[ 8].ik_sch round[ 8].ik_add round[ 9].istart round[ 9].is_row round[ 9].is_box round[ 9].ik_sch round[ 9].ik_add round[10].istart round[10].is_row round[10].is_box round[10].ik_sch round[10].ioutput e847f56514dadde23f77b64fe7f7d490 c81677bc9b7ac93b25027992b0261996 3caaa3e8a99f9deb50f3af57adf622aa f4bcd45432e554d075f1d6c51dd03b3c 36339d50f9b539269f2c092dc4406d23 36400926f9336d2d9fb59d23c42c3950 247240236966b3fa6ed2753288425b6c 47f7f7bc95353e03f96c32bcfd058dfd 6385b79ffc538df997be478e7547d691 2d6d7ef03f33e334093602dd5bfb12c7 2dfb02343f6d12dd09337ec75b36e3f0 fa636a2825b339c940668a3157244d17 b6ff744ed2c2c9bf6c590cbf0469bf41 4c9c1e66f771f0762c3f868e534df256 3bd92268fc74fb735767cbe0c0590e2d 3b59cb73fcd90ee05774222dc067fb68 4915598f55e5d7a0daca94fa1f0a63f7 b692cf0b643dbdf1be9bc5006830b3fe ff87968431d86a51645151fa773ad009 a7be1a6997ad739bd8c9ca451f618b61 a761ca9b97be8b45d8ad1a611fc97369 89d810e8855ace682d1843d8cb128fe4 d6aa74fdd2af72fadaa678f1d6ab76fe 5f72641557f5bc92f7be3b291db9f91a 6353e08c0960e104cd70b751bacad0e7 63cab7040953d051cd60e0e7ba70e18c 00102030405060708090a0b0c0d0e0f0 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff C.2 AES-192 PLAINTEXT: 00112233445566778899aabbccddeeff KEY: 000102030405060708090a0b0c0d0e0f1011121314151617 CIPHER (ENCRYPT): round[ 0].input 00112233445566778899aabbccddeeff round[ 0].k_sch 000102030405060708090a0b0c0d0e0f round[ 1].start 00102030405060708090a0b0c0d0e0f0 round[ 1].s_box 63cab7040953d051cd60e0e7ba70e18c round[ 1].s_row 6353e08c0960e104cd70b751bacad0e7 round[ 1].m_col 5f72641557f5bc92f7be3b291db9f91a round[ 1].k_sch 10111213141516175846f2f95c43f4fe round[ 2].start 4f63760643e0aa85aff8c9d041fa0de4 round[ 2].s_box 84fb386f1ae1ac977941dd70832dd769 round[ 2].s_row 84e1dd691a41d76f792d389783fbac70 round[ 2].m_col 9f487f794f955f662afc86abd7f1ab29 round[ 2].k_sch 544afef55847f0fa4856e2e95c43f4fe round[ 3].start cb02818c17d2af9c62aa64428bb25fd7 round[ 3].s_box 1f770c64f0b579deaaac432c3d37cf0e round[ 3].s_row 1fb5430ef0accf64aa370cde3d77792c 213 HBS Kryptologie round[ 3].m_col round[ 3].k_sch round[ 4].start round[ 4].s_box round[ 4].s_row round[ 4].m_col round[ 4].k_sch round[ 5].start round[ 5].s_box round[ 5].s_row round[ 5].m_col round[ 5].k_sch round[ 6].start round[ 6].s_box round[ 6].s_row round[ 6].m_col round[ 6].k_sch round[ 7].start round[ 7].s_box round[ 7].s_row round[ 7].m_col round[ 7].k_sch round[ 8].start round[ 8].s_box round[ 8].s_row round[ 8].m_col round[ 8].k_sch round[ 9].start round[ 9].s_box round[ 9].s_row round[ 9].m_col round[ 9].k_sch round[10].start round[10].s_box round[10].s_row round[10].m_col round[10].k_sch round[11].start round[11].s_box round[11].s_row round[11].m_col round[11].k_sch round[12].start round[12].s_box round[12].s_row round[12].k_sch round[12].output b7a53ecbbf9d75a0c40efc79b674cc11 40f949b31cbabd4d48f043b810b7b342 f75c7778a327c8ed8cfebfc1a6c37f53 684af5bc0acce85564bb0878242ed2ed 68cc08ed0abbd2bc642ef555244ae878 7a1e98bdacb6d1141a6944dd06eb2d3e 58e151ab04a2a5557effb5416245080c 22ffc916a81474416496f19c64ae2532 9316dd47c2fa92834390a1de43e43f23 93faa123c2903f4743e4dd83431692de aaa755b34cffe57cef6f98e1f01c13e6 2ab54bb43a02f8f662e3a95d66410c08 80121e0776fd1d8a8d8c31bc965d1fee cdc972c53854a47e5d64c765904cc028 cd54c7283864c0c55d4c727e90c9a465 921f748fd96e937d622d7725ba8ba50c f501857297448d7ebdf1c6ca87f33e3c 671ef1fd4e2a1e03dfdcb1ef3d789b30 8572a1542fe5727b9e86c8df27bc1404 85e5c8042f8614549ebca17b277272df e913e7b18f507d4b227ef652758acbcc e510976183519b6934157c9ea351f1e0 0c0370d00c01e622166b8accd6db3a2c fe7b5170fe7c8e93477f7e4bf6b98071 fe7c7e71fe7f807047b95193f67b8e4b 6cf5edf996eb0a069c4ef21cbfc25762 1ea0372a995309167c439e77ff12051e 7255dad30fb80310e00d6c6b40d0527c 40fc5766766c7bcae1d7507f09700010 406c501076d70066e17057ca09fc7b7f 7478bcdce8a50b81d4327a9009188262 dd7e0e887e2fff68608fc842f9dcc154 a906b254968af4e9b4bdb2d2f0c44336 d36f3720907ebf1e8d7a37b58c1c1a05 d37e3705907a1a208d1c371e8c6fbfb5 0d73cc2d8f6abe8b0cf2dd9bb83d422e 859f5f237a8d5a3dc0c02952beefd63a 88ec930ef5e7e4b6cc32f4c906d29414 c4cedcabe694694e4b23bfdd6fb522fa c494bffae62322ab4bb5dc4e6fce69dd 71d720933b6d677dc00b8f28238e0fb7 de601e7827bcdf2ca223800fd8aeda32 afb73eeb1cd1b85162280f27fb20d585 79a9b2e99c3e6cd1aa3476cc0fb70397 793e76979c3403e9aab7b2d10fa96ccc a4970a331a78dc09c418c271e3a41d5d dda97ca4864cdfe06eaf70a0ec0d7191 INVERSE CIPHER (DECRYPT): round[ 0].iinput dda97ca4864cdfe06eaf70a0ec0d7191 round[ 0].ik_sch a4970a331a78dc09c418c271e3a41d5d 214 HBS Kryptologie round[ 1].istart round[ 1].is_row round[ 1].is_box round[ 1].ik_sch round[ 1].ik_add round[ 2].istart round[ 2].is_row round[ 2].is_box round[ 2].ik_sch round[ 2].ik_add round[ 3].istart round[ 3].is_row round[ 3].is_box round[ 3].ik_sch round[ 3].ik_add round[ 4].istart round[ 4].is_row round[ 4].is_box round[ 4].ik_sch round[ 4].ik_add round[ 5].istart round[ 5].is_row round[ 5].is_box round[ 5].ik_sch round[ 5].ik_add round[ 6].istart round[ 6].is_row round[ 6].is_box round[ 6].ik_sch round[ 6].ik_add round[ 7].istart round[ 7].is_row round[ 7].is_box round[ 7].ik_sch round[ 7].ik_add round[ 8].istart round[ 8].is_row round[ 8].is_box round[ 8].ik_sch round[ 8].ik_add round[ 9].istart round[ 9].is_row round[ 9].is_box round[ 9].ik_sch round[ 9].ik_add round[10].istart round[10].is_row round[10].is_box round[10].ik_sch round[10].ik_add round[11].istart 793e76979c3403e9aab7b2d10fa96ccc 79a9b2e99c3e6cd1aa3476cc0fb70397 afb73eeb1cd1b85162280f27fb20d585 de601e7827bcdf2ca223800fd8aeda32 71d720933b6d677dc00b8f28238e0fb7 c494bffae62322ab4bb5dc4e6fce69dd c4cedcabe694694e4b23bfdd6fb522fa 88ec930ef5e7e4b6cc32f4c906d29414 859f5f237a8d5a3dc0c02952beefd63a 0d73cc2d8f6abe8b0cf2dd9bb83d422e d37e3705907a1a208d1c371e8c6fbfb5 d36f3720907ebf1e8d7a37b58c1c1a05 a906b254968af4e9b4bdb2d2f0c44336 dd7e0e887e2fff68608fc842f9dcc154 7478bcdce8a50b81d4327a9009188262 406c501076d70066e17057ca09fc7b7f 40fc5766766c7bcae1d7507f09700010 7255dad30fb80310e00d6c6b40d0527c 1ea0372a995309167c439e77ff12051e 6cf5edf996eb0a069c4ef21cbfc25762 fe7c7e71fe7f807047b95193f67b8e4b fe7b5170fe7c8e93477f7e4bf6b98071 0c0370d00c01e622166b8accd6db3a2c e510976183519b6934157c9ea351f1e0 e913e7b18f507d4b227ef652758acbcc 85e5c8042f8614549ebca17b277272df 8572a1542fe5727b9e86c8df27bc1404 671ef1fd4e2a1e03dfdcb1ef3d789b30 f501857297448d7ebdf1c6ca87f33e3c 921f748fd96e937d622d7725ba8ba50c cd54c7283864c0c55d4c727e90c9a465 cdc972c53854a47e5d64c765904cc028 80121e0776fd1d8a8d8c31bc965d1fee 2ab54bb43a02f8f662e3a95d66410c08 aaa755b34cffe57cef6f98e1f01c13e6 93faa123c2903f4743e4dd83431692de 9316dd47c2fa92834390a1de43e43f23 22ffc916a81474416496f19c64ae2532 58e151ab04a2a5557effb5416245080c 7a1e98bdacb6d1141a6944dd06eb2d3e 68cc08ed0abbd2bc642ef555244ae878 684af5bc0acce85564bb0878242ed2ed f75c7778a327c8ed8cfebfc1a6c37f53 40f949b31cbabd4d48f043b810b7b342 b7a53ecbbf9d75a0c40efc79b674cc11 1fb5430ef0accf64aa370cde3d77792c 1f770c64f0b579deaaac432c3d37cf0e cb02818c17d2af9c62aa64428bb25fd7 544afef55847f0fa4856e2e95c43f4fe 9f487f794f955f662afc86abd7f1ab29 84e1dd691a41d76f792d389783fbac70 215 HBS Kryptologie round[11].is_row round[11].is_box round[11].ik_sch round[11].ik_add round[12].istart round[12].is_row round[12].is_box round[12].ik_sch round[12].ioutput 84fb386f1ae1ac977941dd70832dd769 4f63760643e0aa85aff8c9d041fa0de4 10111213141516175846f2f95c43f4fe 5f72641557f5bc92f7be3b291db9f91a 6353e08c0960e104cd70b751bacad0e7 63cab7040953d051cd60e0e7ba70e18c 00102030405060708090a0b0c0d0e0f0 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff C.3 AES-256 PLAINTEXT: 00112233445566778899aabbccddeeff KEY: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f CIPHER (ENCRYPT): round[ 0].input 00112233445566778899aabbccddeeff round[ 0].k_sch 000102030405060708090a0b0c0d0e0f round[ 1].start 00102030405060708090a0b0c0d0e0f0 round[ 1].s_box 63cab7040953d051cd60e0e7ba70e18c round[ 1].s_row 6353e08c0960e104cd70b751bacad0e7 round[ 1].m_col 5f72641557f5bc92f7be3b291db9f91a round[ 1].k_sch 101112131415161718191a1b1c1d1e1f round[ 2].start 4f63760643e0aa85efa7213201a4e705 round[ 2].s_box 84fb386f1ae1ac97df5cfd237c49946b round[ 2].s_row 84e1fd6b1a5c946fdf4938977cfbac23 round[ 2].m_col bd2a395d2b6ac438d192443e615da195 round[ 2].k_sch a573c29fa176c498a97fce93a572c09c round[ 3].start 1859fbc28a1c00a078ed8aadc42f6109 round[ 3].s_box adcb0f257e9c63e0bc557e951c15ef01 round[ 3].s_row ad9c7e017e55ef25bc150fe01ccb6395 round[ 3].m_col 810dce0cc9db8172b3678c1e88a1b5bd round[ 3].k_sch 1651a8cd0244beda1a5da4c10640bade round[ 4].start 975c66c1cb9f3fa8a93a28df8ee10f63 round[ 4].s_box 884a33781fdb75c2d380349e19f876fb round[ 4].s_row 88db34fb1f807678d3f833c2194a759e round[ 4].m_col b2822d81abe6fb275faf103a078c0033 round[ 4].k_sch ae87dff00ff11b68a68ed5fb03fc1567 round[ 5].start 1c05f271a417e04ff921c5c104701554 round[ 5].s_box 9c6b89a349f0e18499fda678f2515920 round[ 5].s_row 9cf0a62049fd59a399518984f26be178 round[ 5].m_col aeb65ba974e0f822d73f567bdb64c877 round[ 5].k_sch 6de1f1486fa54f9275f8eb5373b8518d round[ 6].start c357aae11b45b7b0a2c7bd28a8dc99fa round[ 6].s_box 2e5bacf8af6ea9e73ac67a34c286ee2d round[ 6].s_row 2e6e7a2dafc6eef83a86ace7c25ba934 round[ 6].m_col b951c33c02e9bd29ae25cdb1efa08cc7 round[ 6].k_sch c656827fc9a799176f294cec6cd5598b round[ 7].start 7f074143cb4e243ec10c815d8375d54c round[ 7].s_box d2c5831a1f2f36b278fe0c4cec9d0329 round[ 7].s_row d22f0c291ffe031a789d83b2ecc5364c round[ 7].m_col ebb19e1c3ee7c9e87d7535e9ed6b9144 216 HBS Kryptologie round[ 7].k_sch round[ 8].start round[ 8].s_box round[ 8].s_row round[ 8].m_col round[ 8].k_sch round[ 9].start round[ 9].s_box round[ 9].s_row round[ 9].m_col round[ 9].k_sch round[10].start round[10].s_box round[10].s_row round[10].m_col round[10].k_sch round[11].start round[11].s_box round[11].s_row round[11].m_col round[11].k_sch round[12].start round[12].s_box round[12].s_row round[12].m_col round[12].k_sch round[13].start round[13].s_box round[13].s_row round[13].m_col round[13].k_sch round[14].start round[14].s_box round[14].s_row round[14].k_sch round[14].output 3de23a75524775e727bf9eb45407cf39 d653a4696ca0bc0f5acaab5db96c5e7d f6ed49f950e06576be74624c565058ff f6e062ff507458f9be50497656ed654c 5174c8669da98435a8b3e62ca974a5ea 0bdc905fc27b0948ad5245a4c1871c2f 5aa858395fd28d7d05e1a38868f3b9c5 bec26a12cfb55dff6bf80ac4450d56a6 beb50aa6cff856126b0d6aff45c25dc4 0f77ee31d2ccadc05430a83f4ef96ac3 45f5a66017b2d387300d4d33640a820a 4a824851c57e7e47643de50c2af3e8c9 d61352d1a6f3f3a04327d9fee50d9bdd d6f3d9dda6279bd1430d52a0e513f3fe bd86f0ea748fc4f4630f11c1e9331233 7ccff71cbeb4fe5413e6bbf0d261a7df c14907f6ca3b3aa070e9aa313b52b5ec 783bc54274e280e0511eacc7e200d5ce 78e2acce741ed5425100c5e0e23b80c7 af8690415d6e1dd387e5fbedd5c89013 f01afafee7a82979d7a5644ab3afe640 5f9c6abfbac634aa50409fa766677653 cfde0208f4b418ac5309db5c338538ed cfb4dbedf4093808538502ac33de185c 7427fae4d8a695269ce83d315be0392b 2541fe719bf500258813bbd55a721c0a 516604954353950314fb86e401922521 d133f22a1aed2a7bfa0f44697c4f3ffd d1ed44fd1a0f3f2afa4ff27b7c332a69 2c21a820306f154ab712c75eee0da04f 4e5a6699a9f24fe07e572baacdf8cdea 627bceb9999d5aaac945ecf423f56da5 aa218b56ee5ebeacdd6ecebf26e63c06 aa5ece06ee6e3c56dde68bac2621bebf 24fc79ccbf0979e9371ac23c6d68de36 8ea2b7ca516745bfeafc49904b496089 INVERSE CIPHER (DECRYPT): round[ 0].iinput 8ea2b7ca516745bfeafc49904b496089 round[ 0].ik_sch 24fc79ccbf0979e9371ac23c6d68de36 round[ 1].istart aa5ece06ee6e3c56dde68bac2621bebf round[ 1].is_row aa218b56ee5ebeacdd6ecebf26e63c06 round[ 1].is_box 627bceb9999d5aaac945ecf423f56da5 round[ 1].ik_sch 4e5a6699a9f24fe07e572baacdf8cdea round[ 1].ik_add 2c21a820306f154ab712c75eee0da04f round[ 2].istart d1ed44fd1a0f3f2afa4ff27b7c332a69 round[ 2].is_row d133f22a1aed2a7bfa0f44697c4f3ffd round[ 2].is_box 516604954353950314fb86e401922521 round[ 2].ik_sch 2541fe719bf500258813bbd55a721c0a round[ 2].ik_add 7427fae4d8a695269ce83d315be0392b round[ 3].istart cfb4dbedf4093808538502ac33de185c 217 HBS Kryptologie round[ 3].is_row round[ 3].is_box round[ 3].ik_sch round[ 3].ik_add round[ 4].istart round[ 4].is_row round[ 4].is_box round[ 4].ik_sch round[ 4].ik_add round[ 5].istart round[ 5].is_row round[ 5].is_box round[ 5].ik_sch round[ 5].ik_add round[ 6].istart round[ 6].is_row round[ 6].is_box round[ 6].ik_sch round[ 6].ik_add round[ 7].istart round[ 7].is_row round[ 7].is_box round[ 7].ik_sch round[ 7].ik_add round[ 8].istart round[ 8].is_row round[ 8].is_box round[ 8].ik_sch round[ 8].ik_add round[ 9].istart round[ 9].is_row round[ 9].is_box round[ 9].ik_sch round[ 9].ik_add round[10].istart round[10].is_row round[10].is_box round[10].ik_sch round[10].ik_add round[11].istart round[11].is_row round[11].is_box round[11].ik_sch round[11].ik_add round[12].istart round[12].is_row round[12].is_box round[12].ik_sch round[12].ik_add round[13].istart round[13].is_row cfde0208f4b418ac5309db5c338538ed 5f9c6abfbac634aa50409fa766677653 f01afafee7a82979d7a5644ab3afe640 af8690415d6e1dd387e5fbedd5c89013 78e2acce741ed5425100c5e0e23b80c7 783bc54274e280e0511eacc7e200d5ce c14907f6ca3b3aa070e9aa313b52b5ec 7ccff71cbeb4fe5413e6bbf0d261a7df bd86f0ea748fc4f4630f11c1e9331233 d6f3d9dda6279bd1430d52a0e513f3fe d61352d1a6f3f3a04327d9fee50d9bdd 4a824851c57e7e47643de50c2af3e8c9 45f5a66017b2d387300d4d33640a820a 0f77ee31d2ccadc05430a83f4ef96ac3 beb50aa6cff856126b0d6aff45c25dc4 bec26a12cfb55dff6bf80ac4450d56a6 5aa858395fd28d7d05e1a38868f3b9c5 0bdc905fc27b0948ad5245a4c1871c2f 5174c8669da98435a8b3e62ca974a5ea f6e062ff507458f9be50497656ed654c f6ed49f950e06576be74624c565058ff d653a4696ca0bc0f5acaab5db96c5e7d 3de23a75524775e727bf9eb45407cf39 ebb19e1c3ee7c9e87d7535e9ed6b9144 d22f0c291ffe031a789d83b2ecc5364c d2c5831a1f2f36b278fe0c4cec9d0329 7f074143cb4e243ec10c815d8375d54c c656827fc9a799176f294cec6cd5598b b951c33c02e9bd29ae25cdb1efa08cc7 2e6e7a2dafc6eef83a86ace7c25ba934 2e5bacf8af6ea9e73ac67a34c286ee2d c357aae11b45b7b0a2c7bd28a8dc99fa 6de1f1486fa54f9275f8eb5373b8518d aeb65ba974e0f822d73f567bdb64c877 9cf0a62049fd59a399518984f26be178 9c6b89a349f0e18499fda678f2515920 1c05f271a417e04ff921c5c104701554 ae87dff00ff11b68a68ed5fb03fc1567 b2822d81abe6fb275faf103a078c0033 88db34fb1f807678d3f833c2194a759e 884a33781fdb75c2d380349e19f876fb 975c66c1cb9f3fa8a93a28df8ee10f63 1651a8cd0244beda1a5da4c10640bade 810dce0cc9db8172b3678c1e88a1b5bd ad9c7e017e55ef25bc150fe01ccb6395 adcb0f257e9c63e0bc557e951c15ef01 1859fbc28a1c00a078ed8aadc42f6109 a573c29fa176c498a97fce93a572c09c bd2a395d2b6ac438d192443e615da195 84e1fd6b1a5c946fdf4938977cfbac23 84fb386f1ae1ac97df5cfd237c49946b 218 HBS Kryptologie round[13].is_box round[13].ik_sch round[13].ik_add round[14].istart round[14].is_row round[14].is_box round[14].ik_sch round[14].ioutput 4f63760643e0aa85efa7213201a4e705 101112131415161718191a1b1c1d1e1f 5f72641557f5bc92f7be3b291db9f91a 6353e08c0960e104cd70b751bacad0e7 63cab7040953d051cd60e0e7ba70e18c 00102030405060708090a0b0c0d0e0f0 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff 219 HBS Kryptologie Informative Seiten über AES und Quellen 1. www.codeplanet.eu, interessante und sehr ausführliche Seite über AES mit viel Hintergrundwissen sowie Codebeispielen. Bietet am meisten Informationen: http://www.codeplanet.eu/tutorials/cpp/3-cpp/51-advanced-encryptionstandard.html 2. www.nist.gov, offizielle Spezifikation von AES vom National Institute of Standards and Technology: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf 3. www.korelstar.de, sehr kurze Einführung in AES sowie kurze Erläuterung der Grundfunktionen. Gut für den ersten Überblick: http://www.korelstar.de/informatik/aes.html 4. www.codeplanet.eu, Flash-Applet über die Funktionsweise von AES, ursprünglich von der Deutschen Bank und der Universität Darmstadt und Siegen, sehr gelungen und verständlich, inzwischen in Version 4: http://www.codeplanet.eu/files/flash/Rijndael_Animation_v4_eng.swf 5. www.codeplanet.eu, Flash-Applet, das die einzelnen Zwischenergebnisse einer AES-Verschlüsselung zeigt, sehr hilfreich zum Testen des eigenen Codes: http://www.codeplanet.eu/files/flash/Rijndael-Inspector-v1.1.swf 6. www.datacomm.ch, Diplomarbeit über die Funktion MixColumn, informativ und anspruchsvoll, zum Glück mit Flash-Applet zum Testen: http://home.datacomm.ch/th.aes/Daten/Html/MixColumn.html 7. en.wikipedia.org, Die Englische Wikipedia enthält teilweise auch sehr informative Details über AES, vor allem über einzelne Funktionen (eigene Artikel): z.B. http://en.wikipedia.org/wiki/Rijndael_key_schedule 8. Wolfgang Ehrhardt, Vielen Dank für die Hilfe mit der Polynom-Multiplikation! 220