Laboratorium 3
Zadania laboratoryjne dla studentów 7 semestru IT - ocena 3.0

Poziom: ocena 3.0 - podstawy kryptografii symetrycznej i funkcji skrótu

Zestaw 10 praktycznych zadań laboratoryjnych do wykonania w trakcie zajęć (90–100 minut).
Kierunek: Informatyka, semestr 7, przedmiot: Kryptologia.
Podstawa materiałowa: wykład część 3 (kryptografia symetryczna - nowoczesne algorytmy i funkcje skrótu).

Wskazówki dla studenta i zasady realizacji:

  • Zadania na ocenę 3.0 skupiają się na praktycznym zrozumieniu mechanizmów współczesnej kryptografii symetrycznej: szyfrów blokowych (DES, 3DES, AES), trybów pracy (ECB, CBC, CTR, GCM), szyfrów strumieniowych (RC4, ChaCha20, ChaCha20-Poly1305) oraz funkcji skrótu i ochrony haseł (SHA-256, HMAC, PBKDF2).
  • Wszystkie zadania są w pełni wykonalne bez praw administratora na systemie Windows - wymagają wyłącznie nowoczesnej przeglądarki internetowej i darmowych narzędzi online (CyberChef, Cryptii) oraz konsoli linuksowej z pakietem OpenSSL w emulatorze JSLinux Alpine.
  • Każde zadanie realizowane jest w czasie 90–100 minut w trakcie zajęć laboratoryjnych.
  • Wymagania formalne sprawozdania laboratoryjnego:
    • Strona tytułowa zawierająca: imię i nazwisko studenta, numer albumu, kierunek, semestr, grupę laboratoryjną, rok akademicki, numer i temat laboratorium, numer oraz nazwę realizowanego zadania, deklarowaną ocenę (3.0).
    • Opis konfiguracji środowiska badawczego, adresów serwisów WWW oraz wykorzystanych poleceń.
    • Szczegółowy opis wykonanych czynności, uzasadnienie wyboru narzędzi, zrzuty ekranu oraz wklejone fragmenty danych wejściowych i wyjściowych dokumentujące rzetelne wykonanie pracy.
    • Struktura raportu: spis treści, spis ilustracji (z numerami i podpisami), spis tabel (z numerami i podpisami) oraz wykaz źródeł literaturowych i internetowych.
Kryptologia
lab 3 - 3.0
Spis
Spis zadań laboratoryjnych na ocenę 3.0
01/10
Zadanie 1. Szyfrowanie blokowe DES i Triple DES w konsoli OpenSSL oraz narzędziu CyberChef
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL
Podstawa wykładowa: Część 3 - slajdy 6, 7, 8, 9, 10, 11: historia DES, architektura Feistela, 64-bitowy blok, 56-bitowy efektywny klucz, bity parzystości, 16 rund, 3DES EDE (Encrypt-Decrypt-Encrypt).

Cel

Celem zadania jest praktyczne przećwiczenie szyfrowania blokowego z wykorzystaniem historycznych standardów DES oraz Triple DES (3DES). Student bada strukturę 64-bitowego bloku danych, narzut dopełnienia PKCS#7 oraz różnice pomiędzy trybami ECB i CBC przy użyciu narzędzia sieciowego CyberChef oraz poleceń narzędzia OpenSSL w emulatorze JSLinux Alpine.

Scenariusz – opis

Zadanie rozpoczynasz od przygotowania dwóch narzędzi laboratoryjnych: serwisu CyberChef oraz wirtualnej konsoli JSLinux z biblioteką OpenSSL. W przeglądarce otwierasz CyberChef pod adresem gchq.github.io/CyberChef, a w sąsiedniej karcie terminal JSLinux Alpine pod adresem bellard.org/jslinux. Pierwszym celem jest zrozumienie, jak szyfry blokowe operują na stałych porcjach danych o długości 64 bitów (8 bajtów). Przygotowujesz krótki tekst testowy o długości dokładnie 8 znaków, na przykład hasło KRYPTO01, oraz tekst o długości 11 znaków, na przykład KRYPTOLOGIA. W serwisie CyberChef konfigurujesz operację DES Encrypt, wybierając tryb ECB oraz zapis klucza w formacie szesnastkowym. Badany klucz DES ma długość 8 bajtów (64 bity), z czego najmniej znaczący bit każdego bajtu stanowi bit parzystości, co daje faktyczną siłę 56 bitów.

Co ma wykonać student / grupa

Wklejasz 8-znakowy tekst do panelu wejściowego CyberChef i obserwujesz, że wynikowy szyfrogram ma długość 16 bajtów, co wynika z dodania pełnego bloku dopełnienia PKCS#7. Zmieniasz tryb pracy z ECB na CBC i wprowadzasz 8-bajtowy wektor początkowy IV, po czym analizujesz powstałą sekwencję bajtów. Zapisujesz wygenerowany szyfrogram i klucz, a następnie przechodzisz do terminala JSLinux, aby powtórzyć operację za pomocą polecenia opensslenc. W konsoli tworzysz plik tekstowy z danymi wejściowymi za pomocą polecenia echo.

Wykonujesz szyfrowanie poleceniem opensslenc-des-ecb oraz opensslenc-des-cbc, podając jawny klucz w formacie hex parametrem -K oraz wektor IV parametrem -iv. Weryfikujesz rozmiar pliku wyjściowego poleceniem wc-c lub ls-l, potwierdzając wielokrotność 8 bajtów.

W kolejnym kroku badasz algorytm Triple DES (3DES) w konfiguracji EDE3 z trzema niezależnymi kluczami o łącznej długości 168 bitów (24 bajty). W CyberChef wybierasz operację Triple DES Encrypt, wprowadzając 24-bajtowy klucz szesnastkowy oraz tryb CBC. Weryfikujesz zasadę kompatybilności wstecznej 3DES: wprowadzasz trzy identyczne podklucze K1 = K2 = K3 i sprawdzasz, czy wynik odpowiada pojedynczemu szyfrowaniu DES. W konsoli JSLinux realizujesz operację 3DES poleceniem opensslenc-des-ede3-cbc i porównujesz otrzymany plik z wynikiem z CyberChef. Przeprowadzasz próbę odszyfrowania pliku za pomocą niepoprawnego klucza w OpenSSL i analizujesz pojawiający się komunikat błędu dopełnienia bad decrypt.

Sporządzasz zestawienie tabelaryczne rozmiarów danych wejściowych, długości paddingu oraz rozmiarów szyfrogramów dla DES i 3DES. Zapisujesz polecenia systemowe, zrzuty ekranu oraz uzyskane sumy kontrolne plików szyfrogramu. Analizujesz, dlaczego 56-bitowy klucz DES został uznany za całkowicie przestarzały i podatny na atak siłowy metodą przeszukania 2^56 kombinacji. Sprawdzasz poprawność wszystkich zebranych wyników w notatkach laboratoryjnych. Kompletujesz materiały dowodowe do przygotowania sprawozdania laboratoryjnego.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz w przeglądarce serwis CyberChef (gchq.github.io/CyberChef).
  2. Uruchom emulator JSLinux Alpine (bellard.org/jslinux/vm.html?cpu=x86_64&url=alpine-x86_64.cfg&mem=256).
  3. W CyberChef wprowadź tekst jawny KRYPTO01 (8 bajtów) i dodaj operację DES Encrypt w trybie ECB.
  4. Ustaw format klucza na Hex i wpisz 16 cyfr szesnastkowych, np. 0123456789ABCDEF.
  5. Zaobserwuj wyjściowy szyfrogram i zbadaj jego długość w bajtach (16 bajtów z paddingiem PKCS#7).
  6. W CyberChef zmień tryb na CBC i zdefiniuj 8-bajtowy wektor IV: 1122334455667788.
  7. W terminalu JSLinux utwórz plik testowy: echo -n 'KRYPTO01' > jawny.txt.
  8. Zaszyfruj plik w JSLinux: openssl enc -des-cbc -in jawny.txt -out szyfr_des.bin -K 0123456789ABCDEF -iv 1122334455667788 -p.
  9. Porównaj zrzut szesnastkowy pliku szyfr_des.bin (hexdump -C szyfr_des.bin) z wyjściem w CyberChef.
  10. Odszyfruj plik w JSLinux: openssl enc -d -des-cbc -in szyfr_des.bin -out odzysk.txt -K 0123456789ABCDEF -iv 1122334455667788.
  11. Sprawdź tożsamość odszyfrowanego pliku: diff jawny.txt odzysk.txt.
  12. Zaszyfruj plik za pomocą 3DES: openssl enc -des-ede3-cbc -in jawny.txt -out szyfr_3des.bin -K 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -iv 1122334455667788.
  13. Przetestuj deszyfrowanie ze złym kluczem i zarejestruj komunikat błędu 'bad decrypt'.
  14. Wykonaj zrzuty ekranu konfiguracji w CyberChef oraz poleceń konsoli JSLinux.
  15. Sporządź tabelę porównawczą parametrów DES i 3DES (rozmiar bloku, długość klucza, liczba rund, podatności).
  16. Odnotuj w tabeli status standardów: 3DES jest wycofywany (NIST SP 800-131A dopuszcza go tylko do odczytu starszych danych; nowe systemy stosują AES) - sam fakt „działa w OpenSSL" nie oznacza „wolno stosować".
  17. Zmierz narzut 3DES względem AES jednym poleceniem: openssl speed -evp des-ede3 -evp aes-128-cbc -seconds 3; zanotuj krotność różnicy przepustowości i wyjaśnij, dlaczego potrojony DES płaci potrójny koszt czasu przy bloku tylko 64-bitowym.
  18. Sformułuj wnioski dotyczące bezpieczeństwa przestrzeni kluczy 56 bitów w kontekście historycznego projektu EFF Deep Crack.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: szyfrogramy DES i 3DES tego samego tekstu (ECB i CBC) wraz z logiem openssl enc pokazującym 8-bajtowy blok i dopełnienie PKCS#7.
  2. Dołączono 2–3 zrzuty z podpisami: komendy openssl enc -des/-des3 w JSLinux oraz weryfikacja zgodności w CyberChef.
  3. Opisano w 2–3 zdaniach wybór narzędzi (OpenSSL do kluczy/IV, CyberChef do podglądu) i znaczenie bitów parzystości (56 bitów efektywnych).
  4. Zapisano wnioski (3–5 zdań): blok 64-bitowy, narzut paddingu, schemat EDE a kompatybilność z DES.

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:

  • Jak 64-bitowy rozmiar bloku wymusza dopełnianie danych do wielokrotności 8 bajtów w schemacie PKCS#7.
  • Dlaczego efektywny klucz DES ma tylko 56 bitów pomimo 64-bitowej długości rejestru (obecność bitów parzystości).
  • W jaki sposób schemat EDE (Encrypt-Decrypt-Encrypt) w 3DES zapewnia kompatybilność wsteczną z pojedynczym DES.
  • Student potrafi przeprowadzić szyfrowanie i deszyfrowanie DES i 3DES w konsoli OpenSSL oraz zweryfikować zgodność z CyberChef.
Zadanie 1 - ilustracja
02/10
Zadanie 2. Weryfikacja podatności wzorca wizualnego w trybie ECB na pliku graficznym BMP
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL + Python 3
Podstawa wykładowa: Część 3 - slajdy 21, 22, 26: tryby pracy szyfrów blokowych, tryb ECB (Electronic Codebook), niezależne szyfrowanie bloków, problem pingwina Tuxa, brak ukrywania wzorców.

Cel

Celem zadania jest empiryczne wykazanie fundamentalnej wady bezpieczeństwa trybu ECB (Electronic Codebook). Student przeprowadza szyfrowanie pliku graficznego BMP algorytmem AES w trybach ECB oraz CBC, a następnie dokonuje analizy wizualnej odszyfrowanego nagłówka, udowadniając przetrwanie wzorców danych w trybie ECB.

Scenariusz – opis

W tym zadaniu zbadasz najprostszy i najbardziej niebezpieczny tryb pracy szyfrów blokowych, czyli tryb ECB. W trybie ECB każdy 128-bitowy blok tekstu jawnego jest szyfrowany całkowicie niezależnie od pozostałych za pomocą tego samego klucza. Oznacza to, że dwa identyczne bloki tekstu jawnego P1 = P2 zawsze generują dwa identyczne bloki szyfrogramu C1 = C2. Aby unaocznić ten problem, posłużysz się nieskompresowanym plikiem graficznym w formacie BMP (ang. Bitmap). Plik BMP składa się ze stałego nagłówka o długości 54 bajtów oraz sekwencji pikseli tworzących właściwy obraz rastrowy. Ćwiczenie wykonujesz równolegle w terminalu JSLinux Alpine oraz przy pomocy serwisu CyberChef.

Co ma wykonać student / grupa

W terminalu JSLinux tworzysz prosty skrypt w powłoce lub program w Pythonie generujący syntetyczny plik BMP o wymiarach 120x120 pikseli z wyraźnym geometrycznym kształtem. Kształtem może być czarny kwadrat lub trójkąt na białym tle, co zapewnia duże obszary powtarzających się wartości pikseli. Weryfikujesz poprawność pliku za pomocą polecenia file oraz sprawdzasz jego dokładny rozmiar w bajtach.

Następnie wydzielasz nagłówek BMP (pierwsze 54 bajty) do osobnego pliku naglowek.bin przy użyciu uniksowego narzędzia dd z parametrami bs = 1 count=54. Ciało obrazu (od 55 bajtu do końca) zapisujesz do pliku cialo.bin za pomocą dd z parametrem skip = 54. Szyfrujesz ciało obrazu algorytmem AES-128 w trybie ECB poleceniem opensslenc-aes-128-ecb z ustalonym kluczem hex. Łączysz oryginalny nagłówek naglowek.bin z zaszyfrowanym ciałem poleceniem catnaglowek.bin cialo.ecb >obraz_ecb.bmp.

Następnie powtarzasz tę samą procedurę dla trybu CBC: szyfrujesz ciało obrazu poleceniem opensslenc-aes-128-cbc z tym samym kluczem i losowym IV. Łączysz nagłówek z szyfrogramem CBC poleceniem catnaglowek.bin cialo.cbc >obraz_cbc.bmp.

Przechodzisz do serwisu CyberChef i odtwarzasz ten proces przy użyciu receptury operacji Render Image lub pobierasz pliki na dysk roboczy. Otwierasz oba wynikowe pliki BMP w przeglądarce lub podglądzie obrazów. Obserwujesz zjawisko: w pliku obraz_ecb.bmp kontury geometrycznego kształtu są nadal wyraźnie widoczne pomimo silnego algorytmu AES. W pliku obraz_cbc.bmp obraz przekształcił się w całkowicie jednolity, pseudolosowy szum bez żadnych widocznych wzorców.

Dokonujesz inspekcji heksadecymalnej obu plików, odnajdując powtarzające się 16-bajtowe sekwencje w pliku ECB. Dokumentujesz zrzutami ekranu wygląd obu obrazów oraz komendy konsolowe. Formułujesz jednoznaczne wnioski dyskwalifikujące tryb ECB z zastosowań produkcyjnych.

Przykładowe kroki do wykonania jako sugestia

  1. Uruchom maszynę JSLinux Alpine w oknie przeglądarki.
  2. Otwórz w drugiej karcie serwis CyberChef (gchq.github.io/CyberChef).
  3. W JSLinux wygeneruj testowy plik BMP za pomocą prostego skryptu Pythona lub polecenia dd z powtarzalnym wzorcem.
  4. Sprawdź właściwości pliku: ls -l test.bmp oraz file test.bmp.
  5. Wyodrębnij 54-bajtowy nagłówek: dd if=test.bmp of=header.bmp bs=1 count=54. Najpierw potwierdź poleceniem file test.bmp, że to 24-bitowy BMP (tylko wtedy nagłówek ma 54 bajty); nagłówka nigdy nie szyfrujesz - szyfrowany jest wyłącznie body.bin, a na końcu składasz sprawny plik graficzny. Finalne zrzuty mają pokazywać tux_ecb.bmp i tux_cbc.bmp obok siebie z podpisem, który tryb zachował kontury.
  6. Wyodrębnij dane pikseli: dd if=test.bmp of=body.bin bs=1 skip=54.
  7. Zaszyfruj piksele w trybie ECB: openssl enc -aes-128-ecb -in body.bin -out body_ecb.bin -K 00112233445566778899AABBCCDDEEFF -nopad.
  8. Zaszyfruj piksele w trybie CBC: openssl enc -aes-128-cbc -in body.bin -out body_cbc.bin -K 00112233445566778899AABBCCDDEEFF -iv 0102030405060708090A0B0C0D0E0F10 -nopad.
  9. Scal nagłówek z szyfrogramem ECB: cat header.bmp body_ecb.bin > tux_ecb.bmp.
  10. Scal nagłówek z szyfrogramem CBC: cat header.bmp body_cbc.bin > tux_cbc.bmp.
  11. W JSLinux zbadaj rozkład powtarzających się bloków za pomocą polecenia xxd body_ecb.bin | uniq -c | head -n 20.
  12. W CyberChef wgraj tux_ecb.bmp oraz tux_cbc.bmp i użyj operacji Render Image lub zapisz je lokalnie.
  13. Porównaj wizualną czytelność konturów na obrazie zaszyfrowanym w trybie ECB i CBC.
  14. Wykonaj zrzuty ekranu prezentujące oba obrazy oraz powtarzalność bloków szesnastkowych.
  15. Sporządź tabelę zestawiającą cechy ECB i CBC w kontekście zachowania relacji strukturalnych danych.
  16. Sformułuj techniczne uzasadnienie, dlaczego standardy bezpieczeństwa zabraniają używania ECB do danych strukturalnych.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: oryginał BMP, jego wersja ECB (widoczne kontury) i wersja CBC (szum) — z zachowanym nagłówkiem nagłówka BMP oraz logiem separacji nagłówka (dd/head).
  2. Dołączono 2–3 zrzuty z podpisami: podgląd trzech obrazów obok siebie oraz komendy openssl enc -aes-128-ecb/-cbc.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób wyłączenia nagłówka z szyfrowania (dlaczego nagłówek musi zostać jawny).
  4. Zapisano wnioski (3–5 zdań): determinizm ECB ujawnia wzorce, CBC z IV niszczy strukturę, rola nagłówka BMP.

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:

  • Dlaczego deterministyczny charakter trybu ECB prowadzi do ujawnienia struktury i konturów danych jawnych.
  • W jaki sposób łańcuchowanie bloków w trybie CBC (operacja XOR z poprzednim szyfrogramem) niszczy wszelkie powtarzalne wzorce.
  • Rola nagłówka pliku BMP i znaczenie zachowania jego integralności przy podglądzie zaszyfrowanych danych graficznych.
  • Student potrafi samodzielnie przeprowadzić separację nagłówka pliku binarnego, szyfrowanie w OpenSSL i analizę podatności wzorca.
Zadanie 2 - ilustracja
03/10
Zadanie 3. Badanie wektora inicjalizacyjnego i dopełnienia PKCS#7 w trybie CBC szyfru AES
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL
Podstawa wykładowa: Część 3 - slajdy 13, 21, 23, 26: parametry AES, tryb CBC (Cipher Block Chaining), wektor inicjalizacyjny IV, łańcuchowanie bloków, schemat dopełnienia PKCS#7.

Cel

Celem zadania jest szczegółowa analiza roli wektora inicjalizacyjnego (IV) oraz mechanizmu dopełniania danych PKCS#7 w trybie Cipher Block Chaining (CBC) algorytmu AES-128. Student bada determinizm szyfrowania przy stałym IV, zróżnicowanie szyfrogramów przy losowym IV oraz strukturę bajtów paddingu w narzędziach CyberChef i OpenSSL.

Scenariusz – opis

W tym laboratorium skupiasz się na dwóch kluczowych elementach trybu CBC: wektorze początkowym IV oraz dopełnieniu bloków. W trybie CBC pierwszy blok tekstu jawnego jest sumowany modulo dwa (XOR) z wektorem IV przed poddaniem transformacji AES. Wektor IV nie musi być tajny, ale musi być unikalny i nieprzewidywalny dla każdej operacji szyfrowania wykonywanej tym samym kluczem. Jeśli dwa identyczne komunikaty zostaną zaszyfrowane z tym samym kluczem i tym samym IV, ich szyfrogramy będą całkowicie identyczne. Ponadto AES operuje na sztywnych 128-bitowych blokach (16 bajtów), dlatego wiadomości o innej długości wymagają standaryzowanego dopełnienia. Standard PKCS#7 definiuje, że jeśli brakuje N bajtów do pełnego bloku (gdzie 1 <= N <= 16), dopisuje się N bajtów o wartości N.

Co ma wykonać student / grupa

W serwisie CyberChef przygotowujesz recepturę z operacją AES Encrypt w trybie CBC z kluczem 128-bitowym podanym w formacie Hex. Wprowadzasz wiadomość tekstową o długości 10 bajtów: KRYPTOWIEC. Definiujesz stały wektor IV złożony z szesnastu zer i zapisujesz wygenerowany szyfrogram w postaci szesnastkowej. Zmieniasz w tekście jawnym tylko jeden znak lub zachowujesz ten sam tekst, modyfikując wektor IV o dokładnie jeden bit. Obserwujesz, jak zmiana jednego bitu IV wpływa na pierwszy blok szyfrogramu oraz propaguje się na wszystkie kolejne bloki.

Teraz przechodzisz do badania bajtów paddingu: wyłączasz automatyczne formatowanie i analizujesz surowy zrzut hex w CyberChef. Zauważasz, że dla tekstu 10-bajtowego algorytm dopisał 6 bajtów o wartości szesnastkowej 06 (06 06 06 06 06 06). Zwiększasz długość tekstu jawnego dokładnie do 16 bajtów (np. WIADOMOSC_TEST16) i sprawdzasz wynikowy rozmiar szyfrogramu. Przekonujesz się, że szyfrogram ma długość 32 bajtów, ponieważ dodano pełny nadmiarowy blok 16 bajtów o wartości 10 (szesnastkowo 0x10).

Przechodzisz do terminala JSLinux i powtarzasz eksperyment za pomocą narzędzia opensslenc. Tworzysz pliki o długościach 1, 15 oraz 16 bajtów i szyfrujesz je poleceniem opensslenc-aes-128-cbc z jawnym kluczem i IV. Odczytujesz rozmiary plików poleceniem ls-l oraz badasz zawartość poleceniem xxd lub od -tx1. Następnie w JSLinux odszyfrowujesz plik z flagą -nopad i odczytujesz jawnie dopisane bajty paddingu PKCS#7. Wykonujesz zrzuty ekranu dokumentujące heksadecymalną postać bajtów paddingu oraz wpływ zmiany IV.

Sporządzasz tabelę przedstawiającą długości tekstu jawnego od 1 do 16 bajtów i odpowiadające im wartości bajtów dopełnienia. Zapisujesz wnioski wyjaśniające, dlaczego ponowne użycie IV w CBC umożliwia podsłuchiwaczowi wykrycie wspólnego prefiksu wiadomości.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz w przeglądarce CyberChef oraz konsolę JSLinux Alpine.
  2. W CyberChef skonfiguruj AES Encrypt: tryb CBC, klucz hex 000102030405060708090a0b0c0d0e0f, IV hex 00000000000000000000000000000000.
  3. Wpisz tekst KRYPTOWIEC (10 znaków) i włącz widok wyjścia w formacie Hex.
  4. Zanotuj 16-bajtowy szyfrogram i zidentyfikuj 6 bajtów paddingu 06.
  5. Zmień tekst na ciąg 16-znakowy i sprawdź, czy szyfrogram powiększył się do 32 bajtów (blok 16x 0x10).
  6. Zmień pierwszy bajt IV z 00 na 01 i porównaj wygenerowany szyfrogram z poprzednim.
  7. W JSLinux utwórz plik 10-bajtowy: echo -n '1234567890' > p10.txt.
  8. Zaszyfruj plik: openssl enc -aes-128-cbc -in p10.txt -out c10.bin -K 000102030405060708090a0b0c0d0e0f -iv 00000000000000000000000000000000.
  9. Sprawdź rozmiar pliku: ls -l c10.bin (dokładnie 16 bajtów).
  10. Odszyfruj plik bez usuwania paddingu: openssl enc -d -aes-128-cbc -nopad -in c10.bin -out p10_raw.txt -K 000102030405060708090a0b0c0d0e0f -iv 00000000000000000000000000000000.
  11. Wyświetl surową zawartość p10_raw.txt w formacie hex: xxd p10_raw.txt lub hexdump -C p10_raw.txt.
  12. Zidentyfikuj końcowe 6 bajtów o wartości 0x06.
  13. Mini-demonstracja zalążka ataku: skopiuj szyfrogram (cp c10.bin c10_bad.bin), nadpisz jego ostatni bajt dowolną wartością (printf '\x41' | dd of=c10_bad.bin bs=1 seek=15 conv= notrunc) i spróbuj odszyfrować z tymi samymi -K i -iv; zanotuj komunikat błędu weryfikacji dopełnienia OpenSSL. To jest dokładnie ten kanał „padding OK / błąd", który w Zadaniu 2 z poziomu 5.0 zamienia się w pełny atak wyroczni dopełnienia - zapamiętaj treść komunikatu.
  14. Utwórz plik 16-bajtowy i powtórz operację z -nopad, weryfikując obecność 16 bajtów o wartości 0x10.
  15. Wykonaj zrzuty ekranu z konsoli JSLinux oraz panelu CyberChef z widocznym paddingiem.
  16. Zestaw w tabeli rozmiar wejścia, brakujące bajty i wartości dodawane przez PKCS#7.
  17. Sformułuj wnioski dotyczące bezpieczeństwa generowania wektorów IV za pomocą generatora CSPRNG.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: dwa szyfrogramy CBC tego samego tekstu (stały IV = identyczne, losowy IV = różne) oraz odczyt surowego paddingu opcją -nopad z ręcznym wskazaniem bajtów PKCS#7.
  2. Dołączono 2–3 zrzuty z podpisami: szyfrowanie z IV stałym/losowym oraz hexdump ostatniego bloku z paddingiem (w tym pełny blok przy wielokrotności 16).
  3. Opisano w 2–3 zdaniach wybór narzędzi (openssl + xxd) i sposób generowania losowego IV.
  4. Zapisano wnioski (3–5 zdań): reguła PKCS#7, pełny blok przy wielokrotności, IV jako obrona przed słownikiem.

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 reguła PKCS#7 jednoznacznie określa liczbę dodanych bajtów i eliminuje niejednoznaczność przy odcinaniu dopełnienia.
  • Dlaczego tekst o długości równej wielokrotności rozmiaru bloku musi otrzymać dodatkowy pełny blok dopełnienia.
  • Rola wektora IV w zapobieganiu atakom słownikowym i uniemożliwianiu wykrycia identycznych początków wiadomości.
  • Student potrafi odczytać surowy padding za pomocą opcji -nopad w OpenSSL oraz uzasadnić wymóg losowości wektora IV.
Zadanie 3 - ilustracja
04/10
Zadanie 4. Przekształcenie szyfru blokowego w strumieniowy w trybie licznika AES-CTR i badanie braku paddingu
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL + Python 3
Podstawa wykładowa: Część 3 - slajdy 21, 24, 26: tryb CTR (Counter), przekształcenie szyfru blokowego w strumieniowy, funkcja licznika, Nonce, operacja XOR, brak narzutu dopełnienia, zrównoleglenie.

Cel

Celem ćwiczenia jest zbadanie specyfiki trybu licznika AES-CTR, w którym szyfr blokowy funkcjonuje jako generator ciągu pseudolosowego (keystream). Student weryfikuje brak konieczności stosowania paddingu, idealną symetrię operacji szyfrowania i deszyfrowania oraz bada katastrofalne skutki kryptoanalityczne powtórzenia wartości licznika i Nonce.

Scenariusz – opis

W tym zadaniu analizujesz tryb licznika CTR (ang. Counter Mode), który jest powszechnie stosowany w protokołach o wysokiej wydajności. W trybie CTR sam algorytm AES nie szyfruje bezpośrednio tekstu jawnego, lecz ciąg kolejnych wartości licznika. Blok wejściowy dla AES składa się z unikalnej wartości jednorazowej Nonce oraz inkrementowanego rejestru licznika Counter. Wynik szyfrowania AES(Nonce || Counter) tworzy blok strumienia klucza (ang. keystream), który jest sumowany bitowo XOR z tekstem jawnym. Dzięki temu szyfr blokowy zostaje przekształcony w deterministyczny szyfr strumieniowy o dowolnej ziarnistości bajtowej. Oznacza to, że tekst jawny nie musi być uzupełniany do wielokrotności 16 bajtów – długość szyfrogramu jest dokładnie równa długości wejścia.

Co ma wykonać student / grupa

Pracę rozpoczynasz od otwarcia narzędzia CyberChef oraz konsoli JSLinux. W CyberChef dodajesz operację AES Encrypt i zmieniasz tryb pracy na CTR. Wprowadzasz 128-bitowy klucz hex oraz 128-bitowy wektor początkowy składający się z Nonce i początkowego stanu licznika. Jako tekst wejściowy podajesz komunikat o niestandardowej długości 7 bajtów: SEKRET1.

Odczytujesz długość wyjściowego szyfrogramu w oknie Output i potwierdzasz, że wynosi ona dokładnie 7 bajtów bez żadnego paddingu. Zwiększasz tekst o 1 bajt i sprawdzasz, że szyfrogram powiększa się dokładnie o 1 bajt.

Teraz badasz symetrię operacji: bierzesz uzyskany 7-bajtowy szyfrogram i przepuszczasz go ponownie przez tę samą operację AES Encrypt w trybie CTR z tym samym kluczem i Nonce. Obserwujesz, że operacja szyfrująca natychmiast przywraca oryginalny tekst jawny SEKRET1, co wynika z właściwości operacji XOR: (P XOR K) XOR K = P.

Przechodzisz do terminala JSLinux i powtarzasz testy za pomocą polecenia opensslenc-aes-128-ctr. Tworzysz plik testowy o długości 13 bajtów poleceniem echo-n'TAJNY_PROJEKT'>dane.txt. Szyfrujesz go do pliku szyfr.bin i sprawdzasz poleceniem wc-cszyfr.bin, że rozmiar wynosi dokładnie 13 bajtów. W JSLinux deszyfrujesz plik poleceniem opensslenc-d-aes-128-ctr oraz eksperymentalnie poleceniem szyfrującym bez flagi -d, weryfikując tożsamość wyników.

Kolejnym kluczowym krokiem jest zademonstrowanie zagrożenia związanego z powtórzeniem Nonce (ang. Two-Time Pad). Szyfrujesz dwie różne wiadomości M1 i M2 tym samym kluczem i tym samym Nonce, a następnie w konsoli wykonujesz ich bitowy XOR za pomocą prostego polecenia w Pythonie. Pokazujesz, że C1 XOR C2 = M1 XOR M2, co całkowicie eliminuje klucz tajny z równania i pozwala na odzyskanie obu tekstów. Dokumentujesz wykonane polecenia, zrzuty ekranu oraz sporządzasz tabelaryczne podsumowanie zalet i ryzyk trybu CTR.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz serwis CyberChef w przeglądarce internetowej.
  2. Uruchom maszynę wirtualną JSLinux Alpine.
  3. W CyberChef wybierz operację AES Encrypt, ustaw tryb CTR, klucz hex 0102030405060708090a0b0c0d0e0f10 i IV/Nonce hex a0a1a2a3a4a5a6a7a8a9aaabacadaeaf.
  4. Wpisz tekst SEKRET1 (7 bajtów) i sprawdź w formacie Hex długość wyjścia (7 bajtów).
  5. Skopiuj szyfrogram do Input i użyj ponownie AES Encrypt (nie Decrypt) z tymi samymi parametrami, odzyskując SEKRET1.
  6. W JSLinux utwórz plik o długości 13 bajtów: echo -n 'TAJNY_PROJEKT' > m1.txt.
  7. Zaszyfruj plik: openssl enc -aes-128-ctr -in m1.txt -out c1.bin -K 0102030405060708090a0b0c0d0e0f10 -iv a0a1a2a3a4a5a6a7a8a9aaabacadaeaf.
  8. Zweryfikuj rozmiar pliku wyjściowego: ls -l c1.bin (dokładnie 13 bajtów).
  9. Odszyfruj plik poleceniem openssl enc -d -aes-128-ctr i porównaj z oryginałem.
  10. Utwórz drugi plik o długości 13 bajtów: echo -n 'JAWNY_KOMUNIK' > m2.txt.
  11. Zaszyfruj m2.txt z identycznym kluczem i IV do pliku c2.bin.
  12. W JSLinux uruchom jednolinijkowy skrypt w Pythonie obliczający XOR szyfrogramów: python3 -c "c1=open('c1.bin','rb').read(); c2=open('c2.bin','rb').read(); print(bytes(a^b for a,b in zip(c1,c2)).hex())".
  13. Oblicz w Pythonie XOR tekstów jawnych m1 i m2 i potwierdź identyczność ciągów szesnastkowych. Obowiązkowy wynik negatywny do raportu: nałóż na C1 XOR C2 znane słowo (crib), np. pierwsze 5 liter m1, i pokaż odsłonięty fragment m2 - ten jeden odczyt dowodzi, że przy powtórzonym nonce poufność obu wiadomości pada jednocześnie.
  14. Wykonaj zrzuty ekranu z CyberChef oraz terminala JSLinux.
  15. Sporządź tabelę porównującą tryb CBC i CTR pod kątem paddingu, zrównoleglenia i podatności na powtórzenie IV/Nonce.
  16. Sformułuj wnioski techniczne dotyczące zakazu ponownego użycia pary (Klucz, Nonce) w trybie CTR.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: szyfrogram CTR bez narzutu (len(C)=len(M)), log dowodzący symetrii XOR (szyfrowanie = deszyfrowanie) oraz demo kolizji nonce (ten sam nonce+klucz ujawnia XOR tekstów).
  2. Dołączono 2–3 zrzuty z podpisami: komendy openssl enc -aes-128-ctr, porównanie rozmiarów ls -l oraz test kolizji.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób inkrementacji licznika (dlaczego brak paddingu).
  4. Zapisano wnioski (3–5 zdań): CTR jako keystream, brak padding-oracle, katastrofa reuse nonce.

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 inkrementacja licznika pozwala na generowanie nieograniczonego strumienia klucza z szyfru blokowego.
  • Dlaczego brak dopełnienia w trybie CTR eliminuje narzut pasma i podatności typu Padding Oracle.
  • Dlaczego powtórzenie wartości Nonce przy tym samym kluczu prowadzi do całkowitej kompromitacji poufności transmisji.
  • Student potrafi wykazać symetrię operacji XOR w CTR oraz zaimplementować test kolizji Nonce w środowisku Linux.
Zadanie 4 - ilustracja
05/10
Zadanie 5. Nowoczesne szyfrowanie uwierzytelnione AEAD w trybie AES-GCM z danymi stowarzyszonymi
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL
Podstawa wykładowa: Część 3 - slajdy 21, 25, 26: tryb GCM (Galois/Counter Mode), AEAD (Authenticated Encryption with Associated Data), dane powiązane AAD, tag uwierzytelniający GMAC w ciele GF(2^128).

Cel

Celem zadania jest praktyczne zapoznanie się ze standardem szyfrowania uwierzytelnionego z danymi stowarzyszonymi (AEAD) na przykładzie trybu AES-GCM. Student bada jednoczesne zapewnienie poufności i integralności, generowanie 128-bitowego tagu GMAC, weryfikację nagłówków AAD oraz zachowanie algorytmu w przypadku manipulacji pojedynczym bitem szyfrogramu.

Scenariusz – opis

We współczesnej kryptografii sama poufność jest niewystarczająca; konieczne jest zagwarantowanie autentyczności i nienaruszalności danych. Tryb GCM (Galois/Counter Mode) jest wiodącym standardem AEAD wykorzystywanym w protokołach TLS 1.3, IPsec oraz SSH. GCM łączy szyfrowanie danych tekstu jawnego w trybie CTR z generowaniem tagu uwierzytelniającego w ciele Galois GF(2^128) za pomocą funkcji GHASH. Dodatkowo GCM pozwala na dołączenie danych stowarzyszonych AAD (ang. Additional Authenticated Data), takich jak nagłówki pakietu sieciowego. Dane AAD są chronione przed modyfikacją (są uwierzytelnione), ale nie podlegają szyfrowaniu (pozostają jawne). Do przeprowadzenia eksperymentów wykorzystasz serwis CyberChef oraz narzędzia konsoli OpenSSL w środowisku JSLinux.

Co ma wykonać student / grupa

W serwisie CyberChef konfigurujesz recepturę z operacją AESGCM Encrypt. Wprowadzasz klucz 128-bitowy oraz 96-bitowy wektor początkowy IV, który jest standardem w trybie GCM. W polu danych wpisujesz poufną treść komunikatu, na przykład TAJNA_KWOTA_PRZELEWU = 500000_PLN. W polu Additional Authenticated Data (AAD) wpisujesz jawny nagłówek transakcji: NADAWCA = ALICJA;ODBIORCA = BOB;SESJA = 9871.

Uruchamiasz recepturę i analizujesz wyjście, które zawiera dwie części: zaszyfrowany tekst oraz 16-bajtowy tag uwierzytelniający (Authentication Tag). Kopiujesz wygenerowany szyfrogram i tag do receptury deszyfrującej AES GCM Decrypt z identycznymi parametrami i upewniasz się, że odszyfrowanie przebiega pomyślnie.

Teraz przeprowadzasz symulację ataku naruszenia integralności: modyfikujesz w szyfrogramie dokładnie jeden znak szesnastkowy. Obserwujesz reakcję CyberChef: narzędzie natychmiast zgłasza błąd weryfikacji tagu i odmawia zwrócenia jakiegokolwiek tekstu jawnego. Przywracasz oryginalny szyfrogram, lecz zmieniasz jeden znak w jawnym nagłówku AAD, na przykład z NADAWCA = ALICJA na NADAWCA=MALLORY. Przekonujesz się, że zmiana w niezaszyfrowanych danych AAD również powoduje natychmiastowe odrzucenie wiadomości przez tag GMAC.

Przechodzisz do terminala JSLinux i powtarzasz procedurę z użyciem polecenia opensslenc-aes-128-gcm z parametrami -K, -iv oraz -tag. Rejestrujesz polecenia zapisu i weryfikacji tagu w OpenSSL oraz analizujesz kod błędu zwracany przy niepoprawnym tagu. Porównujesz model bezpieczeństwa AEAD z tradycyjnym podejściem Encrypt-then-MAC. Sporządzasz zestawienie ilustrujące strukturę wejścia i wyjścia w trybie GCM (Klucz, IV, Plaintext, AAD -> Ciphertext, Tag).

Wykonujesz zrzuty ekranu błędów integralności z obu środowisk. Zapisujesz wnioski wyjaśniające, dlaczego GCM chroni systemy przed atakami typu Bit-Flipping i Padding Oracle.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz stronę CyberChef w przeglądarce.
  2. Uruchom emulator JSLinux Alpine.
  3. W CyberChef dodaj operację AES GCM Encrypt.
  4. Wprowadź klucz hex: 00112233445566778899aabbccddeeff.
  5. Wprowadź 96-bitowy IV hex: 102030405060708090a0b0c0.
  6. Wpisz w polu AAD nagłówek: ID=1024;ROLA=ADMIN.
  7. Wpisz w polu Input tekst: TRANSAKCJA_ZATWIERDZONA_1000.
  8. Odczytaj i zanotuj zaszyfrowany ciąg oraz 16-bajtowy Authentication Tag.
  9. Skonfiguruj recepturę AES GCM Decrypt z poprawnymi danymi i potwierdź odzyskanie tekstu.
  10. Zmień ostatnią cyfrę szyfrogramu i zarejestruj komunikat błędu 'Authentication tag mismatch'.
  11. Przywróć szyfrogram, zmień literę w polu AAD i zaobserwuj ten sam błąd integralności.
  12. W JSLinux utwórz plik jawny i zaszyfruj go z tagiem: openssl enc -aes-128-gcm -in jawny.txt -out gcm_szyfr.bin -K 00112233445566778899aabbccddeeff -iv 102030405060708090a0b0c0.
  13. Zbadaj wygenerowany tag w OpenSSL i spróbuj odszyfrować plik ze zmodyfikowaną zawartością.
  14. Ostrzeżenie krytyczne do raportu: nigdy nie używaj ponownie pary (klucz, IV) w GCM - powtórzony nonce w GCM jest groźniejszy niż w CTR, bo oprócz utraty poufności umożliwia odtworzenie klucza funkcji GHASH i fałszowanie tagów dla dowolnych wiadomości (szczegóły ataku: Zadanie 2 z poziomu 4.0 o manipulacji bitowej).
  15. Wykonaj zrzuty ekranu prezentujące odrzucenie sfałszowanej wiadomości w CyberChef i JSLinux.
  16. Sporządź tabelę porównującą tryby ECB, CBC, CTR i GCM pod kątem poufności, integralności i odporności na manipulacje.
  17. Sformułuj wnioski podsumowujące rolę schematów AEAD w nowoczesnych protokołach kryptograficznych.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: szyfrogram AES-GCM z 128-bitowym tagiem, log poprawnej weryfikacji oraz log odrzucenia po zmianie 1 bitu szyfrogramu lub AAD.
  2. Dołączono 2–3 zrzuty z podpisami: szyfrowanie z AAD w OpenSSL/CyberChef oraz dwa deszyfrowania (OK vs błąd tagu).
  3. Opisano w 2–3 zdaniach wybór narzędzi i rolę AAD (uwierzytelnianie bez szyfrowania metadanych).
  4. Zapisano wnioski (3–5 zdań): AEAD zamiast szyfr+MAC na piechotę, tag GMAC jako pieczęć, integralność metadanych.

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 schemat AEAD eliminuje potrzebę ręcznego łączenia szyfru blokowego z odrębną funkcją MAC.
  • Rola danych stowarzyszonych AAD w uwierzytelnianiu metadanych protokołów sieciowych bez ich utajniania.
  • Dlaczego jakakolwiek próba manipulacji bitem w szyfrogramie lub AAD unieważnia 128-bitowy tag GMAC.
  • Student potrafi skonfigurować i przetestować szyfrowanie uwierzytelnione AES-GCM oraz wykazać mechanizm ochrony integralności.
Zadanie 5 - ilustracja
06/10
Zadanie 6. Szyfr strumieniowy RC4 – badanie działania generatora PRGA i wycofanie z TLS
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + Cryptii + OpenSSL + Python 3
Podstawa wykładowa: Część 3 - slajdy 27, 28, 29: szyfry strumieniowe, algorytm RC4, permutacji tablicy S (256 bajtów), KSA (Key Scheduling Algorithm), PRGA (Pseudo-Random Generation Algorithm), podatności wczesnych bajtów, RFC 7465.

Cel

Celem zadania jest przeanalizowanie budowy i działania klasycznego szyfru strumieniowego RC4 (Rivest Cipher 4). Student bada fazę inicjalizacji tablicy S (KSA), fazę generowania strumienia (PRGA), operację bitowego XOR oraz zapoznaje się z powodami definitywnego wycofania RC4 z nowoczesnych protokołów (m.in. zakaz w RFC 7465) ze względu na obciążenia statystyczne pierwszych bajtów.

Scenariusz – opis

Szyfr RC4, opracowany w 1987 roku przez Rona Rivesta, był przez dekady najpopularniejszym szyfrem strumieniowym na świecie. Wykorzystywano go w standardzie zabezpieczeń sieci bezprzewodowych WEP, protokole WPA oraz we wczesnych wersjach protokołu SSL/TLS. Serce algorytmu stanowi wewnętrzny stan pamięci reprezentowany przez 256-bajtową tablicę permutacji S oraz dwa wskaźniki i oraz j. Algorytm składa się z dwóch faz: KSA (Key Scheduling Algorithm) mieszającego stan za pomocą klucza oraz PRGA generującego kolejne bajty pseudolosowe. Kolejne wygenerowane bajty strumienia są bezpośrednio łączone z tekstem jawnym za pomocą operacji bitowej XOR. W tym zadaniu sprawdzisz działanie RC4 w serwisach CyberChef i Cryptii oraz przeanalizujesz przyczyny jego podatności.

Co ma wykonać student / grupa

Otwierasz w przeglądarce serwis CyberChef oraz narzędzie Cryptii pod adresem cryptii.com. W CyberChef konfigurujesz operację RC4 z kluczem w postaci tekstu jawnego lub ciągu szesnastkowego, na przykład HASLO_LAB3. Wprowadzasz wiadomość testową liczącą 50 znaków i rejestrujesz otrzymany ciąg szesnastkowy.

Następnie usuwasz tekst jawny i konfigurujesz sam generator strumienia: szyfrujesz ciąg złożony z samych bajtów zerowych 0x00. Zauważasz, że szyfrowanie samych zer daje dokładnie surowy strumień keystream wygenerowany przez algorytm PRGA, ponieważ 0 XOR K = K. Analizujesz pierwsze kilka bajtów strumienia i konfrontujesz je z literaturą opisującą tzw. obciążenie drugiego bajtu (ang. second-byte bias). W literaturze kryptograficznej wykazano, że prawdopodobieństwo pojawienia się wartości 0x00 na drugim bajcie strumienia wynosi 1/128 zamiast 1/256. Sprawdzasz, w jaki sposób podatność ta oraz korelacje klucza z wektorem IV umożliwiły błyskawiczne łamanie kluczy w protokole WEP (narzędzie Aircrack-ng). Przechodzisz do terminala JSLinux i uruchamiasz szyfrowanie RC4 za pomocą polecenia opensslenc -rc4 z podanym kluczem.

Weryfikujesz, czy OpenSSL generuje identyczny szyfrogram jak serwis CyberChef. Zauważasz ostrzeżenia systemowe lub konieczność jawnego włączenia przestarzałych algorytmów w nowszych wersjach OpenSSL. Badanie kończysz lekturą zaleceń dokumentu RFC 7465'Prohibiting RC4 Cipher Suites' zakazującego stosowania RC4 w TLS. Sporządzasz schemat blokowy przedstawiający algorytm KSA oraz pętlę PRGA.

Wykonujesz zrzuty ekranu z serwisów CyberChef i Cryptii oraz terminala JSLinux. Porównujesz właściwości RC4 z nowoczesnymi szyframi blokowymi pracującymi w trybie CTR. Formułujesz wyczerpujące podsumowanie przyczyn upadku algorytmu RC4.

Przykładowe kroki do wykonania jako sugestia

  1. Wejdź na stronę CyberChef (gchq.github.io/CyberChef).
  2. Otwórz stronę Cryptii (cryptii.com) i terminal JSLinux Alpine.
  3. W CyberChef dodaj operację RC4 z kluczem tekstowym 'SekretnyKlucz2026'.
  4. Wprowadź tekst jawny: 'To jest poufny komunikat badawczy w laboratorium kryptologii'.
  5. Zanotuj wygenerowany szyfrogram w formacie Hex.
  6. W Cryptii wybierz szyfr RC4, wprowadź ten sam klucz i tekst, i zweryfikuj zgodność wyniku.
  7. W CyberChef wprowadź ciąg 32 bajtów zerowych (0x00) i odczytaj pierwsze 32 bajty strumienia keystream.
  8. W JSLinux utwórz plik testowy: echo -n 'PoufnyKomunikat' > rc4_in.txt.
  9. Zaszyfruj plik w JSLinux: openssl enc -rc4 -in rc4_in.txt -out rc4_out.bin -k 'SekretnyKlucz2026' -nosalt.
  10. Wyświetl zawartość szesnastkową pliku rc4_out.bin: hexdump -C rc4_out.bin.
  11. Odszyfruj plik i potwierdź integralność odzyskanych danych.
  12. Zbadaj dokumentację RFC 7465 dotyczącą zakazu stosowania RC4 w TLS ze względu na ataki Bar Mitzvah i Fluhrera.
  13. Sporządz tabelę porównawczą stanów wewnętrznych RC4 (256 bajtów) i AES (16 bajtów).
  14. Wykonaj zrzuty ekranu konfiguracji w CyberChef oraz wyniku w JSLinux.
  15. Zapisz otrzymane ciągi keystream i przeanalizuj ich pseudolosowość.
  16. Zmierz obciążenie drugiego bajtu liczbą, nie deklaracją: wklej do JSLinux skrypt rc4_bias.py (def rc4(key,n): S=list(range(256)); j=0; [KSA: for i in range(256): j=(j+S[i]+key[i%len(key)])%256; S[i],S[ j]=S[ j],S[ i]]; [PRGA] i=j=0; out=[]; [pętla n razy:] i=(i+1)%256; j=(j+S[i])%256; S[i],S[ j]=S[ j],S[ i]; out.append(S[(S[ i]+S[j])%256]); return bytes(out)) i dla N = 20000 losowych 16-bajtowych kluczy policz, ile razy drugi bajt strumienia wynosi 0x00. Wynik ma oscylować wokół 2/256 (≈156/20000) zamiast 1/256 (≈78/20000) - to jest mierzalny powód wycofania RC4, wpisz obie liczby do raportu.
  17. Sformułuj wnioski wyjaśniające, dlaczego brak odporności na ataki korelacyjne zdyskwalifikował RC4.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: strumień RC4 (KSA+PRGA) dla zadanego klucza, szyfrogram XOR oraz log zgodności OpenSSL vs CyberChef.
  2. Dołączono 2–3 zrzuty z podpisami: inicjalizacja tablicy S, generowanie PRGA oraz szyfrowanie demonstracyjne.
  3. Opisano w 2–3 zdaniach wybór narzędzi i przyczyny wycofania RC4 (słabe klucze, korelacje, RFC 7465, upadek WEP).
  4. Zapisano wnioski (3–5 zdań): prostota S-box 256 / mod 256, tożsamość z XOR, wady KSA.

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 prosta tablica permutacji S i dodawanie modulo 256 tworzyły wydajny generator strumieniowy.
  • Dlaczego operacja szyfrowania strumieniowego jest tożsama z sumowaniem XOR tekstu z bajtami wyjściowymi PRGA.
  • Jakie wady fazy KSA (słabe klucze, korelacja pierwszych bajtów) doprowadziły do złamania WEP i wycofania z TLS (RFC 7465).
  • Student potrafi wygenerować strumień klucza RC4, porównać implementacje i uzasadnić historyczny upadek tego algorytmu.
Zadanie 6 - ilustracja
07/10
Zadanie 7. Nowoczesny szyfr strumieniowy ChaCha20 i konstrukcja AEAD ChaCha20-Poly1305
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL
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

  1. Otwórz serwis CyberChef w przeglądarce.
  2. Uruchom konsolę JSLinux Alpine z biblioteką OpenSSL.
  3. W CyberChef dodaj operację ChaCha z 20 rundami.
  4. Wprowadź 32-bajtowy klucz hex: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f.
  5. Wprowadź 12-bajtowy Nonce hex: 000000000000004a00000000.
  6. Wprowadź tekst jawny i zbadaj długość szyfrogramu.
  7. Zmień recepturę na ChaCha20-Poly1305 i zaobserwuj wygenerowanie 128-bitowego tagu Poly1305.
  8. W JSLinux utwórz plik wejściowy: echo -n 'Test_ChaCha20_Poly1305' > test_cc.txt.
  9. Zaszyfruj plik czystym ChaCha20: openssl enc -chacha20 -in test_cc.txt -out test_cc.enc -K 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -iv 000000000000004a00000000.
  10. Sprawdź rozmiar pliku wyjściowego i porównaj z rozmiarem pliku wejściowego.
  11. Odszyfruj plik poleceniem openssl enc -d -chacha20 i potwierdź zgodność.
  12. Zaszyfruj plik za pomocą ChaCha20-Poly1305 i zbadaj procedurę generowania tagu.
  13. 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.
  14. Zarejestruj błąd autoryzacji zgłoszony przez silnik kryptograficzny.
  15. Wykonaj zrzuty ekranu z CyberChef oraz terminala JSLinux.
  16. Sporządź raport techniczny opisujący architekturę ARX i uzasadniający popularność ChaCha20 w TLS 1.3 i VPN WireGuard.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: szyfrogram ChaCha20 oraz paczka ChaCha20-Poly1305 z tagiem, log poprawnej weryfikacji i odrzucenia po manipulacji.
  2. Dołączono 2–3 zrzuty z podpisami: komendy openssl enc -chacha20, podgląd macierzy stanu / stałej expand 32-byte k oraz test tagu.
  3. Opisano w 2–3 zdaniach wybór narzędzi i przewagę ARX (brak S-box, odporność czasowa).
  4. 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.
Zadanie 7 - ilustracja
08/10
Zadanie 8. Badanie właściwości funkcji skrótu i pomiar efektu lawinowego dla SHA-256
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + Python 3
Podstawa wykładowa: Część 3 - slajdy 35, 36, 41: funkcje skrótu, trzy filary bezpieczeństwa (preimage, second preimage, collision resistance), rodzina SHA-2, SHA-256, efekt lawinowy (Avalanche Effect).

Cel

Celem zadania jest empiryczne zbadanie kluczowych właściwości kryptograficznych funkcji skrótu na przykładzie algorytmu SHA-256. Student bada determinizm, jednokierunkowość oraz przeprowadza ilościowy pomiar efektu lawinowego (Avalanche Effect), zliczając liczbę zmienionych bitów skrótu przy modyfikacji pojedynczego bitu danych wejściowych.

Scenariusz – opis

Kryptograficzna funkcja skrótu przekształca dowolny ciąg danych o zmiennej długości w unikalny skrót o stałym rozmiarze. W przypadku algorytmu SHA-256 (Secure Hash Algorithm 256-bit) wyjście ma zawsze dokładnie 256 bitów, czyli 32 bajty (64 znaki szesnastkowe). Bezpieczna funkcja skrótu musi spełniać trzy postulaty: odporność na przeciwobraz, odporność na drugi przeciwobraz oraz odporność na kolizje. Fundamentalną cechą dobrej funkcji skrótu jest efekt lawinowy (ang. Avalanche Effect). Efekt lawinowy oznacza, że nawet najmniejsza możliwa zmiana danych wejściowych (odwrócenie pojedynczego bitu) powinna skutkować drastyczną zmianą skrótu. W idealnym przypadku losowej zmiany powinno ulec około 50% wszystkich bitów wyjściowych (czyli około 128 bitów w SHA-256).

Co ma wykonać student / grupa

W pierwszej części ćwiczenia korzystasz z serwisu CyberChef oraz terminala JSLinux. W CyberChef przygotowujesz komunikat tekstowy o długości kilkunastu słów i dodajesz operację SHA2 z rozmiarem 256 bitów. Odczytujesz wygenerowany skrót szesnastkowy i zapisujesz go w notatkach. Zmieniasz w tekście wejściowym dokładnie jeden znak, na przykład zamieniasz małą literę 'a' na wielką 'A', co odpowiada zmianie jednego bitu w kodzie ASCII. Obserwujesz powstały skrót SHA-256 i wizualnie stwierdzasz, że nie wykazuje on żadnego podobieństwa do poprzedniego skrótu.

Teraz przechodzisz do ilościowego pomiaru efektu lawinowego w terminalu JSLinux. Tworzysz dwa pliki tekstowe rozszerzające się o dokładnie jeden bit: plik plik1.txt o zawartości 'Ala ma kota.' oraz plik2.txt o zawartości 'Ala ma kota?'. Generujesz ich skróty za pomocą standardowego uniksowego polecenia sha256sumplik1.txtplik2.txt.

W konsoli JSLinux piszesz jednolinijkowy skrypt w powłoce lub w Pythonie, który pobiera oba skróty, przekształca je na ciągi binarne i zlicza liczbę różnych pozycji (odległość Hamminga). Sprawdzasz, ile dokładnie bitów różni oba 256-bitowe skróty i obliczasz procentową wartość efektu lawinowego. Powtarzasz pomiar dla 5 różnych par wejściowych różniących się pojedynczym bitem i wyliczasz średnią arytmetyczną. Porównujesz uzyskany wynik z teoretyczną wartością 50% (128 bitów) i analizujesz odchylenie standardowe. Następnie w CyberChef testujesz funkcję z pustym ciągiem wejściowym i badasz, jaki skrót generuje SHA-256 dla pliku o rozmiarze 0 bajtów (znany skrót e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855). Sporządzasz tabelę pomiarów odległości Hamminga dla badanych par tekstów.

Wykonujesz zrzuty ekranu z CyberChef i konsoli JSLinux. Formułujesz wnioski dotyczące znaczenia efektu lawinowego dla odporności na ataki analityczne i kolizyjne.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz CyberChef w przeglądarce internetowej.
  2. Uruchom emulator JSLinux Alpine.
  3. W CyberChef dodaj operację SHA2 z rozmiarem 256 bitów.
  4. Wpisz tekst 'BezpieczenstwoSystemowIT2026' i zanotuj 64-znakowy hash hex.
  5. Zmień ostatnią cyfrę z 6 na 7 i zanotuj nowy hash hex.
  6. W CyberChef zbadaj hash pustego wejścia i sprawdź zgodność ze standardem NIST.
  7. W JSLinux utwórz dwa pliki z różnicą 1 bitu: echo -n 'Test1' > f1.txt; echo -n 'Test0' > f2.txt.
  8. Wygeneruj skróty SHA-256: sha256sum f1.txt f2.txt.
  9. Napisz w JSLinux skrypt Pythona obliczający odległość Hamminga między hashami obu plików.
  10. Uruchom skrypt: python3 -c "import hashlib; h1=hashlib.sha256(b'Test1').digest(); h2=hashlib.sha256(b'Test0').digest(); diff=sum(bin(b1^b2).count('1') for b1,b2 in zip(h1,h2)); print(f'Roznice bitowe: {diff}/256 ({diff/256*100:.2f}%)')".
  11. Zanotuj liczbę zmienionych bitów oraz wartość procentową.
  12. Przeprowadź 4 dodatkowe próby z różnymi danymi wejściowymi o różnicy 1 bitu.
  13. Pokaż skalę jednokierunkowości: znajdź drugi przeciwobraz dla skrótu obciętego do 16 bitów (brute force w Pythonie po hashlib znajduje go w ułamku sekundy), a obok wylicz, ile czasu zajęłoby to samo dla pełnych 256 bitów przy 10^9 hashy/s (2^256/10^9 s, czyli około 10^60 lat wobec 10^10 lat wieku wszechświata). Obie liczby - sekundy i 10^60 lat - trafiają do raportu jako dowód, że „odwracalny w teorii" nie znaczy „odwracalny w praktyce".
  14. Oblicz średnią liczbę zmienionych bitów dla wszystkich 5 prób.
  15. Zestaw wyniki w tabeli z kolumnami: Próba, Tekst 1, Tekst 2, Odległość Hamminga, Udział procentowy.
  16. Wykonaj zrzuty ekranu konsoli JSLinux z wykonanym skryptem pomiarowym.
  17. Sformułuj wnioski potwierdzające spełnienie ścisłego kryterium lawinowego (SAC).

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: skróty SHA-256 dwóch tekstów różniących się 1 bitem oraz zmierzona odległość Hamminga (~128 bitów, ~50%) z logiem obliczeń.
  2. Dołączono 2–3 zrzuty z podpisami: komendy sha256sum/openssl dgst oraz skrypt liczący bity (Python/tr).
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób liczenia odległości Hamminga.
  4. Zapisano wnioski (3–5 zdań): determinizm, jednokierunkowość, lawina jako warunek bezpieczeństwa.

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:

  • Dlaczego bezpieczna funkcja skrótu musi charakteryzować się pseudolosowością rozkładu bitów wyjściowych.
  • W jaki sposób zmiana pojedynczego bitu wejścia propaguje się na około 50% bitów wyjścia (odległość Hamminga bliska 128 bitów).
  • Znaczenie determinizmu funkcji skrótu przy weryfikacji integralności danych i oprogramowania.
  • Student potrafi zautomatyzować pomiar odległości Hamminga w Pythonie i ilościowo ocenić jakość efektu lawinowego.
Zadanie 8 - ilustracja
09/10
Zadanie 9. Uwierzytelnianie integralności i pochodzenia wiadomości kodem HMAC-SHA256
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL + Python 3 + jwt.io
Podstawa wykładowa: Część 3 - slajdy 44, 45: kody uwierzytelniania wiadomości HMAC, standard RFC 2104, konstrukcja dwuetapowa z padami ipad (0x36) i opad (0x5c), odporność na atak Length Extension.

Cel

Celem zadania jest praktyczne zrozumienie konstrukcji kodu uwierzytelniania wiadomości opartego na funkcji skrótu (HMAC). Student bada, dlaczego prosty skrót H(Klucz || Wiadomość) jest podatny na atak dołączenia długości, jak dwuetapowa konstrukcja HMAC z dopełnieniami ipad i opad rozwiązuje ten problem oraz weryfikuje generowanie HMAC-SHA256 w CyberChef i konsoli OpenSSL.

Scenariusz – opis

Sama funkcja skrótu gwarantuje wykrycie przypadkowych błędów transmisji, lecz nie chroni przed aktywnym adwersarzem, który może podmienić zarówno treść, jak i jej skrót. Aby zapewnić autentyczność pochodzenia i nienaruszalność wiadomości, stosuje się kody MAC (Message Authentication Code) wykorzystujące tajny klucz współdzielony. Naiwna próba skonstruowania kodu MAC poprzez sklejenie klucza z wiadomością Hash(K || M) okazała się krytycznie podatna na ataki typu Length Extension Attack. W 1996 roku Bellare, Canetti i Krawczyk zaproponowali konstrukcję HMAC, ustandaryzowaną w dokumencie RFC 2104. HMAC stosuje bezpieczną dwuprzebiegową procedurę: HMAC(K, M) = H((K XOR opad) || H((K XOR ipad) || M)), gdzie ipad to powtórzony bajt 0x36, a opad to 0x5c. W tym laboratorium zbadasz działanie HMAC-SHA256 oraz sprawdzisz jego odporność na manipulacje danymi.

Co ma wykonać student / grupa

W serwisie CyberChef konfigurujesz recepturę z operacją HMAC, wybierając funkcję skrótu SHA256. Wprowadzasz klucz tajny, na przykład KluczWspoldzielonyLaboratorium2026, oraz treść komunikatu bankowego. Odczytujesz wygenerowany kod HMAC o długości 256 bitów (64 znaki szesnastkowe). Modyfikujesz w tekście wiadomość, zmieniając numer rachunku docelowego, i obserwujesz całkowitą zmianę kodu HMAC. Zauważasz, że bez znajomości klucza tajnego potencjalny napastnik nie jest w stanie wygenerować poprawnego kodu dla zmienionej treści.

Teraz w CyberChef dekonstruujesz mechanizm HMAC na poszczególne operacje elementarne. Tworzysz klucz o długości 64 bajtów (rozmiar bloku SHA-256), wykonujesz operację XOR z ciągiem bajtów 0x36 (ipad), doklejasz wiadomość i obliczasz wewnętrzny skrót SHA-256.

Następnie wykonujesz XOR klucza z ciągiem bajtów 0x5c (opad), doklejasz uzyskany wcześniej skrót wewnętrzny i obliczasz ostateczny skrót SHA-256. Porównujesz wynik otrzymany z ręcznej dekompozycji z wynikiem gotowej operacji HMAC w CyberChef i potwierdzasz ich absolutną tożsamość.

Przechodzisz do konsoli JSLinux i powtarzasz generowanie kodu HMAC za pomocą narzędzia openssl dgst. Wpisujesz polecenie openssl dgst -sha256 -hmac 'TwojKlucz'plik.txt. Weryfikujesz zgodność otrzymanego hasha z wynikiem z CyberChef. Symulujesz procedurę weryfikacji podpisu po stronie odbiorcy: porównujesz wyliczony HMAC z kodem przesłanym w nagłówku. Sporządzasz zestawienie tabelaryczne różnic pomiędzy zwykłym hashem (SHA-256), podpisem cyfrowym (asymetrycznym) a kodem HMAC.

Wykonujesz zrzuty ekranu prezentujące dekompozycję ipad/opad oraz polecenia OpenSSL. Zapisujesz wnioski podsumowujące rolę HMAC w protokołach takich jak IPsec, TLS i tokenach JWT.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz CyberChef w przeglądarce internetowej.
  2. Uruchom maszynę wirtualną JSLinux Alpine.
  3. W CyberChef dodaj operację HMAC z funkcją skrótu SHA256.
  4. Wprowadź klucz tajny: 'SuperTajneHasloHMAC789' i tekst: 'PRZELEW: 1000 PLN NA KONTO 1234'.
  5. Zanotuj wyjściowy 64-znakowy kod HMAC w formacie Hex.
  6. Zmień kwotę na 9000 PLN i zaobserwuj wygenerowanie zupełnie nowego kodu.
  7. Zbuduj w CyberChef ręczny schemat HMAC: utwórz blok klucza (64B), połącz z ipad (XOR 0x36), doklej tekst i policz SHA256.
  8. Policz drugi etap: blok klucza z opad (XOR 0x5c), doklej wynik pierwszego etapu i policz końcowy SHA256.
  9. Porównaj wyjście ręcznego potoku z operacją wbudowaną HMAC i potwierdź zgodność co do bita.
  10. W JSLinux utwórz plik z wiadomością: echo -n 'PRZELEW: 1000 PLN NA KONTO 1234' > msg.txt.
  11. Wygeneruj kod HMAC w JSLinux: openssl dgst -sha256 -hmac 'SuperTajneHasloHMAC789' msg.txt.
  12. Porównaj wyjście z konsoli JSLinux z kodem z CyberChef.
  13. Demonstracja, dlaczego HMAC istnieje: w Pythonie zaimplementuj naiwny tag T = SHA256(K || M) dla krótkiego K, dopisz do M własny sufiks z poprawnym dopełnieniem Merkle-Damgårda (własna funkcja md_pad, wzór z Zadania 7 poziomu 4.0) i pokaż, że sfałszowany tag przechodzi weryfikację naiwną; ten sam sufiks doklejony do komunikatu z HMAC weryfikacji nie przechodzi. Oba wyniki (fałszerstwo działa / fałszerstwo odrzucone) dokumentujesz zrzutami.
  14. Zmień zawartość pliku msg.txt i zaobserwuj zmianę wygenerowanego kodu.
  15. Wykonaj zrzuty ekranu z ręcznej konstrukcji HMAC w CyberChef oraz polecenia openssl dgst.
  16. Sporządź tabelę porównującą funkcje skrótu, kody MAC oraz podpisy cyfrowe.
  17. Sformułuj wnioski techniczne wyjaśniające, w jaki sposób zagnieżdżenie H(K xor opad || H(...)) blokuje ataki dołączenia długości.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: kod HMAC-SHA256 wygenerowany w OpenSSL i odtworzony ręcznie w CyberChef (ipad/opad), plus log odrzucenia po zmianie 1 bitu wiadomości.
  2. Dołączono 2–3 zrzuty z podpisami: rekonstrukcja kroków HMAC oraz weryfikacja zgodności obu narzędzi.
  3. Opisano w 2–3 zdaniach wybór narzędzi i dlaczego prosty Hash(klucz||msg) jest groźny (length extension).
  4. Zapisano wnioski (3–5 zdań): rola ipad/opad, HMAC vs podpis asymetryczny, obrona przed fałszerstwem.

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:

  • Dlaczego prosty skrót kryptograficzny bez klucza nie zabezpiecza przed celową modyfikacją treści przez aktywnego intruza.
  • W jaki sposób wewnętrzne i zewnętrzne dopełnienie (ipad i opad) chroni konstrukcję HMAC przed atakiem Length Extension Attack.
  • Różnica w zastosowaniach pomiędzy symetrycznym kodem HMAC a asymetrycznym podpisem cyfrowym.
  • Student potrafi ręcznie zrekonstruować algorytm HMAC w CyberChef oraz wygenerować kody uwierzytelniające w konsoli OpenSSL.
Zadanie 9 - ilustracja
10/10
Zadanie 10. Bezpieczne haszowanie haseł – podatność prostego SHA-256 a rola soli i KDF PBKDF2
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + OpenSSL
Podstawa wykładowa: Część 3 - slajdy 46, 47, 48: przechowywanie haseł, ataki słownikowe i tablice tęczowe, rola soli (salt), funkcje rozciągania klucza (KDF), standard PBKDF2, spowalnianie obliczeń.

Cel

Celem zadania jest praktyczne wykazanie, dlaczego szybkie funkcje skrótu (takie jak MD5 czy SHA-256) są niebezpieczne w zastosowaniu do ochrony haseł. Student bada mechanizm ataków słownikowych i tablic tęczowych, rolę unikalnej soli w unieważnianiu prekomputacji oraz testuje działanie funkcji derywacji klucza PBKDF2 z regulowaną liczbą iteracji w konsoli Linux i CyberChef.

Scenariusz – opis

Powszechnym błędem początkujących programistów jest przechowywanie haseł użytkowników w postaci czystego skrótu SHA-256(hasło). Funkcje skrótu z rodziny SHA zostały zaprojektowane z myślą o maksymalnej szybkości przetwarzania dużych wolumenów danych. Współczesna karta graficzna może przeliczać dziesiątki miliardów skrótów SHA-256 na sekundę, co czyni ataki siłowe i słownikowe trywialnymi. Ponadto identyczne hasła użytkowników dają identyczne skróty, co umożliwia stosowanie tablic tęczowych (ang. rainbow tables). Rozwiązaniem pierwszego problemu jest dodanie kryptograficznej soli (losowego ciągu dopisywanego do hasła przed haszowaniem). Rozwiązaniem drugiego problemu są wyspecjalizowane, celowo spowolnione funkcje wyprowadzania klucza (KDF), takie jak PBKDF2, bcrypt czy Argon2.

Co ma wykonać student / grupa

Rozpoczynasz ćwiczenie od zasymulowania wycieku bazy danych z haszami w serwisie CyberChef. Wprowadzasz popularne hasło, na przykład 'krakow2026', i generujesz jego skrót SHA-256. Wyszukujesz uzyskany skrót w darmowych wyszukiwarkach odwrotnych skrótów online (np. crackstation.net) i obserwujesz natychmiastowe odzyskanie hasła w ułamku sekundy.

W kolejnym kroku dodajesz do hasła losową 16-bajtową sól: 'krakow2026_s0l#98aF2!'. Sprawdzasz nowy skrót w bazie i potwierdzasz, że prekomputowane tablice tęczowe stają się bezużyteczne wobec unikalnej soli.

Następnie przechodzisz do badania funkcji PBKDF2 (Password-Based Key Derivation Function 2) zgodnej z RFC 2898. W CyberChef dodajesz operację Derive PBKDF2 Key, ustawiając funkcję bazową na SHA256, definiując sól oraz kluczową zmienną: liczbę iteracji. Ustawiasz liczbę iteracji na 1000, 10 000 oraz 100 000, obserwując czas potrzebny przeglądarce na wyliczenie klucza.

Przechodzisz do terminala JSLinux, aby zrealizować to samo zadanie za pomocą narzędzia openssl kdf lub opensslenc -pbkdf2. Tworzysz testowy plik tekstowy i szyfrujesz go poleceniem opensslenc -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:MojeTrudneHaslo123. Odszyfrowujesz plik poleceniem z parametrem -pbkdf2 -iter 10000 i weryfikujesz poprawność procedury. Badanie rozszerzasz o pomiar czasu wykonania polecenia openssl przy różnych wartościach parametru -iter (od 1 000 do 500 000 iteracji) za pomocą uniksowego polecenia time.

Sporządzasz wykres lub tabelę zależności czasu wykonania od liczby iteracji w środowisku JSLinux. Analizujesz, jak wzrost liczby iteracji spowalnia atakującego posiadającego farmę GPU, minimalnie wpływając na komfort pojedynczego logowania użytkownika.

Wykonujesz zrzuty ekranu z serwisu CyberChef oraz terminala JSLinux. Przygotowujesz zestawienie zaleceń OWASP i NIST dotyczących bezpiecznego przechowywania poświadczeń tożsamości.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz serwis CyberChef w oknie przeglądarki.
  2. Uruchom emulator JSLinux Alpine.
  3. W CyberChef wprowadź słabe hasło tekstowe (np. 'student123') i oblicz jego skrót SHA-256.
  4. Sprawdź uzyskany hash w darmowej bazie rainbow tables (np. crackstation.net) i odnotuj natychmiastowe złamanie.
  5. Dodaj do hasła losową 16-znakową sól i zaobserwuj zmianę hasha na nieobecny w bazie.
  6. W CyberChef dodaj operację Derive PBKDF2 Key z funkcją skrótu SHA256.
  7. Ustaw sól szesnastkową i przetestuj generowanie klucza dla liczby iteracji równej 1000, 10000 oraz 100000.
  8. W JSLinux utwórz plik testowy: echo 'Dane weryfikacyjne konta' > konto.txt.
  9. Zaszyfruj plik z użyciem PBKDF2: openssl enc -aes-256-cbc -pbkdf2 -iter 10000 -in konto.txt -out konto.enc -pass pass:student123 -p.
  10. Zwróć uwagę na wypisane przez OpenSSL wartości Salt, Key i IV wygenerowane przez PBKDF2.
  11. Zmierz czas wykonania deszyfrowania dla 10 000 iteracji: time openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -in konto.enc -out /dev/null -pass pass:student123.
  12. Powtórz pomiar czasu dla 100 000 oraz 300 000 iteracji, rejestrując czas w sekundach.
  13. Odszyfruj plik z błędnym hasłem i zarejestruj reakcję OpenSSL.
  14. Wykonaj zrzuty ekranu prezentujące operację PBKDF2 w CyberChef oraz pomiary czasu w JSLinux.
  15. Sporządź tabelę zestawiającą liczbę iteracji, czas operacji oraz szacowany koszt ataku brute force na 1 milion haseł.
  16. Sformułuj wnioski techniczne opierając się na wytycznych OWASP Password Storage Cheat Sheet. Obowiązkowe liczby: aktualne zalecenie OWASP dla PBKDF2-HMAC-SHA-256 to 600 000 iteracji - przelicz koszt złamania słownikowego 8-znakowego hasła dla 1 iteracji i dla 600 000 iteracji przy 10^9 hashy/s atakującego. Dopisz zastrzeżenie, że PBKDF2 spowalnia atak tylko liniowo (bez kosztu pamięci), więc pełną odpowiedź dają KDF-y pamięciochłonne (scrypt, Argon2id - Zadanie 10 z poziomu 5.0).

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: baza z hashami SHA-256 z solą vs PBKDF2 (z widoczną liczbą iteracji), log czasu łamania słownikowego oraz format /etc/shadow.
  2. Dołączono 2–3 zrzuty z podpisami: generowanie soli, openssl passwd / CyberChef PBKDF2 oraz pomiar czasu (time).
  3. Opisano w 2–3 zdaniach wybór narzędzi i dobór parametru kosztu (work factor).
  4. Zapisano wnioski (3–5 zdań): szybkość SHA-256 jako wada, sól vs tęczowe tablice, iteracje jako wyrównanie szans z GPU.

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:

  • Dlaczego wysoka wydajność prostych funkcji skrótu (SHA-256) stanowi krytyczne zagrożenie przy przechowywaniu haseł.
  • Jak unikalna sól dla każdego konta zapobiega atakom z użyciem prekomputowanych tablic tęczowych.
  • Rola parametru iteracji (work factor) w PBKDF2 jako mechanizmu wyrównującego szanse obrońcy w starciu z akceleratorami sprzętowymi.
  • Student potrafi poprawnie zastosować mechanizm PBKDF2 w OpenSSL oraz CyberChef i zinterpretować wyniki pomiaru czasu.
Zadanie 10 - ilustracja
Podgląd