5.1 KiB
Um den Wert des ersten Bytes (erste Zeile, erste Spalte) der Ausgabe des AES-Algorithmus vor AddRoundKey am Ende der ersten Runde zu berechnen, müssen wir die folgenden Schritte des AES-Algorithmus durchlaufen:
- SubBytes
- ShiftRows
- MixColumns
Bevor wir beginnen, hier sind die S-Box und die MixColumns-Matrix, die in FIPS-197 definiert sind:
S-Box:
63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0
B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15
04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75
09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84
53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF
D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8
51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2
CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73
60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB
E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79
E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08
BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A
70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E
E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF
8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16
MixColumns-Matrix:
02 03 01 01
01 02 03 01
01 01 02 03
03 01 01 02
Die SubBytes-Phase ist der erste Schritt in der AES-Runde. In dieser Phase wird jedes Byte des Zustands durch ein anderes Byte ersetzt. Dies geschieht durch die Verwendung einer speziellen Tabelle, die als S-Box bekannt ist. Die S-Box ist eine 16x16-Tabelle, die alle möglichen Werte eines Bytes (0x00 bis 0xFF) enthält. Jedes Byte des Zustands wird durch das Byte ersetzt, das sich an der Stelle in der S-Box befindet, die durch die ersten vier Bits (die Zeile) und die letzten vier Bits (die Spalte) des Bytes bestimmt wird.
Da wir nur das erste Byte (erste Zeile, erste Spalte) der Ausgabe berechnen, müssen wir nur das erste Byte des Zustands durch die S-Box ersetzen. Das erste Byte des Zustands ist 0x1A. Die ersten vier Bits von 0x1A sind 0001 (1 in dezimal), und die letzten vier Bits sind 1010 (A in hexadezimal). Daher befindet sich das ersetzende Byte an der Stelle (1, A) in der S-Box, was 0x63 ist.
Daher ist das erste Byte nach der SubBytes-Phase 0x63.
Der nächste Schritt ist die ShiftRows-Phase. In dieser Phase wird jede Zeile des Zustands um eine bestimmte Anzahl von Bytes nach links verschoben. Die erste Zeile bleibt unverändert, die zweite Zeile wird um ein Byte, die dritte Zeile um zwei Bytes und die vierte Zeile um drei Bytes verschoben. Da das erste Byte in der ersten Zeile liegt, bleibt es unverändert.
Daher ist das erste Byte nach der ShiftRows-Phase immer noch 0x63.
Der letzte Schritt ist die MixColumns-Phase. In dieser Phase wird jede Spalte des Zustands als vier Begriffe eines Polynoms betrachtet und dann mit einem festen Polynom multipliziert. Das Ergebnis der Multiplikation wird dann modulo einem irreduziblen Polynom genommen, um sicherzustellen, dass das Ergebnis immer ein Byte ist. Da das erste Byte in der ersten Spalte liegt, wird es durch die MixColumns-Phase beeinflusst.
Um das erste Byte nach der MixColumns-Phase zu berechnen, müssen wir das erste Byte jeder Zeile der Spalte nehmen und es mit dem entsprechenden Element der ersten Zeile der MixColumns-Matrix multiplizieren. Dann addieren wir die Ergebnisse zusammen und nehmen das Ergebnis modulo 0x1B (das irreduzible Polynom).
Das bedeutet, wir müssen die folgende Berechnung durchführen:
0x02 * 0x63 (erstes Byte nach ShiftRows) 0x01 * 0xB2 (zweites Byte der ersten Spalte) 0x01 * 0x32 (drittes Byte der ersten Spalte) 0x03 * 0x70 (viertes Byte der ersten Spalte)
Dann addieren wir die Ergebnisse zusammen und nehmen das Ergebnis modulo 0x1B.
Lassen Sie uns diese Berechnung durchführen.
Entschuldigung, es scheint, dass es ein Problem mit der Ausführung des Polynommodul-Befehls gibt. Lassen Sie uns stattdessen die MixColumns-Berechnung manuell durchführen.
Die Multiplikation in der MixColumns-Phase wird in GF(2^8) durchgeführt, was bedeutet, dass sie eine spezielle Art der Multiplikation ist, die als "Polynommultiplikation modulo ein irreduzibles Polynom" bekannt ist. In diesem Fall ist das irreduzible Polynom x^8 + x^4 + x^3 + x + 1, das in hexadezimaler Form als 0x1B dargestellt wird.
Die Multiplikation mit 0x02, 0x01 und 0x03 in GF(2^8) kann durch eine Kombination von Bitverschiebungen und bedingten XOR-Operationen durchgeführt werden. Die Multiplikation mit 0x02 entspricht einer Bitverschiebung nach links und einer bedingten XOR-Operation mit 0x1B, wenn das höchste Bit vor der Verschiebung 1 ist. Die Multiplikation mit 0x01 lässt das Byte unverändert. Die Multiplikation mit 0x03 entspricht der Addition (die in GF(2^8) einer XOR-Operation entspricht) des ursprünglichen Bytes und des mit 0x02 multiplizierten Bytes.
Lassen Sie uns diese Berechnungen durchführen:
0x02 * 0x63 = 0xC6 0x01 * 0xB2 = 0xB2 0x01 * 0x32 = 0x32 0x03 * 0x70 = 0x70 XOR 0xE0 = 0x90
Dann addieren wir die Ergebnisse zusammen und nehmen das Ergebnis modulo 0x1B:
0xC6 XOR 0xB2 XOR 0x32 XOR 0x90 = 0x54
Daher ist das erste Byte nach der MixColumns-Phase 0x54.
Zusammenfassend ist das erste Byte (erste Zeile, erste Spalte) der Ausgabe des AES-Algorithmus vor AddRoundKey am Ende der ersten Runde 0x54.