Znajdziesz tutaj omówienie algorytmów kryptologicznych, które stanowią fundamenty zabezpieczeń.
Zapoznanie się z historycznymi algorytmami kryptograficznych (m.in. szyfrem Cezara, szyfrem strumieniowym RC4) i słabościami związanymi z ich stosowaniem. Zostanie wykorzystany język skryptowy Python umożliwiający szybkie rozwiązanie nawet skomplikowanego problemu. Ten etap to wprowadzanie do tematyki trybów pracy szyfrów blokowych, a także ataków brutalnej siły.
Informacja o zadań składających się z projektu.
Przed uruchomieniem zainstaluj biblioteki:
pip3 install pycrypto
- 1. Za pomocą analizy statystycznej postaraj się odszyfrować tekst zaszyfrowany algorytmem przesunięcia cyklicznego o nieznanym kluczu (crypto.rot). Szyfrowane zostały wszystkie znaki o kodach z przedziału 0-255. POMINIĘTO znak spacji.
(ord(c) + k) % 256 if c != ' '
frequency taken from http://en.wikipedia.org/wiki/Letter_frequency Kode_1 - 2. Porównaj rozkłady statystyczne tekstów w dwóch różnych językach. Należy wypisać co najmniej słownik z liczbą wystąpień każdego znaku tekstu. Kode_2
- 3. Szyforwanie oraz deszyfrowanie alogorytmem Cezara. Kode_3
- 4. Procent wystąpienia znaku w tekscie. Kode_4
- 5. Napisz program przeprowadzający atak brutalnej siły na kryptogram crypto.rc4. Został on zaszyfrowany trzyznakowym kluczem
3x ['a'-'z']
Kode_5
- Hasła dla Google: Cezar, ROT13, Vigenere, RC4, entropy
Zapoznanie z blokowymi algorytmami szyfrowania symetrycznego oraz metodami przekształcania hasła na dobry klucz kryptograficzny.
Informacja o zadań składających się z projektu.
- 1. Napisz algorytm obliczający entropię. Kode_1
- 2. Porównaj entropie tekstu naturalnego z entropia kryptogramu. Kode_2
- 3. Porównaj wynik szyfrowania w trybach ECB i CBC. Jaka jest entropia kryptogramów? Kode_3
- 4. Zaproponuj algorytm tworzenia klucza na podstawie hasła podawanego przez człowieka. Kode_4
- 5. Określ ile znaków
[a-z]
należy podać, żeby entropia hasła zbliżyła się do 256-bitowego klucza AES. Kode_5 - 6. Napisz program do ataku brutalnej siły na kryptogram przy wykorzystaniu entropii jako uniwersalnego kryterium zakończenia algorytmu. Kode_6
- 7. Atak brutalnej siły na hasło użyte do zaszyfrowania danych obrazu we800_CBC_encrypted.bmp.
Wiadomo, że hasło składa się z trzech liter
[a-z]
i że zostało przekształcone w klucz za pomocą funkcjiPBKDF2
z solą"abc"
. Dane obrazka (bez nagłówka!) zostały zaszyfrowane za pomocą algorytmu AES w trybie CBC zIV="a"*16
. Znajdź hasło, używając entropii jako kryterium poprawności odszyfrowania wiadomości.Kode_7
- Hasła dla Google: DES, AES, key derivation, entropy
Zapoznanie z algorytmów kryptograficznych funkcji jednokierunkowych (hash) do ochrony bazy haseł. Poznanie zasad ataku systematycznego przeszukiwania (brute-force) na hasła.
Informacja o zadań składających się z projektu.
- 1. Napisz program korzystający z bazy wygenerowanej przez program htpasswd. Celem programu jest sprawdzenie, czy użytkownik o podanym identyfikatorze i haśle jest w pliku bazy. Kode_1
- 2.Napisz program umożliwiający zmianę hasła użytkownika w bazie programu htpasswd. Kode_2
- 3. Napisz program umożliwiający dodawanie nowych użytkowników do bazy programu htpasswd. Kode_3
- 4. Przy pomocy wywołania bibliotecznej funkcji md5() odtwórz działanie programu md5sum. Kode_4
- 5. Przy pomocy wywołania bibliotecznej funkcji md5() odtwórz działanie polecenia md5sum -c, czyli kontrole spójności plików. Kode_5
- 6. Korzystając z polecania time sprawdź wydajność dowolnej implementacji algorytmu łamania haseł metodą brutalnej siły i oszacuj czas maksymalny czas potrzebny do złamania haseł różnej długości i składający się z małych liter i dużych liter. Kode_6
- 7. Napisz program zgadujący hasła ukryte za pomocą funkcji crypt(), przechowywane w bazie programu htpasswd. Przyjmij założenie, że hasła są trzy znakowe i składają się z samych małych liter. Kode_7
- 8. Przygotuj dwa dokumenty, których funkcje skrótu trivial_hash() bedą identyczne, a treść różna. Wykorzystaj paradoks urodzinowy. Kode_8
- 9. Napisz program szukający kolizji z określoną wartością funkcji skrótu trivial_hash() poprzez modyfikacje ‘białych’ znaków.Kode_9
- Hasła dla Google: brute force attack, cryptographic hash function, htpasswd, md5sum, crypt function, unix password
Poznanie problemów związanych z implementacją równoległą algorytmów blokowego szyfrowania, a także wyznaczania sum kontrolnych dla kryptogramów.
Informacja o zadań składających się z projektu.
- 1. Napisz program odszyfrowujący równolegle w trybie
CBC
. Kode_1 - 2. Porównaj szybkość szyfrowania
AES.MODE_ECB
w wersji szeregowej i równoległej. Kode_2 - 3. Napisz program szyfrujący w trybie
CTR
- równolegle. Kode_3 - 4. Korzystając ze słownika w pliku dict.txt znajdź poprawną kombinację klucza i "soli" (nonce), która pozwoli na poprawne odszyfrowanie kryptogramu (dict['ciphertext]). Kryptogram został zaszyfrowany w trybie AES.MODE_CCM analogicznie do przykładu z pliku CCMexample.py (należy zainstalować wcześniej Cryptodome: pip3 install pycryptodomex). Kode_4
Zapoznanie się z algortmem szyfrowania asymetrycznego na przykładzie RSA.
Uruchom Server:
1.sudo chmod 755 start.sh
start.sh
2../start.sh
- 0.1 Wyślij zaszyfrowaną wiadomość do użytkownika deadbeef korzystając z jego klucza w aplikacji serwerowej.kode_0.1
- 0.2 Prześlij bezpiecznie wiadomość poprzez aplikację (wymaga zaangażowania dwóch studentów, gdzie tylko jeden z nich może odszyfrować wiadomość zaadresowaną do niego) user1kode_0.2.0 user2kode_0.2.1
Informacja o zadań składających się z projektu.
- 1. Napisz funkcje, która będzie przekształcać tekst w wektor liczb o określonej długości. Określ ilość znaków, którą chcesz kodować jednocześnie. Kode_1
- 2. Napisz funkcje odwrotną, czyli przekształcającą wektor liczb w tekst. Kode_2
- 3. Zaimplementuj prosty test pierwszości dla liczby (np. sito Erastotenesa, test Fermata). Kode_3_Sito Kode_3_Fermat
- 4. Zaimplementuj algorytm Euklidesa do sprawdzenia największego wspólnego dzielnika. Kode_4
- 5. Napisz funkcję wykorzystającą algorytm Euklidesa do sprawdzenia czy liczby są względnie pierwsze. Kode_5
- 6. Napisz funkcję wykorzystającą algorytm Euklidesa do obliczenia liczby odwrotnej modulo. tutorial Kode_6
- 7. Zaimplementuj algorytm szybkiego potęgowania w artmetyce modularnej.Kode_7
- 8. Napisz pełny program generujący klucze RSA.
- 9. Napisz program realizujący szyfrowanie RSA.
- 10. Napisz program korzystający z PyCrypto do szyfrowania plików. Zaproponuj metodę ochrony klucza prywatnego. Kode_10
- 1. Przeprowadź atak na program login, tak aby hasło zostało uznane za poprawne bez jego podawania.
- 2. Zmodyfikuj program login, tak aby nie był możliwy atak przez przepełnienie bufora. (Zaproponuj 2 różne modyfikacje.)
- 3. Przeprowadź dwa ataki na program pin, demonstrujące, że nie trzeba znać tajnego pinu, żeby pozytywnie przejść weryfikację.
- 4. Zaproponuj dwie poprawione wersję programu pin, odporne na błąd typów zmiennych.
- 5. Wykorzystując błąd w programie vuln uzyskaj dostęp do linii poleceń.
- 6. Zabezpiecz program vuln przed atakiem polegającym na przepełnieniu bufora. Zaproponuj dwa różne rozwiązania.
- 7. Przeprowadź atak na program o buforze o innej długośći niż 500 bajtów (np. 600, 700).
Patrz do folderu Etap_7
Patrz do folderu Etap_8
Patrz do folderu Etap_9
Patrz do folderu. Etap_10