Spartan 3E-Starter (Xilinx)
Układy Cyfrowe - Projekt
RJ-45 logo AES-256 logo
Ostatnia aktualizacja: 13.06.2009 [01:28]
.::Projekt::.

Szyfrowanie AES

Ogólny opis algorytmu

Rodzaj szyfru:symetryczny szyfr blokowy
Data stworzenia:1997
Autorzy:Vincent Rijmen, Joan Daemen
Wielkość bloku wejściowego:128 bitów
Długość klucza:128, 192, 256 bitów
Ilość rund zależna od klucza:
* 10 dla 128-bitowego
* 12 dla 192-bitowego
* 14 dla 256-bitowego

AES (ang. Advanced Encryption Standard, nazywany również Rijndael) to symetryczny szyfr blokowy przyjęty przez NIST (National Institute of Standards and Technolog) w wyniku konkursu ogłoszonego w roku 1997.
Możliwe jest w nim użycie kluczy o długościach 128, 192 i 256 bitów i operuje on na blokach danych o długości 128 bitów (oryginalna specyfikacja Rijndael dopuszczała również bloki 192- i 256-bitowe).

AES wykonuje 10 (klucz 128 bitów), 12 (klucz 192 bity) lub 14 (klucz 256 bitów) rund szyfrujących substitution-permutation. Składają się one z substytucji wstępnej, permutacji macierzowej (mieszanie wierszy, mieszanie kolumn) i modyfikacji za pomocą klucza. Funkcja substytucyjna ma bardzo oryginalną konstrukcję, która uodparnia ten algorytm na znane ataki kryptoanalizy różnicowej i liniowej. Odmiany algorytmu Rijndael niebędące standardem AES, w zależności od długości klucza i bloku danych wykonują 12 lub 14 rund szyfrujących.
Opublikowana została praca, w której twierdzi się, że AES nie jest w pełni odporny na atak XSL, ale oszacowanie ilości koniecznych obliczeń obarczone jest dużą niepewnością, w związku z tym oceny, na ile skuteczny jest ten atak, są różne.
Twórcami szyfru są Vincent Rijmen i Joan Daemen.
AES jest szyfrem blokowy w którym blok wejściowy oraz klucz przechodzą kilkakrotnie rundy transformacji, zanim dadzą końcowy wynik. Po przejściu każdej rundy, powstaje szyfr pośredni, zwany stanem.

Oficjalna Specyfikacja AES (PDF)

AES-256

Dane (klucz + dane szyfrowane) reprezentowane są za pomocą macierzy. Elementem takiej macierzy jest 1bajt (8 bitów). Macierz taka ma 4 wiersze, 8 kolumn, zatem mieści w sobie całe 256 bitów.
Przebieg całego algorytmu można podzielić na fazy i rundy. Wyróżnione są 3 główne fazy, w których przebiega 14 rund.
Ns = 4 (oznacza 128 bitowy bloku danych)
Nk = 8 (oznacza 256 bitowy klucz)
Nr = 14 (liczba rund)

Szyfr AES składa się z trzech faz:
I. Transformacja klucza "AddRoundKey"
II. Nr-1 rund składających się z:
* Transformacja SubBytes
* Transformacja ShiftRows
* Transformacja MixColumns
* Transformacja AddRoundKey
III. Runda finałowa składająca się z:
* Transformacja SubBytes
* Transformacja ShiftRows
* Transformacja AddRoundKey
Schemat szyfrowania AES-256

Transformacja SubBytes

Transformacja SubBytes (podstawienie bajtów) jest oddzielnie wykonywana na każdym bajcie stanu. S-box (substitution box, czyli tabela podstawień ) kontroluje całą transformację. Operacyjnie, S-box to macierz 16*16. Bajt wynikowy odnajdywany jest pod adresem wiersza i kolumny uzyskanym za pomocą 4-bitowego adresu (młodsza i starsza połówka bajtu).

a b c d
e f g h
i j k l
m n o p
S-box
a' b' c' d'
e' f' g' h'
i' j' k' l'
m' n' o' p'

Transformacja ShiftRows

Transformacja ShiftRows przesuwa cyklicznie bajty w 3 dolnych wierszach macierzy Stanu.
Wiersz 2 jest przesuwany o 1 bajt w lewo, wiersz 3 przesuwany jest o 2 bajty w lewo, a wiersz 4 przesuwany jest o 3 bajty w lewo.

Macierz s
a b c d
e f g h
i j k l
m n o p
 
→ brak przesunięcia → 
→       w lewo o 1      → 
→       w lewo o 2      → 
→       w lewo o 3      → 
Macierz s'
a b c d
f g h e
k l i j
p m n o

Transformacja MixColumns

Operacja MixColumns miesza zawartość kolumn macierzy. Na każdej z 4 kolumn operacja mieszania wykonywana jest niezależnie.
Transformacja MixColumns działa na kolumnach macierzy stanu traktując je jako współczynniki określonego wielomianu:
wielomian
W rzeczywistości ta operacja sprowadza się do mnożenia macierzy:
macierz_ogolna
Gdzie c oznacza numer kolumny, Nb liczba kolumn w macierzy stanu.

Zatem rozpisując powyższą macierz otrzymujemy następujące równania:
rownania_ogolne
Gdzie to operacja XOR, a działanie • zostało opisane poniżej. W celu uzyskania dokładniejszych informacji na temat wykonywanych działań odsyłamy do dokumentu standardu szyfrowania AES.

W praktyce operacja sx,y•{02} sprowadza się do przesunięcia bitowego w lewo o jeden bit, operacja sx,y•{01} nie zmienia ciągu bitów, natomiast sx,y•{03} można znacznie uprościć korzystając z zależności:
sx,y•{03} = sx,y • ({02}{01})


schemat

Aby przybliżyć sposób wykonywania obliczeń przedstawiamy poniższy przykład operacji MixColumns:
przyklad
Wyliczmy wartość pierwszego bajtu w kolumnie wyjściowej.
Na początku zapisujemy ogólne równanie z podstawionymi współczynnikami:
s0’ = ({02}•d4) ({03}•bf ) ({01}•5d) ({01}•30)
następnie upraszczamy zapis eliminując współczynniki {01} oraz rozpisując współczynnik {03} zgodnie z podanym wcześniej wzorem. Uzyskujemy zatem kolejno:
s0’ = ({02}•d4) [ ({02} {01})•bf ] 5d 30
s0’ = ({02}•d4) ({02}•bf) bf 5d 30

d416 = 1101 01002
{02}• d416 = 1010 10002
{02}• bf16 = 0111 11102

Kolejno wykonujemy działania XOR:
przyklad_obliczenia
Otrzymany wynik to 0000 01002 = 0416 CUD.

Generacja klucza rundy i transformacja AddRoundKey

Klucz szyfrujący używany jest wewnątrz algorytmu do otrzymania odrębnego klucza w każdej rundzie procesu szyfrowania. Klucze takie są zwane kluczami rundy i mają długość taką jak długość bloku danych.
Operacja AddRoundKey polega na wykonaniu operacji XOR pomiędzy całym blokiem a kluczem rundy.

Nasza realizacja

Wybraliśmy wersję algorytmu z kluczem o długości 256 bitów (32 bajty).
Algorytm operuje na blokach danych o długości 128 bitów (16 bajtów). Nie zachodzi zatem potrzeba gromadzenia większej ilości danych na płytce, gdyż każdy blok 128 bitów (16 bajtów) może być przetwarzany niezależnie.
Ramka ma pojemność 1500 bajtów, zatem w jednej ramce ethernetowej jesteśmy w stanie zmieścić maksymalnie 93 pełne bloki danych. Opłaca się przesyłać jak największe ramki w celu najbardziej efektywnego wykorzystania połączenia.
Wymaga to przechowywania w jednej chwili w programie wszystkich 93 bloków na których będziemy dokonywać operacji szyfrowania.

.::Linki::.

Valid XHTML 1.1

Valid CSS!



PHP Logo
Wygenerowano w 0.0254 s.
Copyright © 2009
by Burzyński Kamil, Kończyński Marcin, Szaga Paweł