Podstawa wykładowa: Część 3 - slajdy 30, 31, 32, 33, 34: historia Salsa20/ChaCha20, konstrukcja DJB, macierz stanu 4x4 słów 32-bitowych, operacja Quarter Round
(ARX), standard RFC 8439, Poly1305 MAC, porównanie z AES.
Cel
Celem zadania jest zapoznanie się z architekturą nowoczesnego szyfru strumieniowego ChaCha20 oraz powiązanego schematu uwierzytelnionego ChaCha20-Poly1305 (RFC 8439). Student
weryfikuje odporność ChaCha20 na ataki czasowe (brak tablic S-box), bada budowę 512-bitowego stanu oraz testuje generowanie i weryfikację tagu Poly1305 w konsoli OpenSSL i CyberChef.
Scenariusz – opis
Szyfr ChaCha20, opracowany przez Daniela J. Bernsteina, jest współczesnym następcą szyfrów strumieniowych i konkurentem AES. W przeciwieństwie do AES, ChaCha20 nie wymaga
tablic przeglądowych (S-boksów), lecz opiera się wyłącznie na operacjach ARX (dodawanie 32-bitowe, rotacja bitowa, XOR). Dzięki architekturze ARX algorytm wykonuje się w stałym czasie,
co całkowicie eliminuje ataki czasowe z kanałów bocznych w implementacjach programowych. Wewnętrzny stan algorytmu stanowi macierz 4x4 słów 32-bitowych (łącznie 64 bajty / 512 bitów),
zawierająca stałe, klucz 256-bitowy, licznik i Nonce. Standard RFC 8439 łączy ChaCha20 z szybkim kodem uwierzytelniania wiadomości Poly1305, tworząc kompletny i bezpieczny szyfr AEAD. W
zadaniu przetestujesz zarówno czysty szyfr ChaCha20, jak i schemat ChaCha20-Poly1305 w konsoli JSLinux oraz w CyberChef.
Co ma wykonać student / grupa
Rozpoczynasz od otwarcia narzędzia CyberChef oraz terminala
JSLinux Alpine. W CyberChef odnajdujesz operację ChaCha i konfigurujesz 256-bitowy
klucz (32 bajty) oraz 96-bitowy Nonce (12 bajtów) w postaci szesnastkowej. Wpisujesz tekst jawny i obserwujesz wygenerowany szyfrogram o identycznej długości.
Następnie w CyberChef przełączasz się na operację ChaCha20-Poly1305 i wprowadzasz dane powiązane AAD. Zauważasz, że
wyjście zostaje powiększone o dokładnie 16 bajtów reprezentujących kryptograficzny tag uwierzytelniający Poly1305.
Przechodzisz do terminala JSLinux, w którym dostępna jest nowoczesna wersja biblioteki
OpenSSL wspierająca algorytmy Bernsteina. Tworzysz plik z danymi niejawnymi:
echo'Kryptografia symetryczna nowej generacji'>chacha_in.txt. Wykonujesz szyfrowanie
poleceniem opensslenc -chacha20 z parametrami -K oraz -iv.
Następnie testujesz szyfrowanie uwierzytelnione poleceniem opensslenc -chacha20-poly1305 z dołączeniem danych
AAD i generowaniem tagu. Weryfikujesz, co się stanie, gdy zmodyfikujesz pojedynczy bit w pliku szyfrogramu: OpenSSL natychmiast przerywa działanie i zgłasza błąd weryfikacji tagu.
Porównujesz model ChaCha20-Poly1305 ze standardem AES-GCM pod kątem wydajności na procesorach pozbawionych instrukcji AES-NI (np. smartfony,
mikrokontrolery). Analizujesz strukturę pierwszych 16 bajtów stanu ChaCha20, które zawierają stałą 'expand 32-byte k' zapobiegającą atakom na symetrię.
Sporządzasz tabelę zestawiającą parametry ChaCha20 (rozmiar stanu, klucz, nonce, liczba rund 20) z parametrami AES-128 i AES-256.
Wykonujesz zrzuty ekranu prezentujące pomyślne szyfrowanie oraz detekcję naruszenia integralności w obu narzędziach. Zbierasz materiały i opisy poleceń do sprawozdania.
Podsumowujesz przewagi projektowe ChaCha20 w zastosowaniach mobilnych i protokole WireGuard.
Przykładowe kroki do wykonania jako sugestia
- Otwórz serwis CyberChef w przeglądarce.
- Uruchom konsolę JSLinux Alpine z biblioteką OpenSSL.
- W CyberChef dodaj operację ChaCha z 20 rundami.
-
Wprowadź
32-bajtowy klucz hex: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f.
-
Wprowadź
12-bajtowy Nonce hex: 000000000000004a00000000.
- Wprowadź tekst jawny i zbadaj długość szyfrogramu.
-
Zmień recepturę na ChaCha20
-Poly1305 i zaobserwuj wygenerowanie
128-bitowego tagu Poly1305.
-
W JSLinux utwórz plik wejściowy:
echo -n
'Test_ChaCha20_Poly1305' > test_cc.txt.
-
Zaszyfruj plik czystym ChaCha20:
openssl enc -chacha20
-in test_cc.txt -out test_cc.enc -K
000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -iv
000000000000004a00000000.
- Sprawdź rozmiar pliku wyjściowego i porównaj z rozmiarem pliku wejściowego.
-
Odszyfruj plik poleceniem
openssl enc -d
-chacha20 i potwierdź zgodność.
-
Zaszyfruj plik za pomocą ChaCha20
-Poly1305 i zbadaj procedurę generowania tagu.
-
Dokonaj celowego przekłamania jednego bajtu w zaszyfrowanym pliku i spróbuj odszyfrować. Kluczowy kontrast do raportu: to samo przekłamanie wykonaj dwukrotnie - raz na
pliku z czystego ChaCha20 (odszyfrowanie przejdzie bez ostrzeżenia i po cichu zwróci zmieniony tekst!) oraz raz na pliku
ChaCha20
-Poly1305 (natychmiastowy błąd tagu). Ten jeden eksperyment
A/B dowodzi, po co istnieje Poly1305.
- Zarejestruj błąd autoryzacji zgłoszony przez silnik kryptograficzny.
- Wykonaj zrzuty ekranu z CyberChef oraz terminala JSLinux.
-
Sporządź raport techniczny opisujący architekturę
ARX i uzasadniający popularność ChaCha20 w
TLS 1.3 i VPN WireGuard.
Kontrola zaliczenia (checklist):
- Zachowano artefakt: szyfrogram ChaCha20 oraz paczka ChaCha20-Poly1305 z tagiem, log poprawnej weryfikacji i odrzucenia po manipulacji.
- Dołączono 2–3 zrzuty z podpisami: komendy openssl enc -chacha20, podgląd macierzy stanu / stałej expand 32-byte k oraz test tagu.
- Opisano w 2–3 zdaniach wybór narzędzi i przewagę ARX (brak S-box, odporność czasowa).
- Zapisano wnioski (3–5 zdań): ARX a cache-timing, rola Poly1305, AEAD wg RFC 8439.
Wariant offline (fallback): Brak sieci/JSLinux: lokalny OpenSSL (Git-Bash/WSL) na plikach ze startera; CyberChef zastąp opisem z cache i poleceniami openssl enc/dgst; do sprawozdania dołącz pliki .bin/.b64 i log komend.
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 architektura ARX zapewnia odporność na ataki czasowe z kanałów bocznych (brak tablic S-box w pamięci cache).
- Rola macierzy stanu 4x4 słów 32-bitowych i funkcja stałej 'expand 32-byte k'.
- Jak połączenie ChaCha20 z Poly1305 tworzy kompletny i wydajny szyfr AEAD zgodny z RFC 8439.
- Student potrafi posługiwać się poleceniami ChaCha20 i ChaCha20-Poly1305 w OpenSSL oraz interpretować rolę tagu integralności.