AES (ang. Advanced Encryption Standard)
- Długość bloku = 128 bitów
- Długość klucza = 128 lub 192 lub 256 bitów
AES jest nowoczesnym blokowym szyfrem symetrycznym, jednym z najbardziej popularnych szyfrów na świecie. Został opublikowany w 1997 roku przez Vincent'a Rijmen'a i Joan'a Daemen'a, a następnie przyjęty jako standard federalny w USA w roku 2002.
Zastosowanie
W ostatnich latach (2005-2010) opublikowanych zostało szereg prac naukowych, opisujących możliwe ataki na niektóre implementacje algorytmu AES, ale przedstawione instrukcje łamania dotyczyły zwykle szczególnych przypadków i nie stanowiły zagrożenia dla ogólnej oceny jakości szyfrowania AES, który wciąż uważany jest za bezpieczny i efektywny szyfr.
Algorytm
Do szyfrowania i deszyfrowania danych za pomocą AES wykorzystywany jest sekretny klucz o długości 128 lub 192 lub 256 bitów. W zależności od długości klucza wykonywana jest inna ilość rund szyfrujących.
Szyfrowanie w AES
W procesie szyfrowania dane wejściowe (tekst jawny) dzielone są na bloki 128-bitowe. Bloki przedstawiane są jako macierze 4 bajty × 4 bajty szeregowane kolumnami (ang. column-major), nazywane stanami (ang. state) lub macierzami stanu. Dla każdego bloku danych (czyli dla każdej macierzy stanu) wykonywane są następujące operacje:
- Przygotowanie podkluczy: generowany jest jeden podklucz początkowy, a następnie po kolejnym jednym podkluczu dla każdej rundy szyfrującej (patrz niżej).
- Runda inicjująca: każdy bajt w bloku danych jest dodawany do odpowiadającego mu bajtowi pierwszego podklucza za pomocą sumowania XOR.
- Następuje określona liczba rund szyfrujących. Ilość powtórzeń zależy od długości sekretnego klucza:
- 9 powtórzeń dla klucza 128-bitowego,
- 11 powtórzeń dla klucza 192-bitowego,
- 13 powtórzeń dla klucza 256-bitowego.
W każdej rundzie szyfrującej wykonywane są następujące operacje:- Każdy bajt danych jest zastępowany innym bajtem, na podstawie z góry zdefiniowanej tabeli (ang. lookup table), zwanej S-Box'em Rijndael'a (ang. Rijndael's S-Box). Jest to tak zwana operacja SB, z ang. Substitute Bytes. Konstrukcja tabeli ma gwarantować nieliniowość przekształcenia (a więc i całego szyfrowania).
- Przesunięcie bajtów w trzech ostatnich macierzach stanu w lewo. Bajty w pierwszym wierszu nie są przesuwane. Bajty w drugim wierszu macierzy są przesuwane o jedną pozycję w lewo, w trzecim wierszu o dwie pozycje, a w czwartym wierszu o trzy pozycje w lewo. Skrajnie lewe bajty z każdego wiersza przechodzą na skrajnie prawą pozycję w tym samym wierszu. Operacja ta nosi skrót SR, z ang. Shift Rows).
- Operacja MC, z ang. Mix Columns, czyli mnożenie kolumn: wszystkie kolumny macierzy stanu są mnożone przez stałą macierz o wielkości 4 bajty × 4 bajty.
- Operacja AR, z ang. Add Round Key: dodanie XOR wszystkich bajtów bloku danych do bajtów podklucza właściwego dla danej rundy. Podklucze, podobnie jak bloki danych, mają po 16 bajtów długości.
- Runda kończąca: wykonywane są te same operacje co w normalnych rundach szyfrujących, z wyjątkiem operacji mnożenia kolumn, która w Rundzie Kończącej jest pomijana.
Generowanie klucza w AES
Algorytm AES używa sekretnego symetrycznego klucza o długości 128, 192 albo 256 bitów (czyli odpowiednio 16, 24 lub 32 bajtów). W celu zaszyfrowania każdego bloku danych, klucz musi zostać wcześniej rozszerzony, czyli do oryginalnych otrzymanych bajtów muszą zostać dopisane kolejne:
- klucz 128-bitowy (16-bajtowy) jest rozszerzany do 176 bajtów.
- klucz 192-bitowy (24-bajtowy) jest rozszerzany do 208 bajtów.
- klucz 256-bitowy (32-bajtowy) jest rozszerzany do 240 bajtów.
Pierwsze bajty rozszerzonego klucza stanowią wszystkie bajty oryginalnego klucza sekretnego. W celu uzyskania kolejnych bajtów klucza rozszerzonego należy wykonać szereg operacji, numerując kolejne iteracje od 1. Poniższe kroki powtarza się, aż do uzyskania pożądanej liczby bajtów. Dla uproszczenia notacji, przyjęto, że oryginalna długość klucza sekretnego (przed rozszerzeniem) w bajtach wynosi n.
- Utworzenie 4 kolejnych bajtów klucza:
- Przepisanie 4 ostatnich bajtów aktualnego rozszerzonego klucza do tymczasowego wektora 4-bajtowego.
- Wykonanie rotacji bajtów w wektorze o jedną pozycję w lewo. Skrajnie lewy bajt należy przepisać na skrajnie prawą pozycję.
- Zastąpienie każdego bajtu w wektorze innym bajtem, bazując na S-Box'ach Rijndael'a (ang. Rijndael's S-Box).
- Operacja Rcon: zsumowanie XOR najbardziej lewego bajtu w wektorze z dwójką podniesioną do potęgi (numer aktualnej iteracji - 1).
- Zsumowanie XOR otrzymanego 4-bajtowego wektora z 4-bajtowym blokiem zaczynającym się n bajtów przed aktualnym końcem klucza, a następnie dopisanie wyniku na koniec rozszerzanego klucza. W ten sposób otrzymuje się nowe 4 bajty rozszerzanego klucza.
- Utworzenie 12 kolejnych bajtów klucza przez trzykrotne powtórzenie poniższych kroków:
- Przepisanie 4 ostatnich bajtów tworzonego klucza do tymczasowego wektora 4-bajtowego.
- Zsumowanie XOR powyższego wektora z 4-bajtowym blokiem zaczynającym się n bajtów przed aktualnym końcem rozszerzanego klucza i dodanie wyniku na koniec rozszerzonego klucza.
- Jeśli oryginalny sekretny klucz jest 256-bitowy, to należy wykonać poniższe kroki w celu utworzenia 4 kolejnych bajtów klucza:
- Przepisanie 4 ostatnich bajtów tworzonego klucza do tymczasowego wektora 4-bajtowego.
- Zastąpienie każdego bajtu w wektorze innym bajtem, bazując na S-Box'ach Rijndael'a (ang. Rijndael's S-Box)
- Zsumowanie XOR otrzymanego 4-bajtowego wektora z 4-bajtowym blokiem zaczynającym się n bajtów przed aktualnym końcem rozszerzanego klucza i dodanie wyniku na koniec rozszerzonego klucza.
- Jeśli oryginalny sekretny klucz jest 128-bitowy, to należy pominąć poniższe kroki. Jeśli oryginalny sekretny klucz jest 192-bitowy, to należy wykonać poniższe kroki 2 razy. Jeśli oryginalny sekretny klucz jest 256-bitowy, to należy wykonać poniższe kroki 3 razy:
- Przepisanie 4 ostatnich bajtów tworzonego klucza do tymczasowego wektora 4-bajtowego.
- Zsumowanie XOR powyższego wektora z 4-bajtowym blokiem zaczynającym się n bajtów przed aktualnym końcem rozszerzanego klucza i dodanie wyniku na koniec rozszerzonego klucza.
- Zwiększenie numeru aktualnej iteracji o 1.
Deszyfrowanie w AES
W czasie procesu deszyfrowania, zaszyfrowany tekst traktowany jest jako wejście do algorytmu. Należy wykonać analogiczne, odwrócone operacje, co w czasie szyfrowania:
- Odwrócone podstawianie bajtów (ISB).
- Przesuwanie bajtów w wierszach macierzy stanu w prawą stronę (ISR).
- Sumowanie XOR bajtów macierzy stanu z bajtami podklucza (IAR).
- Odwrócone mnożenie kolumn (IMC).
Podklucze używane w każdej iteracji podczas deszyfrowania danych, powinny być są brane w odwrotnej kolejności niż w czasie szyfrowania.
Szybkość działania AES
W celu przyspieszenia działania aplikacji, można zdecydować się na wcześniejsze przeliczenie wszystkich funkcji zawartych w różnych rundach algorytmu AES, a następnie zastąpienie tych obliczeń zwykłym podstawianiem danych z uzyskanych tabel.
Wadą tego rozwiązania jest znaczne zwiększenie rozmiaru aplikacji. Wielkość kodu aplikacji może wzrosnąć z kilku do kilkudziesięciu kilobajtów, w zależności od długości używanego sekretnego klucza.
Schemat Blokowy Szyfrowania w AES:
Schemat Blokowy Generowania Klucza w AES:
Matematyka:
We wszystkich operacjach szyfru AES przedstawionych poniżej, bajty przedstawione są w zapisie szesnastkowym. Każdy znak reprezentuje 4 bity.
Podstawienie w S-Box'ach Rijndael'a
W S-Box'ach Rijndael'a każdy bajt wejściowy jest zastępowany przez nowy bajt, wskazany przez tabelę. Podstawienia w S-Box'ach zostały tak dobrane, aby zapewnić jak największą nieliniowość przekształcenia, a wraz z tym nieliniowość całego szyfrowania AES.
Poniżej przedstawiona jest tabela, z której odczytuje się zmienione bajty danych. W wierszach należy odszukać wartość bardziej znaczącej połówki wejściowego bajtu, a w kolumnach wartość mniej znaczącej połówki wejściowego bajtu. Na przecięciu wybranego wiersza i kolumny można odczytać wartość nowego bajtu.
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | 63 | 7c | 77 | 7b | f2 | 6b | 6f | c5 | 30 | 01 | 67 | 2b | fe | d7 | ab | 76 |
1x | ca | 82 | c9 | 7d | fa | 59 | 47 | f0 | ad | d4 | a2 | af | 9c | a4 | 72 | c0 |
2x | b7 | fd | 93 | 26 | 36 | 3f | f7 | cc | 34 | a5 | e5 | f1 | 71 | d8 | 31 | 15 |
3x | 04 | c7 | 23 | c3 | 18 | 96 | 05 | 9a | 07 | 12 | 80 | e2 | eb | 27 | b2 | 75 |
4x | 09 | 83 | 2c | 1a | 1b | 6e | 5a | a0 | 52 | 3b | d6 | b3 | 29 | e3 | 2f | 84 |
5x | 53 | d1 | 00 | ed | 20 | fc | b1 | 5b | 6a | cb | be | 39 | 4a | 4c | 58 | cf |
6x | d0 | ef | aa | fb | 43 | 4d | 33 | 85 | 45 | f9 | 02 | 7f | 50 | 3c | 9f | a8 |
7x | 51 | a3 | 40 | 8f | 92 | 9d | 38 | f5 | bc | b6 | da | 21 | 10 | ff | f3 | d2 |
8x | cd | 0c | 13 | ec | 5f | 97 | 44 | 17 | c4 | a7 | 7e | 3d | 64 | 5d | 19 | 73 |
9x | 60 | 81 | 4f | dc | 22 | 2a | 90 | 88 | 46 | ee | b8 | 14 | de | 5e | 0b | db |
Ax | e0 | 32 | 3a | 0a | 49 | 06 | 24 | 5c | c2 | d3 | ac | 62 | 91 | 95 | e4 | 79 |
Bx | e7 | c8 | 37 | 6d | 8d | d5 | 4e | a9 | 6c | 56 | f4 | ea | 65 | 7a | ae | 08 |
Cx | ba | 78 | 25 | 2e | 1c | a6 | b4 | c6 | e8 | dd | 74 | 1f | 4b | bd | 8b | 8a |
Dx | 70 | 3e | b5 | 66 | 48 | 03 | f6 | 0e | 61 | 35 | 57 | b9 | 86 | c1 | 1d | 9e |
Ex | e1 | f8 | 98 | 11 | 69 | d9 | 8e | 94 | 9b | 1e | 87 | e9 | ce | 55 | 28 | df |
Fx | 8c | a1 | 89 | 0d | bf | e6 | 42 | 68 | 41 | 99 | 2d | 0f | b0 | 54 | bb | 16 |
Na przykład, w miejsce bajtu 3F zostanie zwrócony nowy bajt o wartości 75.
Podczas deszyfrowania wiadomości stosuje się odwrócone S-Box'y (ang. Inverse S-Box), które można otrzymać wprost z oryginalnych S-Box'ów.
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | 52 | 09 | 6a | d5 | 30 | 36 | a5 | 38 | bf | 40 | a3 | 9e | 81 | f3 | d7 | fb |
1x | 7c | e3 | 39 | 82 | 9b | 2f | ff | 87 | 34 | 8e | 43 | 44 | c4 | de | e9 | cb |
2x | 54 | 7b | 94 | 32 | a6 | c2 | 23 | 3d | ee | 4c | 95 | 0b | 42 | fa | c3 | 4e |
3x | 08 | 2e | a1 | 66 | 28 | d9 | 24 | b2 | 76 | 5b | a2 | 49 | 6d | 8b | d1 | 25 |
4x | 72 | f8 | f6 | 64 | 86 | 68 | 98 | 16 | d4 | a4 | 5c | cc | 5d | 65 | b6 | 92 |
5x | 6c | 70 | 48 | 50 | fd | ed | b9 | da | 5e | 15 | 46 | 57 | a7 | 8d | 9d | 84 |
6x | 90 | d8 | ab | 00 | 8c | bc | d3 | 0a | f7 | e4 | 58 | 05 | b8 | b3 | 45 | 06 |
7x | d0 | 2c | 1e | 8f | ca | 3f | 0f | 02 | c1 | af | bd | 03 | 01 | 13 | 8a | 6b |
8x | 3a | 91 | 11 | 41 | 4f | 67 | dc | ea | 97 | f2 | cf | ce | f0 | b4 | e6 | 73 |
9x | 96 | ac | 74 | 22 | e7 | ad | 35 | 85 | e2 | f9 | 37 | e8 | 1c | 75 | df | 6e |
Ax | 47 | f1 | 1a | 71 | 1d | 29 | c5 | 89 | 6f | b7 | 62 | 0e | aa | 18 | be | 1b |
Bx | fc | 56 | 3e | 4b | c6 | d2 | 79 | 20 | 9a | db | c0 | fe | 78 | cd | 5a | f4 |
Cx | 1f | dd | a8 | 33 | 88 | 07 | c7 | 31 | b1 | 12 | 10 | 59 | 27 | 80 | ec | 5f |
Dx | 60 | 51 | 7f | a9 | 19 | b5 | 4a | 0d | 2d | e5 | 7a | 9f | 93 | c9 | 9c | ef |
Ex | a0 | e0 | 3b | 4d | ae | 2a | f5 | b0 | c8 | eb | bb | 3c | 83 | 53 | 99 | 61 |
Fx | 17 | 2b | 04 | 7e | ba | 77 | d6 | 26 | e1 | 69 | 14 | 63 | 55 | 21 | 0c | 7d |
Mnożenie kolumn macierzy stanu
Każda kolumna macierzy stanu jest mnożona przez stałą macierz o wymiarach 4bajty x 4bajty. Wynikiem mnożenia każdej z czterech kolumn jest nowa kolumna, zawierająca 4 zmienione bajty danych.
Operacje mnożenia zaprezentowana jest poniżej. Przemnożenie kwadratowej macierzy przekształceń z kolumną c daje w wyniku kolumnę r z nowymi wartościami.
2 | 3 | 1 | 1 |
1 | 2 | 3 | 1 |
1 | 1 | 2 | 3 |
3 | 1 | 1 | 2 |
c0 |
c1 |
c2 |
c3 |
r0 |
r1 |
r2 |
r3 |
Deszyfrowanie
Podczas deszyfrowania, w tym kroku używana jest macierz odwrotna:
e | b | d | 9 |
9 | e | b | d |
d | 9 | e | b |
b | d | 9 | e |
Operacja Rcon
Podczas generowania bajtów sekretnego klucza, w każdej iteracji pierwszy bajt z aktualnego czterobajtowego wektora tymczasowego jest sumowany za pomocą operacji XOR z dwójką podniesioną do potęgi o jeden mniejszą niż aktualny numer iteracji. Operacja podnoszenia do potęgi jest działaniem modulo.
Wartości te mogą być obliczane na bieżąco podczas działania aplikacji lub być zakodowane w tabeli i zapisane w pamięci programu:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
xi | 01 | 02 | 04 | 08 | 10 | 20 | 40 | 80 | 1b | 36 | 6c | d8 | ab | 4d | 9a |