I N P U T 28 lu 92 lu 256 A E S RIJNDAEL K L U C Z 28 lu 92 lu 256 O U T P U T 28 lu 92 lu 256 Źródła. AES Proposal: Rijndael,Joan Daemen, Vincent Rijmen 2. ISO/IEC JTC /SC 27WD 833-3: Encryption algorithms Part 3:Block ciphers (X. Lai) 3. P. Mroczkowski, Rijndael jako nowy standard szyfrowania, IT Security Magazine Nr 6-7 (22-23) czerwiec-lipiec 2.
Przekształcenie strumieni wejściowych w talice stanu Dd N = 32 gdzie: Dd długość loku danych wejściowych w itach, N ilość kolumn talicy stanu. Dk Nk = 32 gdzie: Dk długość klucza w itach, Nk ilość kolumn talicy klucza. a, a, a,2 a,3... a,n- k, k, k,2 k,3... k,nk- a, a, a,2 a,3... a,n- k, k, k,2 k,3... k,nk- a 2, a 2, a 2,2 a 2,3... a 2,N- k 2, k 2, k 2,2 k 2,3... k 2,Nk- a 3, a 3, a 3,2 a 3,3... a 3,N- k 3, k 3, k 3,2 k 3,3... k 3,Nk- gdzie elementy talicy stanu i talicy klucza są ajtami.
Szyfrowanie KLUCZ TEKST JAWNY 2 PK AddRoundKey Runda zerowa 3 ByteSu Oliczanie podklucza PK..Nr- ShiftRow MixColoumn AddRoundKey (Nr-) x runda podstawowa PK Nr ByteSu ShiftRow AddRoundKey Runda końcowa 4 TEKST ZASZYFROWANY 5
AddRoundKey S talica stanu na wejściu S talica stanu na wyjściu w n n+n- podklucz dla rundy round gdzie n = round*n wówczas: S ij = S ij w n+j dla i =.. 3, j =.. N-
2 Jest to nieliniowe podstawienie typu S-ox wykonywane na każdym ajcie talicy stanu. Składa się ono z dwóch przekształceń:. Wyznaczenie multiplikatywnej odwrotności w ciele wielomianowym skończonym wyznaczonym przez wielomian nieredukowalny m(x) = x 8 + x 4 + x 3 + x + (czyli, w zapisie heksadecymalnym x). Zakłada się, że odwrotnością elementu jest element. 2. Zastosowanie przekształcenia afinicznego (nad GF(2)) określonego następująco: i = i (i+4)mod 8 (i+5)mod 8 (i+6)mod 8 (i+7) mod 8 c i Jest to równoważne zapisowi macierzowemu: = 7 6 5 4 3 2 7 6 5 4 3 2 Oa te przekształcenia można staelaryzować (taela 6*6) i zamiast wyznaczać wartości dla każdego ajtu przy pomocy powyższego algorytmu wyierać z wyznaczonej talicy (metoda lookup tale). ByteSu
3 ShiftRow W przekształceniu ShiftRow w trzech ostatnich wierszach talicy stanu elementy są cyklicznie przesuwane na pozycje o niższyc indeksach kolumn o różną liczę pozycji (ajtów). Wiersz pierwszy nie jest przesuwany, drugi jest przesuwany o S ajtów, wiersz trzeci o S2 a wiersz czwarty o S3 ajtów. Przesunięcia S, S2 i S3 zależą od długości loku N. Wartości te pokazuje poniższa talica. N S S2 S3 4 2 3 6 2 3 8 3 4 Przekształcenie ShiftRow można zapisać w postaci: s r,c = s r,(c+sr))mod N dla Sr jak w powyższej taeli, c < N, r =,2,3. Ma to efekt przesunięcia ajtów na niższą pozycję w wierszu (tzn. na niższe wartości c w danym wierszu), podczas gdy najniższe ajty przeskakują na szczyt wiersza (tzn. na najwyższe wartości c w danym wierszu).
4 MixColumn Przekształcenie MixColumn działa na talicy stanu kolumna po kolumnie, traktując każdą kolumnę jako czteroskładnikowy wielomian postaci s 3,c x 3 + s 2,c x 2 + s,c x + s,c. Kolumny te traktowane jako wielomiany nad GF(2 8 ) są mnożone modulo x 4 + przez stały wielomian a(x) postaci: a(x) = x3 x 3 + x x 2 +ox x + x2. W zapisie macierzowym: S (x) = a(x) s(x), lu s s s s, c, c 2, c 3, c 2 = 3 3 2 3 2 s s 3s 2s, c, c 2, c 3, c dla c < N. gdzie mnożenia są realizowane modulo x 4 +. Warto pamiętać, że zachodzi tu wygodna zależność, mianowicie x i mod(x 4 + ) = x i mod 4.
Oliczanie podkluczy Klucze Rundowe są wyprowadzane z Klucza Szyfrowania zgodnie ze Schematem Klucza. Schemat ten składa się z procesu Rozszerzenia Klucza i Wyoru Klucza Rundy. Podstawowa zasada jest następująca: Całkowita licza itów Kluczy Rundowych jest równa iloczynowi długości loku i liczy rund plus jeden. (np. dla długości loku 28 itów i rund potrzenych jest 48 itów kluczy rundowych). Klucz Szyfrowania jest rozszerzany do Rozszerzonego Klucza. Klucze Rundowe są poierane z Rozszerzonego Klucza w ten sposó, że pierwszy Klucz Rundowy składa się z pierwszych N słów, drugi z następnych N słów itd. Ilość wykonywanych rund Nr długość loku danych długość klucza Nk = 4 Nk = 6 Nk = 8 N = 4 2 4 N = 6 2 2 4 N = 8 4 4 4
Ilość podkluczy/ długość podklucza długość loku danych [it]/n dł. klucza [it]/nk 28/4 92/6 256/8 28/4 /28 3/92 5/256 92/6 3/28 3/92 5/256 256/8 5/28 5/92 5/256 Rozszerzony Klucz jest liniowym wektorem 4-ajtowych słów oznaczony W[N*(Nr+)]. Pierwsze Nk słów zawiera Klucz Szyfrowania. Wszystkie pozostałe słowa są zdefiniowane rekursywnie przy pomocy słów o mniejszych indeksach. Schemat ten zależy od wartości Nk; jedna wersja jest dla Nk 6, a druga dla Nk > 6. Dla Nk = 6, mamy: KeyExpansion(CipherKey,W) { for( i= ; i<nk ; i++ ) W[i] = CipherKey[i]; for( j=nk ; j<n*(nr+) ; j += Nk ) { W[j] = W[j-Nk] ^ SuByte(Rotl(W[j-])) ^ Rcon[j/Nk] ; for( i= ; i<nk && i+j < N*(Nr+); i++ ) W[i+j] = W[i+j-Nk] ^ W[i+j-] ; } }
Pierwsze Nk słów wypełnianych jest słowami klucza szyfrującego. Każde następne słowo W[i] jest równe poprzedniemu słowu W[i-] XORowane ze słowem Nk pozycji wcześniejszym W[i-Nk]. Dla pozycji ędących wielokrotnością Nk przekształcenie jest wykonywane na W[i-] Najpierw jest wykonywane cykliczne przesunięcie ajtów w słowie (oznaczone Rotl), następnie realizuje się SuByte, czyli zastosowanie lookup tale do wszystkich czterech ajtów słowa. Wynik jest XORowany ze słowem W[j-Nk] i ze stałą rundową (oznaczoną Rcon). Dla Nk > 6, mamy: KeyExpansion(CipherKey,W) { for( i = ; i < Nk ; i++ ) W[i] = CipherKey[i] ; for( j = Nk ; j < N*(Nr+) ; j += Nk ) { W[j] = W[j-Nk] ^ SuByte(Rotl(W[j-])) ^ Rcon[j/Nk] ; for(i = ; i < 4 ; i++ ) W[i+j] = W[i+j-Nk] ^ W[i+j-]; W[j+4] = W[j+4-Nk] ^ SuByte(W[j+3]); for(i = 5; i < Nk ; i++ ) W[i+j] = W[i+j-Nk] ^ W[i+j-]; } }
Różnica w porównaniu ze schematem dla Nk 6 polega na tym, że jeśli i-4 jest wielokrotnością Nk wówczas przed XORowaniem W[i-] jest poddawane przekształceniu SuByte. Wyór klucza rundy Klucz rundy i znajduje się w uforze kluczy rundowych od W[N*i] do W[N*(i+)-]. k k k 2 k 3 k 4 k 5 k 6 k 7 k 8 k 9 k k k 2 k 3 k 4... Klucz rundy Klucz rundy... Rysunek przedstawia rozszerzanie klucza i wyieranie Klucza Rundy dla N = 6 i Nk = 4. Uwaga: Schemat Klucza może yć stosowany ez używania explicite wektora W[N*(Nr+)]. W implementacjach, gdzie trzea oszczędzać RAM Klucze Rundowe mogą yć wyznaczane w locie korzystając z ufora Nk słów prawie nie zwiększając ociążenia oliczeniowego.
xtime xtime realizuje mnożenie wielomianu w(x) przez x modulo nieredukowalny wielomian m(x), gdzie m(x) = x 8 + x 4 + x 3 + x + lu w postaci heksadecymalnej m(x) = x. x*w(x) x2 * xw xw<<, czyli res = xw<<. Jeśli w 7 == to res jest wynikiem, a jeśli w 7 == to wynikiem jest res^x. Rotl Funkcja Rotl() ierze słowo czteroajtowe [a,a,a 2,a 3 ], wykonuje permutację cykliczną i zwraca słowo [a,a 2,a 3,a ].
SuByte Funkcja SuByte ierze czteroajtowe słowo i przekształca każdy ajt stosując podstawienie typu S-ox jak to przedstawiono w 2 - ByteSu. Rcon Stałe rundowe są niezależne od Nk i definiuje się je następująco: Rcon[i] = (RC[i],,, ) gdzie RC[i] = x i-, co rekurencyjnie RC[] = RC[i] = xtime(rcon[i-])
KLUCZ Odszyfrowywanie TEKST ZASZYFROWANY 6 PK Nr AddRoundKey InvShiftRow InvByteSu Odwrotna runda końcowa 7 Oliczanie podklucza PK Nr-.. AddRoundKey InvMixColoumn InvShiftRow (Nr-) x Odwrotna runda podstawowa 8 InvByteSu PK AddRoundKey Odwrotna runda zerowa TEKST JAWNY
6 InvShiftRow Przekształcenie InvShiftRow jest przekształceniem odwrotnym do ShiftRow. W przekształceniu InvShiftRow w trzech ostatnich wierszach talicy stanu elementy są cyklicznie przesuwane na pozycje o wyższych indeksach kolumn o różną liczę pozycji (ajtów). Wiersz pierwszy nie jest przesuwany, drugi jest przesuwany o S ajtów, wiersz trzeci o S2 a wiersz czwarty o S3 ajtów. Przesunięcia S, S2 i S3 zależą od długości loku N. W szczególności przekształcenie InvShiftRow można zapisać w postaci: s r,(c-sr)mod N = s r,c dla Sr jak w taeli, c < N, r =,2,3. Ma to efekt przesunięcia ajtów na wyższą pozycję w wierszu (tzn. na wyższe wartości c w danym wierszu), podczas gdy najwyższe ajty przeskakują na spód wiersza (tzn. na najniższe wartości c w danym wierszu).
7 InvByteSu InvByteSu jest odwrotnością przekształcenia ByteSu. Jest to nieliniowe podstawienie typu S-ox wykonywane na każdym ajcie talicy stanu. Składa się ono z dwóch przekształceń:. Zastosowanie przekształcenia afinicznego (nad GF(2)) określonego następująco: i = (i+2)mod 8 (i+5)mod 8 (i+7) mod 8 c i Jest to równoważne zapisowi macierzowemu: = 7 6 5 4 3 2 7 6 5 4 3 2 2. Wyznaczenie multiplikatywnej odwrotności w ciele wielomianowym skończonym wyznaczonym przez wielomian nieredukowalny m(x) = x 8 + x 4 + x 3 + x + (czyli, w zapisie heksadecymalnym x). Zakłada się, że odwrotnością elementu jest element. Oa te przekształcenia można staelaryzować (taela 6*6) i zamiast wyznaczać wartości dla każdego ajtu przy pomocy powyższego algorytmu wyierać z wyznaczonej talicy (metoda lookup tale).
8 InvMixColumn Przekształcenie MixColumn jest odwrotnością przekształcenia MixColumn.Działa ono na talicy stanu kolumna po kolumnie, traktując każdą kolumnę jako czteroskładnikowy wielomian postaci s 3,c x 3 + s 2,c x 2 + s,c x + s,c. Kolumny te traktowane jako wielomiany nad GF(2 8 ) są mnożone modulo x 4 + przez stały wielomian a(x) postaci: a - (x) = x x 3 + xd x 2 +ox9 x + xe. W zapisie macierzowym: s (x) = a - (x) s(x), lu s s s s, c, c 2, c 3, c e = 9 d e 9 d d e 9 9s d s s es, c, c 2, c 3, c dla c < N. gdzie mnożenia są realizowane modulo x 4 +. Warto pamiętać, że zachodzi tu wygodna zależność, mianowicie x i mod(x 4 + ) = x i mod 4.