Cryptopals zestaw 3 ćwiczenie 22

przez | 28 września 2020

W poprzednim ćwiczeniu zaimplementowaliśmy algorytm do generowania liczb pseudolosowych. Teraz skupimy się na słabych punktach stosowania takiego rozwiązania. Na początek spróbujemy na podstawie wygenerowanej liczby odzyskać „ziarno” (albo inaczej po angielsku „seed”), czyli wartość, która została użyta do ustawienia stanu początkowego naszego generatora.

Scenariusz w tym ćwiczeniu jest następujący:
1. Czekamy losową ilość sekund.
2. Jako ziarna używamy aktualnego czasu UNIXowego (W Pythonie: datetime.now().timestamp()).
3. Czekamy losową ilość sekund.
4. Generujemy pierwszą pseudolosową liczbę.
5. Odzyskujemy wartość użytą jako ziarno.

Twórcy piszą, że zamiast czekać przez losową ilość sekund możemy zasymulować upływ czasu – w punkcie 2. do aktualnego czasu musimy dodać losową wartość, ja w swoim rozwiązaniu czekam.

Rozwiązanie okazuje się banalne, wystarczy zastosować tzw. „brute force” czyli pobrać aktualny czas i odejmować od niego kolejne wartości od 0 w górę i używać ich jako ziarna dla drugiego pomocniczego generatora i pobierać z niego pierwszą pseudolosową liczbę do momentu aż będzie ona równa liczbie uzyskanej w punkcie 4. Moja implementacja poniżej:

def s3challenge22():
    print("Challenge 22")
    sleep(randint(1, 40))
    print("First rand sleep finished")
    orig_randgen = mtrng.MTRng(int(datetime.now().timestamp()))
    sleep(randint(1, 40))
    print("Second rand sleep finished")
    first_rand = orig_randgen.extractNumber()
    current_time = int(datetime.now().timestamp())
    for i in range(200):
        clone_randgen = mtrng.MTRng(current_time-i)
        tmp_rand = clone_randgen.extractNumber()
        if tmp_rand == first_rand:
            print("Original seed was: ", (current_time-i))
            return
    print("Could not find original seed")

Jak widać rozwiązanie bardzo proste i jeżeli ktoś zaczyna swoją przygodę z CTF (np. https://247ctf.com/) to na pewno taka wiedza mu się przyda.

Kod tradycyjnie dostępny jest na gitlabie: https://gitlab.com/akoltys/cryptopals .

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *