Kryptografia II stopień
Od definicji bezpieczeństwa do konstrukcji, redukcji i publikacji naukowych.
W4. Szyfry blokowe i AEAD
Szyfr blokowy dla ustalonego klucza jest permutacją bloków. AES ma blok 128-bitowy. Klucze 128-, 192- i 256-bitowe nie zmieniają długości bloku. Dłuższa wiadomość wymaga trybu pracy.
Skrót AEAD oznacza uwierzytelnione szyfrowanie z danymi dodatkowymi. Oprócz ukrycia treści pozwala wykryć nieuprawnioną zmianę. Do szyfrogramu dołączamy znacznik sprawdzany za pomocą klucza. AAD to dane dodatkowe, które są jawne, ale również objęte tym sprawdzeniem. Ogólny znacznik uwierzytelnienia MAC i jego osobny dowód omówimy w W5.
- AAD
- Additional Authenticated Data. Dodatkowe dane uwierzytelniane, ale nieszyfrowane.
Interfejs szyfru blokowego i interfejs AEAD
Szyfr blokowy jest rodziną permutacji. Dla AES wywołanie przyjmuje klucz oraz dokładnie 128-bitowy blok . Zwraca 128-bitowy blok . Odwrotna procedura odtwarza wejście przy tym samym kluczu. Rundy, podstawienia i macierze są wnętrzem tych procedur. Sam AES nie określa jeszcze ochrony długiej wiadomości ani jej integralności.
Schemat AEAD dodaje sposób użycia szyfru i reguły uwierzytelnienia. Po ustaleniu parametrów i wylosowaniu jego wywołania mają postać
Tutaj oznacza jawny nonce, wiadomość, a jawne dane dodatkowe. zawiera zaszyfrowaną treść i znacznik. Wynik jest wiadomością albo . Właściwy profil określa długości i ograniczenia. Dla AES-GCM w tym kursie wymagamy niepowtarzania nonce przy jednym kluczu. Obie strony otrzymują to samo , które mogą być jawnie przesłane razem z . Poprawność to . Poufność i wykrywanie nieuprawnionych zmian są osobnymi gwarancjami przy spełnionych warunkach użycia.
- AES-GCM
- Advanced Encryption Standard in Galois/Counter Mode. Szyfr AES w trybie Galois/licznikowym. AESGCM jest nazwą klasy w bibliotece, a 256 oznacza długość klucza.
AES-GCM: wywołania aplikacji: algorytmy i przepływ
To interfejs AES-GCM na granicy aplikacji. Parametry pp ustalają długości klucza, tagu i nonce. Wewnętrzna konstrukcja łączy tryb licznikowy AES z uwierzytelnianiem GHASH, zdefiniowanym w NIST SP 800-38D. Poniżej pokazujemy wywołanie tej konstrukcji, nie jej wewnętrzne rundy.
- NIST
- National Institute of Standards and Technology. Amerykański Narodowy Instytut Standaryzacji i Technologii.
- SP
- Special Publication. Seria publikacji specjalnych NIST.
Wybierz dozwolony profil i limity danych.
Użyj nowego nonce n dla danego k. Wewnętrzne działania definiuje NIST SP 800-38D.
Zanim wydasz m aplikacji, sprawdź tag. Niezgodność daje ⊥.
AES-GCM: wywołania aplikacji
Nadawca:
Odbiorca:
- Nadawca, Enc: nonce i dane: n nie może się powtórzyć dla k.
- Nadawca → Odbiorca: Nonce i AAD mogą być jawne
- Odbiorca, Dec: sprawdź tag: Odrzuć niezgodność bez wydawania m.
Odwracalność nie znaczy łatwego ataku
Dla każdego klucza algorytm musi być odwracalny, inaczej nie odzyskalibyśmy wiadomości. Przeciwnik również zna opis operacji odwrotnych. Brakuje mu klucza wybierającego właściwą permutację. Bezpieczeństwo nie polega na utracie danych w czasie szyfrowania, lecz na trudności wykorzystania publicznego opisu bez odpowiedniego sekretu.
Sieć podstawieniowo-permutacyjna przeplata nieliniową zamianę małych fragmentów, mieszanie pozycji i dodawanie materiału kluczowego. Gdyby wszystkie operacje były liniowe nad bitami, ich złożenie nadal byłoby liniowe. Odpowiednio dobrane wejścia pozwoliłyby odtworzyć taką zależność. Gdyby była tylko niezależna zamiana każdego bajtu, analiza rozdzielałaby się na małe zadania. Potrzebujemy zarówno nieliniowości, jak i rozpraszania zależności.
Dlaczego dodatkowy bit klucza ma znaczenie
Bit ma dwie możliwości, a bajt ma osiem bitów. Jeżeli każdy bit klucza jest niezależny i jednostajny, klucz długości bitów wybieramy spośród równie prawdopodobnych ciągów. Dla czterech bitów jest ich 16, od 0000 do 1111. Algorytm szyfrowania jest publiczny. Sekretem jest to, który z tych kluczy został wybrany.
Do każdego starego ciągu możemy dołączyć 0 albo 1. Dostajemy dwie rozłączne kopie poprzedniej przestrzeni. Dla dodatkowych niezależnych bitów:
- Jeden bit: dwa razy więcej kluczy.
- Jeden bajt, czyli osiem bitów: razy więcej kluczy, nie osiem razy.
- Dwa bajty: razy więcej kluczy.
- 64 bity: razy więcej kluczy.
To wzrost wykładniczy. Każdy kolejny niezależny bit mnoży poprzedni wynik przez dwa. Nie chodzi o to, że jedna operacja szyfrowania staje się dwa razy trudniejsza.
Co dokładnie liczymy przeciwnikowi
W przeszukiwaniu wyczerpującym przeciwnik sprawdza różne klucze, aż rozpozna właściwy. Zakładamy jeden atakowany klucz i dostatecznie dużo danych do jego sprawdzenia, np. kilka znanych par tekst–szyfrogram. Jedna para bloków nie zawsze jednoznacznie określa klucz, zwłaszcza gdy klucz jest dłuższy od bloku. Pełny test kandydata może więc wymagać kilku szyfrowań.
Nie zakładamy żadnej metody omijającej przeszukiwanie. Niech oznacza liczbę prób do znalezienia klucza, włącznie z udanym testem. Przy jednostajnym kluczu jego pozycja w ustalonej kolejności testów jest jednostajna. Najgorszy przypadek wymaga prób. Symbol oznacza wartość oczekiwaną, czyli średnią liczbę prób w wielu niezależnych doświadczeniach. Każda pozycja od 1 do ma tutaj to samo prawdopodobieństwo, więc:
Niech oznacza budżet różnych sprawdzonych kluczy. W tym modelu szansa znalezienia właściwego klucza to:
Przy tym samym dodatkowy bit zmniejsza tę szansę dwukrotnie, a dodatkowy bajt 256-krotnie. Gdy napastnik dysponuje dwukrotnie większą łączną szybkością sprawdzania, jeden dodatkowy losowy bit kompensuje ten wzrost w modelu przeszukiwania. Nie kompensuje automatycznie nowego ataku algebraicznego albo wycieku klucza.
Do każdego z 16 czterobitowych ciągów dodajemy nowy prefiks. Jeden bit prefiksu daje dwie możliwości: 0 i 1. Osiem bitów daje 256 możliwości.
4 bity · 16 kluczy
Szansa trafienia:
5 bitów · 32 klucze
Szansa trafienia:
2 grupy po 16 kluczy. Każda ma inny jednobitowy prefiks.
Budżet: 8 różnych prób w każdym wariancie.
Po lewej jedno pole to jeden klucz. Po prawej małe pola oznaczają klucze ze wspólnym prefiksem. Przy większej liczbie grup ostatnie pole zbiera pozostałe klucze. Wypełnienie oznacza sprawdzoną część. Rozmiary pól są schematyczne, liczby są dokładne. To model zliczania, nie atak wykonywany na AES.
Model klasyczny, jeden jednostajny klucz. Szybkość oznacza wszystkie pełne testy kandydatów na sekundę, również przy pracy równoległej. Domyślne jest założeniem rachunku, nie wynikiem benchmarku.
Pierwsze dwa porównania są ogólnym modelem długości klucza. Nie oznaczają istnienia wariantów AES-129 lub AES-136.
| Przestrzeń | Bity | Liczba kluczy, dokładnie | Średni czas, s ≈ |
|---|---|---|---|
| Początkowo | 128 | 340 282 366 920 938 463 463 374 607 431 768 211 456 | |
| Po wydłużeniu | 136 | 87 112 285 931 760 246 646 623 899 502 532 662 132 736 |
Mnożnik liczby kluczy: .
Średni czas jest ilorazem średniej liczby prób i szybkości sprawdzania.
Czas średni: , gdzie jest szybkością testów. Przy porównaniu utrzymujemy to samo . Czas do sprawdzenia całej przestrzeni: . Liczba kluczy jest obliczana dokładnie, czasy są zaokrąglone. Średnia nie jest terminem, przed którym sukces jest niemożliwy.
Długość klucza, siła ochrony i koszt szyfrowania
AES ma trzy zdefiniowane warianty: AES-128, AES-192 i AES-256. Przykład przejścia ze 128 do 129 bitów objaśnia wyłącznie liczenie przestrzeni. Standard nie definiuje AES-129 ani AES-136. We wszystkich trzech wariantach AES blok nadal ma 128 bitów. FIPS 197, parametry AES.
- FIPS
- Federal Information Processing Standards. Amerykańskie federalne standardy przetwarzania informacji.
| Wariant | Klucz w bitach | Blok w bitach | Liczba rund | Liczba kluczy | Względem AES-128 |
|---|---|---|---|---|---|
| AES-128 | 128 | 128 | 10 | ||
| AES-192 | 192 | 128 | 12 | ||
| AES-256 | 256 | 128 | 14 |
Podwojenie długości ze 128 do 256 bitów nie oznacza tylko dwukrotnie większego przeszukiwania. Mnożymy liczbę kandydatów przez . Koszt uczciwego szyfrowania jednego bloku wzrasta znacznie łagodniej, m.in. przez większą liczbę rund. Rzeczywisty czas zależy też od sprzętu, implementacji i harmonogramu klucza. Nie utożsamiamy stosunku liczby rund ze zmierzonym stosunkiem czasów.
Długość nie jest samodzielnym dowodem bezpieczeństwa. Rachunek liczy kandydatów. Nie dowodzi, że każda metoda ataku musi ich sprawdzać po kolei. Siłę ochrony oceniamy względem najlepszych znanych ataków w określonym modelu. Znaczenie ma także tryb pracy, ilość danych zaszyfrowanych jednym kluczem, długość znacznika, unikalność nonce i odporność implementacji na wycieki. Większy klucz nie naprawia powtórzonego nonce w CTR lub GCM. NIST SP 800-57, §5.6: siła ochrony i rozmiary kluczy.
- CTR
- Counter mode. Tryb licznikowy.
- GCM
- Galois/Counter Mode. Tryb Galois/licznikowy, łączący szyfrowanie ze sprawdzaniem integralności.
Nowe bity muszą rzeczywiście zwiększać niepewność przeciwnika. Dopisanie ośmiu znanych zer nie daje 256-krotnie większej przestrzeni do przeszukania. Tak samo zapisanie słabego hasła w polu 256-bitowym nie tworzy losowego klucza 256-bitowego. Liczy się sposób generowania i wiedza napastnika, a nie sam rozmiar bufora.
Nie przenosimy tego przelicznika na RSA. AES jest szyfrem symetrycznym. RSA jest konstrukcją asymetryczną, a długość jego klucza zwykle oznacza długość publicznego modułu. Atak może wykorzystywać strukturę algebraiczną, w szczególności faktoryzację modułu. Dodatkowy bit modułu RSA nie oznacza podwojenia kosztu najlepszego ataku. Rozmiary kluczy różnych rodzin porównujemy przez oszacowaną siłę ochrony, nie bit do bitu. RSA omówimy w W10b.
Rachunek powyżej dotyczy klasycznego przeszukiwania. Kwantowy algorytm Grovera zmienia asymptotyczną liczbę zapytań do testu klucza. To nie jest wykonanie całego przeszukiwania w jednej operacji. Ten odrębny model wraca w części postkwantowej.
Pytanie kontrolne: sprzęt sprawdza klucze 256 razy szybciej. O ile niezależnych losowych bitów trzeba wydłużyć klucz, żeby zachować tę samą szansę sukcesu przy tym samym czasie przeszukiwania i niezmienionym koszcie pojedynczego testu?
AES od wejścia do wyjścia: blok, klucz i publiczna instrukcja
Zacznijmy od całości. W AES-128 podajemy jeden blok wiadomości o długości 16 bajtów oraz klucz o długości 16 bajtów. Otrzymujemy blok szyfrogramu o długości 16 bajtów. Liczba 128 w nazwie oznacza długość klucza w bitach. Sam AES jest deterministyczny. Ten sam blok i ten sam klucz zawsze dają ten sam wynik. Obsługą długiej wiadomości, licznika lub wektora inicjującego zajmuje się tryb pracy, a nie pojedyncza runda AES.
Wewnątrz algorytmu biegną dwie połączone ścieżki:
- Ścieżka danych. Bajty wiadomości wpisujemy do tablicy nazywanej stanem. Kolejna operacja pobiera stan pozostawiony przez poprzednią operację i go przekształca. Nie zaczynamy każdej rundy od pierwotnej wiadomości.
- Ścieżka klucza. Z klucza głównego procedura rozwijania klucza wylicza . Każdy ma 16 bajtów. służy do początkowego AddRoundKey. służy do AddRoundKey w rundzie . Rozwinięcie zależy od klucza, ale nie od wiadomości.
Obie ścieżki łączy AddRoundKey. Pozostałe składniki to publiczna instrukcja AES, taka sama dla wszystkich użytkowników: tablica podstawień S-box, przesunięcia wierszy, macierz MixColumns, reguły rachunku na bajtach i stałe rozwijania klucza. Nie są dodatkowymi sekretami. Nie losujemy ich przy szyfrowaniu i nie pobieramy z wiadomości. Zmieniają się dane, do których stosujemy te reguły.
Porządek AES-128: najpierw AddRoundKey z . Następnie dziewięć rund SubBytes → ShiftRows → MixColumns → AddRoundKey. W rundzie dziesiątej wykonujemy SubBytes → ShiftRows → AddRoundKey z . Pominięcie MixColumns w ostatniej rundzie jest częścią definicji szyfru. Poniżej rozłożymy tę instrukcję na części, a w demonstratorze zachowamy obok szczegółów mapę całego przepływu.
Stan AES to szesnaście bajtów
Jeden bajt ma osiem bitów. W zapisie szesnastkowym zajmuje dwa znaki, np. . Blok 16 bajtów zapisujemy jako macierz czterech wierszy i czterech kolumn. AES wypełnia ją kolumnami:
To ważna konwencja implementacyjna. Przepisanie ciągu wierszami zmienia działanie operacji, nawet jeśli rysunek wygląda podobnie. Zapis hex jest tylko reprezentacją bajtów. Dodawanie bajtów w algorytmie nie jest zwykłym dodawaniem widocznych liczb.
Na przykład początek bloku demonstratora, 6b c1 be e2, tworzy pierwszą kolumnę, od góry do dołu. Kolejne 2e 40 9f 96 tworzą drugą kolumnę. Pierwszą kolumną klucza jest 2b 7e 15 16. Początkowy AddRoundKey daje więc w pierwszej kolumnie 40 bf ab f4, ponieważ m.in. . To właśnie wynik tego XOR-u, a nie pierwotny blok, wchodzi do SubBytes pierwszej rundy.
W AES używamy ciała . Bajt reprezentuje wielomian stopnia najwyżej 7 o współczynnikach 0 lub 1. Dodawanie to XOR. Mnożenie wielomianów redukujemy modulo . Przykładowo pomnożenie przez daje , nie liczbę całkowitą 256. Nie trzeba od razu pamiętać tablic. Trzeba wiedzieć, w jakim zbiorze wykonuje się rachunek.
Cztery kroki rundy
Jak czytać ten rachunek. Ciało jest zbiorem, w którym można dodawać, odejmować, mnożyć i dzielić przez element różny od zera. W ciele bajtowym te działania nie są zwykłym rachunkiem modulo 256. Macierz jest prostokątną tablicą. Iloczyn macierzy przez kolumnę obliczamy, mnożąc elementy każdego wiersza przez odpowiednie elementy kolumny i sumując wyniki w tym samym ciele. Przykładowo pierwszy wiersz MixColumns daje . Odwracalna macierz pozwala jednoznacznie odzyskać kolumnę wejściową.
- SubBytes. Każdy bajt przechodzi przez tę samą nieliniową, odwracalną tablicę S-box. Konstrukcja używa odwrócenia w ciele, z osobną konwencją dla zera, i transformacji afinicznej bitów. Jeden bajt na wejściu nadal daje jeden bajt na wyjściu. To nie jest haszowanie.
- ShiftRows. Wiersze przesuwamy cyklicznie o 0, 1, 2 i 3 pozycje w lewo. Wartości bajtów się nie zmieniają, ale trafiają do innych kolumn.
- MixColumns. Każdą kolumnę mnożymy przez ustaloną odwracalną macierz nad . Jeden bajt wpływa na kilka wyjść. Jest to operacja liniowa, nie sekretna tablica.
- AddRoundKey. Stan łączymy przez XOR z 16 bajtami klucza rundy. Ten krok zależy od sekretu. XOR z tym samym kluczem jest własną odwrotnością.
Macierz MixColumns, zapisana bajtami hex, ma postać:
Każdy iloczyn i suma w tej macierzy należą do ciała bajtowego. Np. . Można to prześledzić na pojedynczej kolumnie, a następnie sprawdzić całą rundę.
Skąd bierze się S-box
S-box to stała tablica 256 wyników, nie część klucza. Jest skrótem obliczenia, które można wykonać dla każdego bajtu z osobna. Dla bajtu znajdujemy odwrotność w ciele bajtowym, czyli . Dla wejścia przyjmujemy . Jest to osobna reguła, a nie dzielenie przez zero.
Następnie mieszamy bity przez ustaloną transformację afiniczną. Niech oznacza cykliczny obrót ośmiu bitów jednego bajtu o pozycji w lewo. Bit wypadający z lewej wraca na prawy koniec. Definicję tablicy można wtedy zapisać tak:
Stała , obroty i wielomian definiujący ciało są ustalone w AES. Przykładowo odwrotnością jest . Po mieszaniu bitów otrzymujemy . Dla zera wynik wynosi . W demonstratorze tablica powstaje z tego rachunku, a SubBytes odczytuje z niej wynik dla każdego z 16 bieżących bajtów stanu. Ten odczyt nie zmienia pozycji bajtu.
Odwrócenie w ciele wprowadza nieliniowość. Sam XOR i przestawianie bitów byłyby przekształceniami afinicznymi, które można składać i analizować jako układ równań liniowych. S-box jest odwracalny, żeby odbiorca mógł cofnąć podstawienie. Nie jest funkcją skrótu.
Skąd biorą się przesunięcia i współczynniki MixColumns
ShiftRows nie wylicza przesunięcia z klucza. Numery wierszy liczymy od 0. Numer wiersza określa liczbę pozycji obrotu w lewo: 0, 1, 2 lub 3. Są to ustalone przesunięcia bajtów między kolumnami. Nie należy ich mylić z obrotami bitów wewnątrz bajtu w definicji S-box ani z obrotem słowa klucza opisanym niżej.
Macierz MixColumns jest wybranym przez projektantów, publicznym składnikiem AES. Jej współczynniki 01, 02, 03 nie są fragmentami klucza ani wynikiem wcześniejszej rundy. Ta sama macierz działa na każdą z czterech kolumn i w każdej rundzie, w której występuje MixColumns. Zmienia się natomiast kolumna wejściowa, bo pochodzi ze stanu po bieżącym ShiftRows. Kolumnę mnożymy przez macierz. Nie dzielimy jej przez macierz.
Skąd bierze się użyteczność tego wyboru? Mieszanie jest odwracalne, a każdy bajt wyniku zależy od wszystkich czterech bajtów kolumny. W połączeniu z przesunięciami wierszy kolejna runda przenosi te zależności między kolumnami. Małe współczynniki pozwalają przy tym sprawnie wykonać rachunek. Nie oznacza to, że dowolna odwracalna macierz zapewniłaby bezpieczeństwo AES.
Mnożenie przez 01 zostawia bajt bez zmian. Przez 02 mnożymy następująco: przesuwamy bity o jedną pozycję w lewo i pozostawiamy osiem bitów. Jeśli przed przesunięciem najwyższy bit był równy 1, wykonujemy jeszcze XOR z 1b. Ta poprawka wynika z redukcji przez . Wartość zapisuje jego cztery niższe składniki. Przez 03 mnożymy, dodając XOR-em pierwotny bajt do wyniku mnożenia przez 02.
Prześledźmy pierwszą kolumnę pierwszej rundy dla domyślnych danych. Po ShiftRows wynosi ona 09 28 7f 47. Pierwszy wiersz stałej macierzy daje:
Wszystkie wartości w tym rachunku są bajtami hex. Pozostałe trzy wiersze macierzy dają 9f, 16, c2. Cała kolumna wyjściowa to zatem 52 9f 16 c2. Jest to nowa wartość stanu, którą dopiero potem połączymy XOR-em z odpowiednią kolumną klucza .
Klucz rundy nie jest nowym niezależnym kluczem
Harmonogram klucza (key schedule) deterministycznie rozwija klucz główny. W AES-128 dzielimy jego 16 bajtów na cztery kolejne słowa czterobajtowe . Są to cztery kolumny . Wyliczamy jeszcze 40 słów, aż do . Każde cztery kolejne słowa tworzą klucz jednej rundy:
Symbol oznacza tu zapisanie ciągów bajtów jeden za drugim. Do obliczenia nowego słowa potrzebujemy poprzedniego słowa i słowa sprzed czterech pozycji. Przy rozpoczynaniu nowego klucza rundy najpierw przekształcamy poprzednie słowo:
- RotWord obraca cztery bajty o jedną pozycję w lewo. Nie obraca bitów w bajcie.
- SubWord zastępuje każdy z tych czterech bajtów przez wartość z tej samej publicznej tablicy S-box, której używa SubBytes.
- Dodajemy XOR-em Rcon, czyli round constant, stałą rundy. To słowo postaci . Pierwszy bajt zaczyna się od
01, a następne otrzymujemy przez mnożenie przez02w ciele bajtowym. Dla rund 1–10 są to01 02 04 08 10 20 40 80 1b 36. Są publiczne i nie zależą od klucza. Wprowadzają zależność od numeru rundy.
Precyzyjnie, dla :
Przykład z klucza demonstratora. Pierwsze słowo to 2b 7e 15 16, a czwarte to 09 cf 4f 3c. Aby wyliczyć , obracamy czwarte słowo do cf 4f 3c 09. SubWord daje 8a 84 eb 01. XOR ze stałą 01 00 00 00 daje 8b 84 eb 01. Na końcu łączymy to z pierwszym słowem klucza:
Następnie , i . Otrzymujemy w postaci a0fafe17 88542cb1 23a33939 2a6c7605. Stąd pochodzi klucz rundy widoczny przy pierwszym MixColumns i AddRoundKey. Na przykład bajt 52 z wyliczonej wyżej kolumny zostaje połączony z a0, co daje f2. Obie liczby mają więc wskazane źródło: jedna ze ścieżki danych, druga ze ścieżki klucza.
Rozwinięcie można obliczyć przed szyfrowaniem bloków pod tym kluczem. 176 bajtów rozwinięcia nie oznacza 176 niezależnych losowych bajtów. Wszystkie klucze rund są powiązane i wynikają ze 128-bitowego klucza głównego. Nie wolno w dowodzie uznać ich bez uzasadnienia za niezależne losowania.
Przed rundami wykonujemy AddRoundKey. AES-128 ma następnie 10 rund, AES-192 ma 12, a AES-256 ma 14. Ostatnia runda pomija MixColumns. Nie jest to opcjonalna optymalizacja demonstratora. Tak jest zdefiniowany szyfr. Warianty różnią się również harmonogramem klucza, więc AES-256 nie powstaje przez samo wydłużenie pętli AES-128.
Rzeczywisty przebieg AES-128
Mapa pokazuje jednocześnie ścieżkę danych i pochodzenie kluczy rund. Rysunek szczegółowy zachowuje stan przed operacją i stan po operacji. Obok rachunku podane są źródło bieżącego stanu, publiczna reguła albo bajt wyliczonego klucza oraz miejsce zapisu wyniku. W ShiftRows bajty wędrują cyklicznie w lewo. W MixColumns najpierw powstają cztery iloczyny w ciele, następnie ich suma XOR. S-box zmienia wartość bajtu, a AddRoundKey łączy go z bajtem klucza na tej samej pozycji.
Niżej znajduje się osobne porównanie dwóch wejść. Lewa macierz dotyczy wpisanego bloku, prawa bloku z opcjonalną zmianą jednego bitu. Oba przebiegi używają tego samego klucza. Obramowane komórki różnią się między przebiegami. To samo wskazują liczniki bajtów i bitów, więc odczyt nie wymaga rozróżniania kolorów.
Dokładne operacje na bajtach. Pierwszy przykład NIST, 10 rund. Obliczenia lokalne, klucz jawny i wyłącznie testowy.
AES-128 od bloku i klucza do szyfrogramu
Stałe publiczne: S-box, przesunięcia 0, 1, 2, 3, macierz MixColumns i reguły rozwijania klucza. Dane zmienne: blok, klucz oraz wyliczane z nich stany i klucze rund.
Rozbicie operacji na bajtach
Propagacja różnicy między dwoma blokami wejściowymi
Gotowe do rozpoczęcia.
Co właściwie pokazuje rozpraszanie różnicy
Po zmianie jednego bajtu SubBytes nadal zmienia tylko tę pozycję. ShiftRows przestawia pozycję. MixColumns rozprzestrzenia różnicę w kolumnie. W kolejnej rundzie przesunięcia kierują te bajty do różnych kolumn, a kolejne mieszanie rozszerza zależność na stan. S-box wprowadza nieliniowe zależności między bitami.
Liczba zmienionych bitów nie musi rosnąć w każdym kroku. XOR z tym samym kluczem rundy zachowuje różnicę XOR dwóch stanów. Przestawienie bajtów zachowuje liczbę różnych bitów. Nieliniowa zamiana i mieszanie mogą ją zwiększyć lub zmniejszyć. Wartość około połowy bitów w wielu próbach jest obrazem efektu lawinowego, a nie certyfikatem bezpieczeństwa.
Atak różnicowy bada, jak różnica wejść wpływa na rozkład różnic wyjść. Atak liniowy szuka użytecznych odchyleń od przypadkowych relacji między bitami. Projekt rund utrudnia utrzymanie prostych, wysoko prawdopodobnych zależności przez cały szyfr. Nie można jednak powiedzieć, że każda runda zmniejsza szansę każdego ataku o stały czynnik. Możliwe są różne ścieżki, ich sumowanie i zależności między rundami. Analiza pełnego szyfru jest osobnym zadaniem kryptoanalitycznym.
Gdy znamy klucz, odwracamy te same kroki i odzyskujemy wszystkie bity. Gdy go nie znamy, trudność wynika z całej konstrukcji i jej parametrów, nie z fizycznego znikania informacji. Dowody bezpiecznych trybów pracy zwykle przyjmują, że szyfr zachowuje się jak trudna do odróżnienia permutacja. Nie są dowodami tej własności dla samego AES.
Źródła i wektory sprawdzające: FIPS 197, stany pośrednie AES-128, NIST, COSIC: konstrukcja AES i wide-trail. Demonstrator pokazuje algorytm dydaktycznie. Nie jest implementacją stałoczasową do ochrony rzeczywistych sekretów.
- COSIC
- Computer Security and Industrial Cryptography. Bezpieczeństwo komputerowe i kryptografia przemysłowa. Nazwa grupy badawczej KU Leuven.
- ECB: jednakowe bloki dają jednakowe szyfrogramy. Ukrycie pojedynczego bloku nie ukrywa struktury pliku.
- ECB
- Electronic Codebook. Tryb niezależnego szyfrowania bloków, tradycyjnie nazywany elektroniczną książką kodową.
- CBC: blok tekstu jest łączony XOR-em z poprzednim szyfrogramem. Warunki na IV, dopełnienie i błędy należą do schematu.
- CBC
- Cipher Block Chaining. Tryb wiązania bloków szyfrogramu.
- IV
- Initialization Vector. Wektor inicjalizujący. Wymagania wobec niego zależą od trybu szyfrowania.
- CTR: szyfrujemy kolejne wartości licznika i otrzymujemy maski. Powtórzenie licznika pod tym samym kluczem powtarza maskę.
- AEAD: szyfrogram ma znacznik uwierzytelniający. Dane dodatkowe są jawne, ale chronione przed zmianą.
AES-GCM otrzymuje klucz, nonce, wiadomość i AAD. Nonce musi być unikalny dla klucza. W laboratorium używamy 96-bitowego nonce i znacznika 128-bitowego. Deszyfrowanie daje tekst albo błąd . Aplikacja nie może użyć tekstu przed sprawdzeniem znacznika. RFC 5116 określa interfejs AEAD.
- RFC
- Request for Comments. Dokument z serii opisującej m.in. protokoły internetowe. Nie każdy RFC jest standardem.
Od rundy do długiej wiadomości
Pojedyncza permutacja 16 bajtów nie określa jeszcze szyfrowania pliku. Tryb pracy ustala, jak łączymy bloki, skąd bierze się losowość i co trzeba przesłać odbiorcy poza właściwym szyfrogramem. Błąd w tych regułach może zniweczyć bezpieczeństwo nawet przy poprawnej implementacji AES.
Dla CBC oznaczmy poprzedni szyfrogram przez , a początkowo :
Dopełnienie uzupełnia ostatni niepełny blok. Klasyczny argument poufności CBC wymaga odpowiednio nieprzewidywalnego IV. Jawność IV nie oznacza, że można pozwolić przeciwnikowi na dowolną zmianę bez konsekwencji. Różnice komunikatów błędów po deszyfrowaniu mogą tworzyć wyrocznię dopełnienia. Współczesne zastosowanie powinno wybierać właściwy profil uwierzytelnionego szyfrowania, a nie ręcznie sklejać tryb i obsługę błędów.
CTR używa wejść do szyfru blokowego:
Wszystkie pod tym samym kluczem muszą być różne, również pomiędzy wiadomościami. Część wejścia może identyfikować wiadomość, a reszta numerować bloki. Licznik nie może się przepełnić. Ostatni blok wykorzystuje potrzebny prefiks maski, bez dopełniania tekstu.
W GCM szyfrowaniu licznikowemu towarzyszy uwierzytelnienie oparte na wielomianowym rachunku w ciele binarnym. Sekretny klucz tego rachunku nie jest funkcją haszującą do krzywej. Powtórzenie nonce może zagrozić zarówno poufności, jak i integralności. Dlatego test „odszyfrowało się poprawnie” nie wystarcza do oceny zarządzania nonce.
Do bibliotecznego użycia AES-GCM w L1.1–5 wystarczy ten interfejs. Własny GHASH w L1.6 jest późniejszym pogłębieniem: po rachunku ciał binarnych z W6 przejdź do budowy bloków i znacznika GCM. Tam rozdzielamy dopełnienie, kolejność bitów, klucz mnożenia i końcową maskę AES.
Dlaczego permutacja może zastępować funkcję
PRP oznacza pseudolosową permutację: rodzinę odwracalnych funkcji, której nie umiemy wydajnie odróżnić od losowej permutacji przy określonym dostępie. PRF z W2 nie musi być odwracalna. To rozróżnienie pozwala połączyć model szyfru blokowego z wcześniejszym dowodem używającym funkcji pseudolosowej.
- PRP
- pseudorandom permutation. Permutacja pseudolosowa.
Losowa permutacja nie powtarza wyjścia dla różnych wejść, a losowa funkcja może. Dla różnych zapytań na -bitowych blokach różnicę ogranicza prawdopodobieństwo kolizji, najwyżej . To lemat przełączania PRP/PRF dla odpowiedniego dostępu do wyroczni. Zapytania odwrotne wymagają właściwego rozszerzenia modelu.
Granica urodzinowa nie jest zalecanym limitem użycia konkretnego AEAD. Limity uwzględniają też długości danych, znaczniki i próby weryfikacji.
Ten sam rekord, pięć prób odbioru
W poniższym doświadczeniu nie porównujemy tylko wzorów. Przeglądarka wykonuje szyfrowanie i deszyfrowanie AES-GCM. Wariant bez zmian powinien zwrócić wiadomość. Zmiana wybranego bitu szyfrogramu, znacznika lub nonce albo zmiana AAD prowadzi do kontroli integralności na rzeczywiście otrzymanych bajtach. Błąd oznacza, że aplikacja nie otrzymała tekstu.
AES-256-GCM w WebCrypto, nonce 96-bitowy, znacznik 128-bitowy. Każdy przebieg tworzy nowy klucz. Nie używaj tutaj rzeczywistych poufnych danych.
Gotowe.
Dane i świeży nonce
Oczekuje.
Szyfrowanie
Oczekuje.
Przesyłka w sieci
Oczekuje.
Weryfikacja przed wydaniem tekstu
Oczekuje.
Sprawdź: Zmieniaj pojedynczo szyfrogram, znacznik, AAD i nonce. Zobacz, czy API zwróciło jakikolwiek tekst.
- JSON
- JavaScript Object Notation. Tekstowy format zapisu danych strukturalnych.
W prawdziwej aplikacji klucz może obsługiwać wiele rekordów, ale nonce nie może się powtórzyć pod tym kluczem. Demonstrator tworzy nowy klucz dla każdego przebiegu. Wymagania konstrukcji podaje NIST SP 800-38D, a zachowanie operacji przeglądarkowych opisuje Web Cryptography API.
W5. Hasze, MAC i integralność
Interfejsy narzędzi przed protokołami
Hash, PRF i MAC nie są zamiennymi nazwami tej samej funkcji. Uporządkujmy ich wywołania. Poniżej jest ciągiem wejściowym, tajnym kluczem, wiadomością, a znacznikiem. Parametry profilu ustalamy wcześniej.
| Narzędzie | Wywołanie i wynik | Kto musi znać sekret |
|---|---|---|
| PRG | , dłuższy ciąg z krótkiego zalążka | Strona, której zależy na nieprzewidywalności , chroni . |
| PRF | , wynik o ustalonej długości | Obliczający zna . Powtórzenie przy tym samym kluczu daje ten sam wynik. |
| Hash | , publiczny skrót | Nikt. Obliczenie nie wymaga klucza. |
| MAC | , następnie | Nadawca i weryfikator znają ten sam . Bit oznacza akceptację. |
| KDF | Wejściowy materiał musi mieć wymaganą tajność i entropię. Kontekst i etykieta mogą być jawne. |
- KDF
- Key Derivation Function. Funkcja wyprowadzania kluczy.
W opisie KDF oznacza kontekst zastosowania, a jego etykietę. Dokładne dziedziny i długości ustala konkretny profil. Dla MAC mamy rodzinę algorytmów oraz warunek dla poprawnie utworzonego klucza. Czasem Tag nazywa się po prostu MAC, co zastosujemy w opisie SIGMA. MAC nie jest podpisem publicznym: weryfikator znający potrafi również tworzyć znaczniki.
- SIGMA
- SIGn-and-MAc. Podejście łączące podpis cyfrowy i kod uwierzytelnienia wiadomości.
Funkcja skrótu jest publiczna. Odporność na kolizje utrudnia znalezienie różnych wiadomości o jednym skrócie. Odporność na przeciwobraz dotyczy odtworzenia wejścia dla zadanego wyniku. Drugiego przeciwobrazu szukamy dla już zadanej wiadomości.
Sam skrót nie uwierzytelnia. Przeciwnik może zmienić plik i ponownie policzyć skrót. MAC używa sekretu. W eksperymencie niepodrabialności przeciwnik pyta o znaczniki, a potem przedstawia poprawny znacznik nowej wiadomości.
MAC z funkcji pseudolosowej: algorytmy i przepływ
F jest rodziną funkcji pseudolosowych o ustalonej długości znacznika. Jest to konstrukcja MAC z PRF, nie definicja dowolnego hasza.
Ustal rodzinę F, przestrzeń kluczy i τ.
Sprawdź format i długość. Porównuj znaczniki w sposób nieujawniający położenia różnicy.
MAC z funkcji pseudolosowej
Nadawca:
Odbiorca:
- Nadawca, Tag:
- Nadawca → Odbiorca: Jawna wiadomość i znacznik
- Odbiorca, Check:
Dowód MAC z PRF
Niech ma bitów. Rozważamy jedno końcowe fałszerstwo. Zastępujemy przez . Dla nowego wartość pozostaje jednostajna niezależnie od wcześniejszych znaczników. Trafienie ma prawdopodobieństwo . Redukcja PRF odpowiada na zapytania i sprawdza fałszerstwo własną wyrocznią:
Wiele prób wymaga osobnego rozliczenia. HMAC ma konkretną konstrukcję i analizę. Nie wynika z niej, że dowolne jest poprawnym MAC. Kodowanie i rozszerzalność części funkcji skrótu mają znaczenie.
- HMAC
- Hash-based Message Authentication Code. Kod uwierzytelnienia wiadomości oparty na funkcji haszującej. Przyrostek SHA-256 wskazuje użyty hasz.
Przedłużanie skrótu nie wymaga kolizji
Wyjaśnijmy, co może pójść źle w takim prefiksowym znaczniku. SHA-256 przetwarza 512-bitowe bloki. Do wejścia długości bitów dopisuje bit 1, tyle zer, aby długość przed polem długości była równa 448 modulo 512, oraz 64-bitowy zapis . Oznaczmy to dopełnienie przez . Funkcja kompresująca aktualizuje stan po każdym bloku, a skrót SHA-256 ujawnia cały stan końcowy.
Przeciwnik znający oraz długość może użyć jako stanu początkowego dalszego przetwarzania. Nie odtwarza klucza. Dla wybranego dodatku wyznacza skrót wejścia , z nowym dopełnieniem dla całej przedłużonej długości. W efekcie potrafi utworzyć znacznik wiadomości
Przykładowo przy kluczu długości 16 bajtów i wiadomości długości 3 bajtów pierwsze dopełnienie ma 45 bajtów. Zaczyna się od 80, ma 36 zerowych bajtów i kończy 8-bajtowym zapisem liczby 152. Stan odpowiada już przetworzeniu 64 bajtów. Po dopisaniu 1 bajtu nowe pole długości koduje 520 bitów. Dołączone do dopełnienie jest częścią bajtów fałszerstwa, nie niewidzialną instrukcją dla odbiorcy.
Jeżeli długość klucza jest nieznana, można próbować uzasadnionych kandydatów. Weryfikacja i parser aplikacji określają, które wiadomości mogą zostać przyjęte. Ten mechanizm nie wymaga znalezienia dwóch różnych wejść o tym samym skrócie. Nie działa w tej postaci dla każdej funkcji skrótu, w szczególności nie jest opisem SHA-3 ani HMAC. HMAC wykorzystuje osobne haszowanie wewnętrzne i zewnętrzne. Jego bezpieczeństwa nie zastępuje samo stwierdzenie, że ten konkretny atak nie działa. SHA-256 i dopełnienie, RFC 6234, §4 i §6.2, HMAC, RFC 2104.
Kodowanie, domeny i wyprowadzanie kluczy
Złożone wejścia kodujemy jednoznacznie, np. długość pola i jego bajty. Role hasza rozdzielamy etykietą domeny. Dwie różne krotki nie mogą stać się tym samym wejściem przez konkatenację bez granic.
KDF, funkcja wyprowadzania klucza, zamienia odpowiedni tajny materiał wejściowy na bajty kluczy o potrzebnych długościach. Dołącza się kontekst oraz osobne etykiety zastosowań. Nie tworzy sekretu z publicznych danych i nie naprawia przewidywalnego wejścia. Przykładem jest HKDF, opisany w RFC 5869. W W10 zastosujemy ten interfejs do wspólnego elementu grupy.
- HKDF
- HMAC-based Extract-and-Expand Key Derivation Function. Funkcja wyprowadzania kluczy oparta na HMAC, z etapami ekstrakcji i rozszerzania.
Dwa różne doświadczenia z haszowaniem
Najpierw skracamy SHA-256 do początkowych bitów. To celowe osłabienie, dzięki któremu rzeczywista kolizja pojawia się szybko. Dla ustalonej liczby niezależnych jednostajnych wyników dokładne prawdopodobieństwo co najmniej jednej kolizji wynosi:
Założenie o losowych wynikach służy rachunkowi teoretycznemu. Sam SHA-256 jest deterministycznym algorytmem. Wyszukiwanie zatrzymujemy po pierwszej kolizji lub po 2048 próbach. Wynikiem jest konkretna para różnych wiadomości z równymi krótkimi skrótami. Pełne skróty pozostają dostępne, aby nie pomylić tego zdarzenia ze złamaniem pełnego SHA-256.
SHA-256 w WebCrypto. Obcinamy wynik do małej liczby bitów, aby kolizję dało się znaleźć podczas zajęć. Pełnego SHA-256 nie łamiemy.
Gotowe.
Różne wiadomości
Oczekuje.
Obliczanie skrótów
Oczekuje.
Znaleziony świadek
Oczekuje.
Rachunek prawdopodobieństwa
Oczekuje.
Sprawdź: Porównaj 8 i 16 bitów. Czy dwukrotnie dłuższy skrót oznacza tylko dwukrotnie więcej prób?
Drugi eksperyment nie szuka kolizji. Pokazuje, dlaczego zgodny publiczny skrót nie potwierdza nadawcy. Po zmianie wiadomości przeciwnik liczy nowy skrót bez sekretu. Nie potrafi w ten sam sposób poprawić skopiowanego znacznika HMAC.
Rzeczywiste SHA-256 i HMAC-SHA-256. Wariant ataku nie otrzymuje klucza MAC. Wszystkie role są uruchomione lokalnie w jednej przeglądarce.
Gotowe.
Uzgodniony sekret
Oczekuje.
Nadawca liczy
Oczekuje.
Przeciwnik przesyła
Oczekuje.
Odbiorca sprawdza
Oczekuje.
Sprawdź: Zmień wiadomość. Publiczny skrót da się poprawnie przeliczyć bez sekretu, lecz poprzedni MAC nie powinien przejść.
Nieudana próba z jednym starym MAC nie jest pełnym dowodem niepodrabialności. Jest świadkiem różnicy między dwoma interfejsami: publicznym liczeniem skrótu i tajnym tworzeniem znacznika. Analizę HMAC należy wiązać z jego konkretną konstrukcją, a nie z dowolną funkcją zawierającą klucz.
Powiązania: C4, Encrypt-then-MAC, RFC 2104.