Podstawa wykładowa: Część 3 - slajdy 42, 43, 45: standard SHA-3 (FIPS 202), architektura Keccak, konstrukcja gąbki (Sponge Construction), faza wchłaniania
(absorb), faza wyciskania (squeeze), pojemność capacity c, szybkość rate r, permutacja Keccak-f.
Cel
Celem zadania jest dogłębne poznanie architektury najnowszego standardu NIST SHA-3 poprzez zaimplementowanie w języku Python modelu gąbki kryptograficznej (Sponge Construction)
oraz zredukowanej permutacji Keccak. Student programuje fazę wchłaniania (absorb) i wyciskania (squeeze), bada rolę parametrów szybkości (rate) i pojemności (capacity) oraz wykazuje
matematycznie, dlaczego konstrukcja gąbki jest całkowicie odporna na atak Length Extension Attack.
Scenariusz – opis
W 2015 roku NIST opublikował normę FIPS 202 standaryzującą algorytm SHA-3, oparty na zwycięskim projekcie Keccak stworzonym przez Bertoniego, Daemena, Peetersa i Van Assche. W
przeciwieństwie do wszystkich wcześniejszych standardów (MD5, SHA-1, SHA-2) opartych na konstrukcji Merkle-Damgård, SHA-3 wykorzystuje rewolucyjną konstrukcję gąbki (ang. Sponge
Construction). Stan wewnętrzny gąbki ma stały rozmiar b = r + c (w pełnym SHA-3 b = 1600 bitów), gdzie r to szybkość (rate), a c to pojemność (capacity) determinująca poziom
bezpieczeństwa. W fazie wchłaniania (absorb) kolejne porcje danych o długości r bitów są sumowane bitowo XOR ze stanem i poddawane nieliniowej permutacji f. W fazie wyciskania (squeeze)
ze stanu pobiera się kolejne porcje r-bitowe tworzące wynikowy skrót o dowolnej, żądanej przez użytkownika długości. W tym zadaniu zaimplementujesz model gąbki i uproszczoną permutację
Keccak w Pythonie w JSLinux, badając jej unikalne właściwości.
Co ma wykonać student / grupa
W terminalu JSLinux Alpine otwierasz edytor
nano i tworzysz program sponge_sha3.py. Definiujesz stan gąbki jako trójwymiarową tablicę 5x5 słów o określonej długości w
(reprezentację stanu Keccak). Dla celów dydaktycznych implementujesz zredukowany wariant Keccak o słowie w = 8 bitów (rozmiar stanu b = 5 x 5 x 8 =
200 bitów / 25 bajtów) lub w = 16 bitów. Zadajesz parametry gąbki: szybkość r = 8 bajtów (64 bity) oraz pojemność c = 17 bajtów (136
bitów).
Implementujesz pięć elementarnych transformacji rundy permutacji Keccak-f: Theta (dyfuzja kolumnowa parity), Rho (rotacje bitowe), Pi (permutacja pozycji), Chi (nieliniowa
funkcja logiczna) oraz Iota (dodanie stałej rundowej). Implementujesz funkcję dopełnienia pad10*1 zgodną ze specyfikacją FIPS 202. Oprogramowujesz fazę wchłaniania (absorb): dzielisz
wiadomość na bloki r-bajtowe, każdy blok sumujesz XOR z pierwszymi r bajtami stanu i aplikujesz permutację Keccak-f. Oprogramowujesz fazę wyciskania (squeeze):
pobierasz r bajtów ze stanu, a jeśli żądana długość skrótu jest większa, wykonujesz kolejną permutację i pobierasz następne bajty.
Generujesz skrót o długości 16 bajtów oraz 32 bajtów dla komunikatu testowego. Weryfikujesz efekt lawinowy: modyfikujesz 1 bit na wejściu i obserwujesz stan gąbki po
kolejnych rundach permutacji.
Następnie przeprowadzasz dowód matematyczny odporności na atak Length Extension Attack. Wykazujesz, że ponieważ pojemność c (136 bitów) pozostaje całkowicie ukryta wewnątrz
stanu i nigdy nie jest wyprowadzana na zewnątrz podczas fazy squeeze, atakujący nie zna pełnego stanu gąbki i nie może kontynuować haszowania. Porównujesz model gąbki z tradycyjnymi
funkcjami kompresji Daviesa-Meyera. Sporządzasz diagram fazy absorb/squeeze oraz tabelę parametrów FIPS 202 dla SHA3-224, SHA3-256, SHA3-384, SHA3-512.
Wykonujesz zrzuty ekranu z wykonania programu w konsoli JSLinux. Kompletujesz pełny raport laboratoryjny z wnioskami.
Przykładowe kroki do wykonania jako sugestia
- Uruchom maszynę wirtualną JSLinux Alpine.
- Utwórz plik programu:
nano sponge_sha3.py.
- Zaimplementuj reprezentację stanu 5x5 słów w Pythonie.
- Zaimplementuj operację dopełnienia pad10*1:
padding(msg_len, rate).
- Zaimplementuj krok Theta (mieszanie parzystości kolumn) permutacji Keccak.
- Zaimplementuj kroki Rho i Pi (rotacje i permutacje współrzędnych).
-
Zaimplementuj krok Chi (jedyną nieliniową operację logiczną w Keccak: a ^ ((
~b) & c)).
- Zaimplementuj krok Iota dodający stałą rundową do słowa (
0,0).
- Złóż pełną funkcję permutacji
keccak_f( state, rounds).
-
Zaimplementuj fazę wchłaniania
absorb( state, message_blocks, rate).
-
Zaimplementuj fazę wyciskania
squeeze( state, output_len, rate).
- Przetestuj generowanie skrótu dla krótkiej wiadomości testowej.
-
Zbadaj zachowanie gąbki przy żądaniu wyjścia o długości 64 bajtów (funkcja
XOF, funkcja
SHAKE).
- Wykaż w konsoli niemożliwość odtworzenia stanu ukrytej pojemności c z samego wyjścia squeeze.
-
Słowniczek pojęć do raportu (jedno zdanie na hasło,
bez niego wnioski są niezaliczone): rate
r = część stanu stykająca się z danymi
(wejście/wyjście); capacity c
= ukryta część determinująca bezpieczeństwo; reguła: capacity 512 bitów oznacza 256 bitów bezpieczeństwa (połowa c). Podpisz pod tabelą
FIPS 202, która wartość c odpowiada
SHA3-256 (c =
512) i dlaczego.
- Wykonaj zrzuty ekranu z działania skryptu w JSLinux.
-
Sformułuj techniczne wnioski podsumowujące architektoniczną wyższość konstrukcji gąbki nad Merkle
-Damgård.
Kontrola zaliczenia (checklist):
- Zaimplementowano gąbkę Keccak/SHA-3 na wektorze ze startera: absorb/squeeze, permutacja, zgodność z wektorami NIST oraz demo XOF o żądanej długości.
- Wykazano różnicę: gąbka (odporna na length extension, elastyczna długość) vs Merkle-Damgård (podatna); dołączono porównanie logów.
- Dołączono log implementacji (rate/capacity, rundy) + kod łatki (SHA-3/SHAKE tam gdzie(strlen) zmienna, HMAC dla starszych).
- Opisano w 3–5 zdaniach kompromis: capacity jako ukryty stan, prostota Keccak bez odwracania kompresji, wybór NIST.
Wariant offline (fallback): Praca w pełni offline na wektorach ze startera w lokalnym Pythonie 3 bez sieci; dołącz kod ataku, log odzyskanego tekstu oraz opis kompromisu czas–pamięć / bezpieczeństwo–wydajność.
Sugerowane wnioski i podsumowanie - co student ma osiągnąć
Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:
- W jaki sposób podział stanu na szybkość (rate) i ukrytą pojemność (capacity) uniemożliwia ataki dołączenia długości.
- Uniwersalność konstrukcji gąbki: możliwość generowania wyjścia o dowolnej długości (funkcje XOF, np. SHAKE128 i SHAKE256).
- Elegancja permutacji Keccak opartej na prostych operacjach logicznych bez konieczności odwracania funkcji kompresji.
- Student potrafi zaimplementować model gąbki w Pythonie i uzasadnić wybór Keccak jako standardu SHA-3 przez NIST.